{"version":3,"file":"echarts-en.js","sources":["../src/config.js","../../zrender/src/core/guid.js","../../zrender/src/core/env.js","../../zrender/src/core/util.js","../../zrender/src/core/vector.js","../../zrender/src/mixin/Draggable.js","../../zrender/src/mixin/Eventful.js","../../zrender/src/core/fourPointsTransform.js","../../zrender/src/core/event.js","../../zrender/src/core/GestureMgr.js","../../zrender/src/Handler.js","../../zrender/src/core/matrix.js","../../zrender/src/mixin/Transformable.js","../../zrender/src/animation/easing.js","../../zrender/src/animation/Clip.js","../../zrender/src/core/LRU.js","../../zrender/src/tool/color.js","../../zrender/src/animation/Animator.js","../../zrender/src/config.js","../../zrender/src/core/log.js","../../zrender/src/mixin/Animatable.js","../../zrender/src/Element.js","../../zrender/src/core/BoundingRect.js","../../zrender/src/container/Group.js","../../zrender/src/core/timsort.js","../../zrender/src/Storage.js","../../zrender/src/graphic/helper/fixShadow.js","../../zrender/src/graphic/constant.js","../../zrender/src/graphic/Style.js","../../zrender/src/graphic/Pattern.js","../../zrender/src/Layer.js","../../zrender/src/animation/requestAnimationFrame.js","../../zrender/src/graphic/helper/image.js","../../zrender/src/contain/text.js","../../zrender/src/graphic/helper/roundRect.js","../../zrender/src/graphic/helper/text.js","../../zrender/src/graphic/mixin/RectText.js","../../zrender/src/graphic/Displayable.js","../../zrender/src/graphic/Image.js","../../zrender/src/Painter.js","../../zrender/src/animation/Animation.js","../../zrender/src/dom/HandlerProxy.js","../../zrender/src/zrender.js","../src/util/model.js","../src/util/clazz.js","../src/model/mixin/makeStyleMapper.js","../src/model/mixin/lineStyle.js","../src/model/mixin/areaStyle.js","../../zrender/src/core/curve.js","../../zrender/src/core/bbox.js","../../zrender/src/core/PathProxy.js","../../zrender/src/contain/line.js","../../zrender/src/contain/cubic.js","../../zrender/src/contain/quadratic.js","../../zrender/src/contain/util.js","../../zrender/src/contain/arc.js","../../zrender/src/contain/windingLine.js","../../zrender/src/contain/path.js","../../zrender/src/graphic/Path.js","../../zrender/src/tool/transformPath.js","../../zrender/src/tool/path.js","../../zrender/src/graphic/Text.js","../../zrender/src/graphic/shape/Circle.js","../../zrender/src/graphic/helper/fixClipWithShadow.js","../../zrender/src/graphic/shape/Sector.js","../../zrender/src/graphic/shape/Ring.js","../../zrender/src/graphic/helper/smoothSpline.js","../../zrender/src/graphic/helper/smoothBezier.js","../../zrender/src/graphic/helper/poly.js","../../zrender/src/graphic/shape/Polygon.js","../../zrender/src/graphic/shape/Polyline.js","../../zrender/src/graphic/helper/subPixelOptimize.js","../../zrender/src/graphic/shape/Rect.js","../../zrender/src/graphic/shape/Line.js","../../zrender/src/graphic/shape/BezierCurve.js","../../zrender/src/graphic/shape/Arc.js","../../zrender/src/graphic/CompoundPath.js","../../zrender/src/graphic/Gradient.js","../../zrender/src/graphic/LinearGradient.js","../../zrender/src/graphic/RadialGradient.js","../../zrender/src/graphic/IncrementalDisplayable.js","../src/util/graphic.js","../src/model/mixin/textStyle.js","../src/model/mixin/itemStyle.js","../src/model/Model.js","../src/util/component.js","../src/util/number.js","../src/util/format.js","../src/util/layout.js","../src/model/mixin/boxLayout.js","../src/model/Component.js","../src/model/globalDefault.js","../src/model/mixin/colorPalette.js","../src/model/referHelper.js","../src/data/helper/sourceType.js","../src/data/Source.js","../src/data/helper/sourceHelper.js","../src/model/Global.js","../src/ExtensionAPI.js","../src/CoordinateSystem.js","../src/model/OptionManager.js","../src/preprocessor/helper/compatStyle.js","../src/preprocessor/backwardCompat.js","../src/processor/dataStack.js","../src/data/helper/dataProvider.js","../src/model/mixin/dataFormat.js","../src/stream/task.js","../src/model/Series.js","../src/view/Component.js","../src/chart/helper/createRenderPlanner.js","../src/view/Chart.js","../src/util/throttle.js","../src/visual/seriesColor.js","../src/lang.js","../src/visual/aria.js","../src/loading/default.js","../src/stream/Scheduler.js","../src/theme/light.js","../src/theme/dark.js","../src/component/dataset.js","../../zrender/src/graphic/shape/Ellipse.js","../../zrender/src/tool/parseSVG.js","../src/coord/geo/mapDataStorage.js","../src/echarts.js","../src/data/DataDiffer.js","../src/data/helper/dimensionHelper.js","../src/data/List.js","../src/data/helper/completeDimensions.js","../src/data/helper/createDimensions.js","../src/data/helper/dataStackHelper.js","../src/chart/helper/createListFromArray.js","../src/scale/Scale.js","../src/data/OrdinalMeta.js","../src/scale/Ordinal.js","../src/scale/helper.js","../src/scale/Interval.js","../src/layout/barGrid.js","../src/scale/Time.js","../src/scale/Log.js","../src/coord/axisHelper.js","../src/coord/axisModelCommonMixin.js","../src/util/symbol.js","../src/helper.js","../../zrender/src/contain/polygon.js","../src/coord/geo/Region.js","../src/coord/geo/parseGeoJson.js","../src/coord/axisTickLabelBuilder.js","../src/coord/Axis.js","../src/export.js","../src/chart/line/LineSeries.js","../src/chart/helper/labelHelper.js","../src/chart/helper/Symbol.js","../src/chart/helper/SymbolDraw.js","../src/chart/line/helper.js","../src/chart/line/lineAnimationDiff.js","../src/chart/line/poly.js","../src/chart/line/LineView.js","../src/visual/symbol.js","../src/layout/points.js","../src/processor/dataSample.js","../src/coord/cartesian/Cartesian.js","../src/coord/cartesian/Cartesian2D.js","../src/coord/cartesian/Axis2D.js","../src/coord/axisDefault.js","../src/coord/axisModelCreator.js","../src/coord/cartesian/AxisModel.js","../src/coord/cartesian/GridModel.js","../src/coord/cartesian/Grid.js","../src/component/axis/AxisBuilder.js","../src/component/axisPointer/modelHelper.js","../src/component/axis/AxisView.js","../src/coord/cartesian/cartesianAxisHelper.js","../src/component/axis/CartesianAxisView.js","../src/component/axis.js","../src/component/gridSimple.js","../src/chart/line.js","../src/chart/bar/BaseBarSeries.js","../src/chart/bar/BarSeries.js","../src/chart/bar/helper.js","../src/chart/bar/barItemStyle.js","../src/chart/bar/BarView.js","../src/chart/bar.js","../src/chart/helper/createListSimply.js","../src/component/helper/selectableMixin.js","../src/chart/pie/PieSeries.js","../src/chart/pie/PieView.js","../src/action/createDataSelectAction.js","../src/visual/dataColor.js","../src/chart/pie/labelLayout.js","../src/chart/pie/pieLayout.js","../src/processor/dataFilter.js","../src/chart/pie.js","../src/chart/scatter/ScatterSeries.js","../src/chart/helper/LargeSymbolDraw.js","../src/chart/scatter/ScatterView.js","../src/chart/scatter.js","../src/coord/radar/IndicatorAxis.js","../src/coord/radar/Radar.js","../src/coord/radar/RadarModel.js","../src/component/radar/RadarView.js","../src/component/radar.js","../src/chart/radar/RadarSeries.js","../src/chart/radar/RadarView.js","../src/chart/radar/radarLayout.js","../src/chart/radar/backwardCompat.js","../src/chart/radar.js","../src/coord/geo/fix/nanhai.js","../src/coord/geo/fix/textCoord.js","../src/coord/geo/fix/geoCoord.js","../src/coord/geo/fix/diaoyuIsland.js","../src/coord/geo/geoJSONLoader.js","../src/coord/geo/geoSVGLoader.js","../src/coord/geo/geoSourceManager.js","../src/chart/map/MapSeries.js","../src/component/helper/interactionMutex.js","../src/component/helper/RoamController.js","../src/component/helper/roamHelper.js","../src/component/helper/cursorHelper.js","../src/component/helper/MapDraw.js","../src/chart/map/MapView.js","../src/action/roamHelper.js","../src/action/geoRoam.js","../src/coord/View.js","../src/coord/geo/Geo.js","../src/coord/geo/geoCreator.js","../src/chart/map/mapSymbolLayout.js","../src/chart/map/mapVisual.js","../src/chart/map/mapDataStatistic.js","../src/chart/map/backwardCompat.js","../src/chart/map.js","../src/data/helper/linkList.js","../src/data/Tree.js","../src/chart/tree/TreeSeries.js","../src/chart/tree/layoutHelper.js","../src/chart/tree/TreeView.js","../src/chart/tree/treeAction.js","../src/chart/tree/traversalHelper.js","../src/chart/tree/treeLayout.js","../src/chart/tree.js","../src/chart/helper/treeHelper.js","../src/chart/treemap/TreemapSeries.js","../src/chart/treemap/Breadcrumb.js","../src/util/animation.js","../src/chart/treemap/TreemapView.js","../src/chart/treemap/treemapAction.js","../src/visual/VisualMapping.js","../src/chart/treemap/treemapVisual.js","../src/chart/treemap/treemapLayout.js","../src/chart/treemap.js","../src/data/Graph.js","../src/chart/helper/createGraphFromNodeEdge.js","../src/chart/graph/GraphSeries.js","../src/chart/helper/LinePath.js","../src/chart/helper/Line.js","../src/chart/helper/LineDraw.js","../src/chart/graph/graphHelper.js","../src/chart/graph/adjustEdge.js","../src/chart/graph/GraphView.js","../src/chart/helper/focusNodeAdjacencyAction.js","../src/chart/graph/graphAction.js","../src/chart/graph/categoryFilter.js","../src/chart/graph/categoryVisual.js","../src/chart/graph/edgeVisual.js","../src/chart/graph/simpleLayoutHelper.js","../src/chart/graph/simpleLayout.js","../src/chart/graph/circularLayoutHelper.js","../src/chart/graph/circularLayout.js","../src/chart/graph/forceHelper.js","../src/chart/graph/forceLayout.js","../src/chart/graph/createView.js","../src/chart/graph.js","../src/chart/gauge/GaugeSeries.js","../src/chart/gauge/PointerPath.js","../src/chart/gauge/GaugeView.js","../src/chart/gauge.js","../src/chart/funnel/FunnelSeries.js","../src/chart/funnel/FunnelView.js","../src/chart/funnel/funnelLayout.js","../src/chart/funnel.js","../src/coord/parallel/parallelPreprocessor.js","../src/coord/parallel/ParallelAxis.js","../src/component/helper/sliderMove.js","../src/coord/parallel/Parallel.js","../src/coord/parallel/parallelCreator.js","../src/coord/parallel/AxisModel.js","../src/coord/parallel/ParallelModel.js","../src/component/axis/parallelAxisAction.js","../src/component/helper/BrushController.js","../src/component/helper/brushHelper.js","../src/component/axis/ParallelAxisView.js","../src/component/parallelAxis.js","../src/component/parallel.js","../src/chart/parallel/ParallelSeries.js","../src/chart/parallel/ParallelView.js","../src/chart/parallel/parallelVisual.js","../src/chart/parallel.js","../src/chart/sankey/SankeySeries.js","../src/chart/sankey/SankeyView.js","../src/chart/sankey/sankeyAction.js","../src/chart/sankey/sankeyLayout.js","../src/chart/sankey/sankeyVisual.js","../src/chart/sankey.js","../src/chart/helper/whiskerBoxCommon.js","../src/chart/boxplot/BoxplotSeries.js","../src/chart/boxplot/BoxplotView.js","../src/chart/boxplot/boxplotVisual.js","../src/chart/boxplot/boxplotLayout.js","../src/chart/boxplot.js","../src/chart/candlestick/CandlestickSeries.js","../src/chart/candlestick/CandlestickView.js","../src/chart/candlestick/preprocessor.js","../src/chart/candlestick/candlestickVisual.js","../src/chart/candlestick/candlestickLayout.js","../src/chart/candlestick.js","../src/chart/effectScatter/EffectScatterSeries.js","../src/chart/helper/EffectSymbol.js","../src/chart/effectScatter/EffectScatterView.js","../src/chart/effectScatter.js","../src/chart/lines/LinesSeries.js","../src/chart/helper/EffectLine.js","../src/chart/helper/Polyline.js","../src/chart/helper/EffectPolyline.js","../src/chart/helper/LargeLineDraw.js","../src/chart/lines/linesLayout.js","../src/chart/lines/LinesView.js","../src/chart/lines/linesVisual.js","../src/chart/lines.js","../src/chart/heatmap/HeatmapSeries.js","../src/chart/heatmap/HeatmapLayer.js","../src/chart/heatmap/HeatmapView.js","../src/chart/heatmap.js","../src/chart/bar/PictorialBarSeries.js","../src/chart/bar/PictorialBarView.js","../src/chart/pictorialBar.js","../src/coord/single/SingleAxis.js","../src/coord/single/Single.js","../src/coord/single/singleCreator.js","../src/coord/single/singleAxisHelper.js","../src/component/axis/SingleAxisView.js","../src/coord/single/AxisModel.js","../src/component/axisPointer/findPointFromSeries.js","../src/component/axisPointer/axisTrigger.js","../src/component/axisPointer/AxisPointerModel.js","../src/component/axisPointer/globalListener.js","../src/component/axisPointer/AxisPointerView.js","../src/component/axisPointer/BaseAxisPointer.js","../src/component/axisPointer/viewHelper.js","../src/component/axisPointer/CartesianAxisPointer.js","../src/component/axisPointer.js","../src/component/axisPointer/SingleAxisPointer.js","../src/component/singleAxis.js","../src/chart/themeRiver/ThemeRiverSeries.js","../src/chart/themeRiver/ThemeRiverView.js","../src/chart/themeRiver/themeRiverLayout.js","../src/chart/themeRiver/themeRiverVisual.js","../src/chart/themeRiver.js","../src/chart/sunburst/SunburstSeries.js","../src/chart/sunburst/SunburstPiece.js","../src/chart/sunburst/SunburstView.js","../src/chart/sunburst/sunburstAction.js","../src/chart/sunburst/sunburstLayout.js","../src/chart/sunburst.js","../src/coord/cartesian/prepareCustom.js","../src/coord/geo/prepareCustom.js","../src/coord/single/prepareCustom.js","../src/coord/polar/prepareCustom.js","../src/coord/calendar/prepareCustom.js","../src/chart/custom.js","../src/component/grid.js","../src/layout/barPolar.js","../src/coord/polar/RadiusAxis.js","../src/coord/polar/AngleAxis.js","../src/coord/polar/Polar.js","../src/coord/polar/AxisModel.js","../src/coord/polar/PolarModel.js","../src/coord/polar/polarCreator.js","../src/component/axis/AngleAxisView.js","../src/component/angleAxis.js","../src/component/axis/RadiusAxisView.js","../src/component/radiusAxis.js","../src/component/axisPointer/PolarAxisPointer.js","../src/component/polar.js","../src/coord/geo/GeoModel.js","../src/component/geo/GeoView.js","../src/component/geo.js","../src/coord/calendar/Calendar.js","../src/coord/calendar/CalendarModel.js","../src/component/calendar/CalendarView.js","../src/component/calendar.js","../src/component/graphic.js","../src/component/toolbox/featureManager.js","../src/component/toolbox/ToolboxModel.js","../src/component/helper/listComponent.js","../src/component/toolbox/ToolboxView.js","../src/component/toolbox/feature/SaveAsImage.js","../src/component/toolbox/feature/MagicType.js","../src/component/toolbox/feature/DataView.js","../src/component/helper/BrushTargetManager.js","../src/component/dataZoom/history.js","../src/component/dataZoom/typeDefaulter.js","../src/component/dataZoom/helper.js","../src/component/dataZoom/AxisProxy.js","../src/component/dataZoom/DataZoomModel.js","../src/component/dataZoom/DataZoomView.js","../src/component/dataZoom/SelectZoomModel.js","../src/component/dataZoom/SelectZoomView.js","../src/component/dataZoom/dataZoomProcessor.js","../src/component/dataZoom/dataZoomAction.js","../src/component/dataZoomSelect.js","../src/component/toolbox/feature/DataZoom.js","../src/component/toolbox/feature/Restore.js","../src/component/toolbox.js","../src/component/tooltip/TooltipModel.js","../src/component/tooltip/TooltipContent.js","../src/component/tooltip/TooltipRichContent.js","../src/component/tooltip/TooltipView.js","../src/component/tooltip.js","../src/component/brush/preprocessor.js","../src/visual/visualSolution.js","../src/component/brush/selector.js","../src/component/brush/visualEncoding.js","../src/component/brush/BrushModel.js","../src/component/brush/BrushView.js","../src/component/brush/brushAction.js","../src/component/toolbox/feature/Brush.js","../src/component/brush.js","../src/component/title.js","../src/component/timeline/preprocessor.js","../src/component/timeline/typeDefaulter.js","../src/component/timeline/timelineAction.js","../src/component/timeline/TimelineModel.js","../src/component/timeline/SliderTimelineModel.js","../src/component/timeline/TimelineView.js","../src/component/timeline/TimelineAxis.js","../src/component/timeline/SliderTimelineView.js","../src/component/timeline.js","../src/component/marker/MarkerModel.js","../src/component/marker/MarkPointModel.js","../src/component/marker/markerHelper.js","../src/component/marker/MarkerView.js","../src/component/marker/MarkPointView.js","../src/component/markPoint.js","../src/component/marker/MarkLineModel.js","../src/component/marker/MarkLineView.js","../src/component/markLine.js","../src/component/marker/MarkAreaModel.js","../src/component/marker/MarkAreaView.js","../src/component/markArea.js","../src/component/legend/LegendModel.js","../src/component/legend/legendAction.js","../src/component/legend/LegendView.js","../src/component/legend/legendFilter.js","../src/component/legend.js","../src/component/legend/ScrollableLegendModel.js","../src/component/legend/ScrollableLegendView.js","../src/component/legend/scrollableLegendAction.js","../src/component/legendScroll.js","../src/component/dataZoom/SliderZoomModel.js","../src/component/dataZoom/SliderZoomView.js","../src/component/dataZoomSlider.js","../src/component/dataZoom/InsideZoomModel.js","../src/component/dataZoom/roams.js","../src/component/dataZoom/InsideZoomView.js","../src/component/dataZoomInside.js","../src/component/dataZoom.js","../src/component/visualMap/preprocessor.js","../src/component/visualMap/typeDefaulter.js","../src/component/visualMap/visualEncoding.js","../src/visual/visualDefault.js","../src/component/visualMap/VisualMapModel.js","../src/component/visualMap/ContinuousModel.js","../src/component/visualMap/VisualMapView.js","../src/component/visualMap/helper.js","../src/component/visualMap/ContinuousView.js","../src/component/visualMap/visualMapAction.js","../src/component/visualMapContinuous.js","../src/component/visualMap/PiecewiseModel.js","../src/component/visualMap/PiecewiseView.js","../src/component/visualMapPiecewise.js","../src/component/visualMap.js","../../zrender/src/vml/core.js","../../zrender/src/vml/graphic.js","../../zrender/src/vml/Painter.js","../../zrender/src/vml/vml.js","../../zrender/src/svg/core.js","../../zrender/src/svg/graphic.js","../../zrender/src/core/arrayDiff2.js","../../zrender/src/svg/helper/Definable.js","../../zrender/src/svg/helper/GradientManager.js","../../zrender/src/svg/helper/ClippathManager.js","../../zrender/src/svg/helper/ShadowManager.js","../../zrender/src/svg/Painter.js","../../zrender/src/svg/svg.js","../echarts.all.js"],"sourcesContent":["/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// (1) The code `if (__DEV__) ...` can be removed by build tool.\n// (2) If intend to use `__DEV__`, this module should be imported. Use a global\n// variable `__DEV__` may cause that miss the declaration (see #6535), or the\n// declaration is behind of the using position (for example in `Model.extent`,\n// And tools like rollup can not analysis the dependency if not import).\n\nvar dev;\n\n// In browser\nif (typeof window !== 'undefined') {\n    dev = window.__DEV__;\n}\n// In node\nelse if (typeof global !== 'undefined') {\n    dev = global.__DEV__;\n}\n\nif (typeof dev === 'undefined') {\n    dev = true;\n}\n\nexport var __DEV__ = dev;\n","/**\n * zrender: 生成唯一id\n *\n * @author errorrik (errorrik@gmail.com)\n */\n\nvar idStart = 0x0907;\n\nexport default function () {\n    return idStart++;\n}","/**\n * echarts设备环境识别\n *\n * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。\n * @author firede[firede@firede.us]\n * @desc thanks zepto.\n */\n\nvar env = {};\n\nif (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {\n    // In Weixin Application\n    env = {\n        browser: {},\n        os: {},\n        node: false,\n        wxa: true, // Weixin Application\n        canvasSupported: true,\n        svgSupported: false,\n        touchEventsSupported: true,\n        domSupported: false\n    };\n}\nelse if (typeof document === 'undefined' && typeof self !== 'undefined') {\n    // In worker\n    env = {\n        browser: {},\n        os: {},\n        node: false,\n        worker: true,\n        canvasSupported: true,\n        domSupported: false\n    };\n}\nelse if (typeof navigator === 'undefined') {\n    // In node\n    env = {\n        browser: {},\n        os: {},\n        node: true,\n        worker: false,\n        // Assume canvas is supported\n        canvasSupported: true,\n        svgSupported: true,\n        domSupported: false\n    };\n}\nelse {\n    env = detect(navigator.userAgent);\n}\n\nexport default env;\n\n// Zepto.js\n// (c) 2010-2013 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\nfunction detect(ua) {\n    var os = {};\n    var browser = {};\n    // var webkit = ua.match(/Web[kK]it[\\/]{0,1}([\\d.]+)/);\n    // var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n    // var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n    // var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n    // var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n    // var webos = ua.match(/(webOS|hpwOS)[\\s\\/]([\\d.]+)/);\n    // var touchpad = webos && ua.match(/TouchPad/);\n    // var kindle = ua.match(/Kindle\\/([\\d.]+)/);\n    // var silk = ua.match(/Silk\\/([\\d._]+)/);\n    // var blackberry = ua.match(/(BlackBerry).*Version\\/([\\d.]+)/);\n    // var bb10 = ua.match(/(BB10).*Version\\/([\\d.]+)/);\n    // var rimtabletos = ua.match(/(RIM\\sTablet\\sOS)\\s([\\d.]+)/);\n    // var playbook = ua.match(/PlayBook/);\n    // var chrome = ua.match(/Chrome\\/([\\d.]+)/) || ua.match(/CriOS\\/([\\d.]+)/);\n    var firefox = ua.match(/Firefox\\/([\\d.]+)/);\n    // var safari = webkit && ua.match(/Mobile\\//) && !chrome;\n    // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome;\n    var ie = ua.match(/MSIE\\s([\\d.]+)/)\n        // IE 11 Trident/7.0; rv:11.0\n        || ua.match(/Trident\\/.+?rv:(([\\d.]+))/);\n    var edge = ua.match(/Edge\\/([\\d.]+)/); // IE 12 and 12+\n\n    var weChat = (/micromessenger/i).test(ua);\n\n    // Todo: clean this up with a better OS/browser seperation:\n    // - discern (more) between multiple browsers on android\n    // - decide if kindle fire in silk mode is android or not\n    // - Firefox on Android doesn't specify the Android version\n    // - possibly devide in os, device and browser hashes\n\n    // if (browser.webkit = !!webkit) browser.version = webkit[1];\n\n    // if (android) os.android = true, os.version = android[2];\n    // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');\n    // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');\n    // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n    // if (webos) os.webos = true, os.version = webos[2];\n    // if (touchpad) os.touchpad = true;\n    // if (blackberry) os.blackberry = true, os.version = blackberry[2];\n    // if (bb10) os.bb10 = true, os.version = bb10[2];\n    // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2];\n    // if (playbook) browser.playbook = true;\n    // if (kindle) os.kindle = true, os.version = kindle[1];\n    // if (silk) browser.silk = true, browser.version = silk[1];\n    // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true;\n    // if (chrome) browser.chrome = true, browser.version = chrome[1];\n    if (firefox) {\n        browser.firefox = true;\n        browser.version = firefox[1];\n    }\n    // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true;\n    // if (webview) browser.webview = true;\n\n    if (ie) {\n        browser.ie = true;\n        browser.version = ie[1];\n    }\n\n    if (edge) {\n        browser.edge = true;\n        browser.version = edge[1];\n    }\n\n    // It is difficult to detect WeChat in Win Phone precisely, because ua can\n    // not be set on win phone. So we do not consider Win Phone.\n    if (weChat) {\n        browser.weChat = true;\n    }\n\n    // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) ||\n    //     (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/)));\n    // os.phone  = !!(!os.tablet && !os.ipod && (android || iphone || webos ||\n    //     (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\\/([\\d.]+)/)) ||\n    //     (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/))));\n\n    return {\n        browser: browser,\n        os: os,\n        node: false,\n        // 原生canvas支持，改极端点了\n        // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9)\n        canvasSupported: !!document.createElement('canvas').getContext,\n        svgSupported: typeof SVGRect !== 'undefined',\n        // works on most browsers\n        // IE10/11 does not support touch event, and MS Edge supports them but not by\n        // default, so we dont check navigator.maxTouchPoints for them here.\n        touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge,\n        // <http://caniuse.com/#search=pointer%20event>.\n        pointerEventsSupported: 'onpointerdown' in window\n            // Firefox supports pointer but not by default, only MS browsers are reliable on pointer\n            // events currently. So we dont use that on other browsers unless tested sufficiently.\n            // Although IE 10 supports pointer event, it use old style and is different from the\n            // standard. So we exclude that. (IE 10 is hardly used on touch device)\n            && (browser.edge || (browser.ie && browser.version >= 11)),\n        // passiveSupported: detectPassiveSupport()\n        domSupported: typeof document !== 'undefined'\n    };\n}\n\n// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n// function detectPassiveSupport() {\n//     // Test via a getter in the options object to see if the passive property is accessed\n//     var supportsPassive = false;\n//     try {\n//         var opts = Object.defineProperty({}, 'passive', {\n//             get: function() {\n//                 supportsPassive = true;\n//             }\n//         });\n//         window.addEventListener('testPassive', function() {}, opts);\n//     } catch (e) {\n//     }\n//     return supportsPassive;\n// }\n","/**\n * @module zrender/core/util\n */\n\n// 用于处理merge时无法遍历Date等对象的问题\nvar BUILTIN_OBJECT = {\n    '[object Function]': 1,\n    '[object RegExp]': 1,\n    '[object Date]': 1,\n    '[object Error]': 1,\n    '[object CanvasGradient]': 1,\n    '[object CanvasPattern]': 1,\n    // For node-canvas\n    '[object Image]': 1,\n    '[object Canvas]': 1\n};\n\nvar TYPED_ARRAY = {\n    '[object Int8Array]': 1,\n    '[object Uint8Array]': 1,\n    '[object Uint8ClampedArray]': 1,\n    '[object Int16Array]': 1,\n    '[object Uint16Array]': 1,\n    '[object Int32Array]': 1,\n    '[object Uint32Array]': 1,\n    '[object Float32Array]': 1,\n    '[object Float64Array]': 1\n};\n\nvar objToString = Object.prototype.toString;\n\nvar arrayProto = Array.prototype;\nvar nativeForEach = arrayProto.forEach;\nvar nativeFilter = arrayProto.filter;\nvar nativeSlice = arrayProto.slice;\nvar nativeMap = arrayProto.map;\nvar nativeReduce = arrayProto.reduce;\n\n// Avoid assign to an exported variable, for transforming to cjs.\nvar methods = {};\n\nexport function $override(name, fn) {\n    // Clear ctx instance for different environment\n    if (name === 'createCanvas') {\n        _ctx = null;\n    }\n\n    methods[name] = fn;\n}\n\n/**\n * Those data types can be cloned:\n *     Plain object, Array, TypedArray, number, string, null, undefined.\n * Those data types will be assgined using the orginal data:\n *     BUILTIN_OBJECT\n * Instance of user defined class will be cloned to a plain object, without\n * properties in prototype.\n * Other data types is not supported (not sure what will happen).\n *\n * Caution: do not support clone Date, for performance consideration.\n * (There might be a large number of date in `series.data`).\n * So date should not be modified in and out of echarts.\n *\n * @param {*} source\n * @return {*} new\n */\nexport function clone(source) {\n    if (source == null || typeof source !== 'object') {\n        return source;\n    }\n\n    var result = source;\n    var typeStr = objToString.call(source);\n\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 (source.constructor.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] = clone(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)) {\n                result[key] = clone(source[key]);\n            }\n        }\n    }\n\n    return result;\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overwrite=false]\n */\nexport function merge(target, source, overwrite) {\n    // We should escapse that source is string\n    // and enter for ... in ...\n    if (!isObject(source) || !isObject(target)) {\n        return overwrite ? clone(source) : target;\n    }\n\n    for (var key in source) {\n        if (source.hasOwnProperty(key)) {\n            var targetProp = target[key];\n            var sourceProp = source[key];\n\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            ) {\n                // 如果需要递归覆盖，就递归调用merge\n                merge(targetProp, sourceProp, overwrite);\n            }\n            else if (overwrite || !(key in target)) {\n                // 否则只处理overwrite为true，或者在目标对象中没有此属性的情况\n                // NOTE，在 target[key] 不存在的时候也是直接覆盖\n                target[key] = clone(source[key], true);\n            }\n        }\n    }\n\n    return target;\n}\n\n/**\n * @param {Array} targetAndSources The first item is target, and the rests are source.\n * @param {boolean} [overwrite=false]\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}\n\n/**\n * @param {*} target\n * @param {*} source\n * @memberOf module:zrender/core/util\n */\nexport function extend(target, source) {\n    for (var key in source) {\n        if (source.hasOwnProperty(key)) {\n            target[key] = source[key];\n        }\n    }\n    return target;\n}\n\n/**\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overlay=false]\n * @memberOf module:zrender/core/util\n */\nexport function defaults(target, source, overlay) {\n    for (var key in source) {\n        if (source.hasOwnProperty(key)\n            && (overlay ? source[key] != null : target[key] == null)\n        ) {\n            target[key] = source[key];\n        }\n    }\n    return target;\n}\n\nexport var createCanvas = function () {\n    return methods.createCanvas();\n};\n\nmethods.createCanvas = function () {\n    return document.createElement('canvas');\n};\n\n// FIXME\nvar _ctx;\n\nexport function getContext() {\n    if (!_ctx) {\n        // Use util.createCanvas instead of createCanvas\n        // because createCanvas may be overwritten in different environment\n        _ctx = createCanvas().getContext('2d');\n    }\n    return _ctx;\n}\n\n/**\n * 查询数组中元素的index\n * @memberOf module:zrender/core/util\n */\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}\n\n/**\n * 构造类继承关系\n *\n * @memberOf module:zrender/core/util\n * @param {Function} clazz 源类\n * @param {Function} baseClazz 基类\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\n    for (var prop in clazzPrototype) {\n        clazz.prototype[prop] = clazzPrototype[prop];\n    }\n    clazz.prototype.constructor = clazz;\n    clazz.superClass = baseClazz;\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {Object|Function} target\n * @param {Object|Function} sorce\n * @param {boolean} overlay\n */\nexport function mixin(target, source, overlay) {\n    target = 'prototype' in target ? target.prototype : target;\n    source = 'prototype' in source ? source.prototype : source;\n\n    defaults(target, source, overlay);\n}\n\n/**\n * Consider typed array.\n * @param {Array|TypedArray} data\n */\nexport function isArrayLike(data) {\n    if (!data) {\n        return;\n    }\n    if (typeof data === 'string') {\n        return false;\n    }\n    return typeof data.length === 'number';\n}\n\n/**\n * 数组或对象遍历\n * @memberOf module:zrender/core/util\n * @param {Object|Array} obj\n * @param {Function} cb\n * @param {*} [context]\n */\nexport function each(obj, cb, context) {\n    if (!(obj && cb)) {\n        return;\n    }\n    if (obj.forEach && obj.forEach === nativeForEach) {\n        obj.forEach(cb, context);\n    }\n    else if (obj.length === +obj.length) {\n        for (var i = 0, len = obj.length; i < len; i++) {\n            cb.call(context, obj[i], i, obj);\n        }\n    }\n    else {\n        for (var key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                cb.call(context, obj[key], key, obj);\n            }\n        }\n    }\n}\n\n/**\n * 数组映射\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\nexport function map(obj, cb, context) {\n    if (!(obj && cb)) {\n        return;\n    }\n    if (obj.map && obj.map === nativeMap) {\n        return obj.map(cb, context);\n    }\n    else {\n        var result = [];\n        for (var i = 0, len = obj.length; i < len; i++) {\n            result.push(cb.call(context, obj[i], i, obj));\n        }\n        return result;\n    }\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {Object} [memo]\n * @param {*} [context]\n * @return {Array}\n */\nexport function reduce(obj, cb, memo, context) {\n    if (!(obj && cb)) {\n        return;\n    }\n    if (obj.reduce && obj.reduce === nativeReduce) {\n        return obj.reduce(cb, memo, context);\n    }\n    else {\n        for (var i = 0, len = obj.length; i < len; i++) {\n            memo = cb.call(context, memo, obj[i], i, obj);\n        }\n        return memo;\n    }\n}\n\n/**\n * 数组过滤\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\nexport function filter(obj, cb, context) {\n    if (!(obj && cb)) {\n        return;\n    }\n    if (obj.filter && obj.filter === nativeFilter) {\n        return obj.filter(cb, context);\n    }\n    else {\n        var result = [];\n        for (var i = 0, len = obj.length; i < len; i++) {\n            if (cb.call(context, obj[i], i, obj)) {\n                result.push(obj[i]);\n            }\n        }\n        return result;\n    }\n}\n\n/**\n * 数组项查找\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {*}\n */\nexport function find(obj, cb, context) {\n    if (!(obj && cb)) {\n        return;\n    }\n    for (var i = 0, len = obj.length; i < len; i++) {\n        if (cb.call(context, obj[i], i, obj)) {\n            return obj[i];\n        }\n    }\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @param {*} context\n * @return {Function}\n */\nexport function bind(func, context) {\n    var args = nativeSlice.call(arguments, 2);\n    return function () {\n        return func.apply(context, args.concat(nativeSlice.call(arguments)));\n    };\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @return {Function}\n */\nexport function curry(func) {\n    var args = nativeSlice.call(arguments, 1);\n    return function () {\n        return func.apply(this, args.concat(nativeSlice.call(arguments)));\n    };\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isArray(value) {\n    return objToString.call(value) === '[object Array]';\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isFunction(value) {\n    return typeof value === 'function';\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isString(value) {\n    return objToString.call(value) === '[object String]';\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isObject(value) {\n    // Avoid a V8 JIT bug in Chrome 19-20.\n    // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n    var type = typeof value;\n    return type === 'function' || (!!value && type === 'object');\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isBuiltInObject(value) {\n    return !!BUILTIN_OBJECT[objToString.call(value)];\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isTypedArray(value) {\n    return !!TYPED_ARRAY[objToString.call(value)];\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\nexport function isDom(value) {\n    return typeof value === 'object'\n        && typeof value.nodeType === 'number'\n        && typeof value.ownerDocument === 'object';\n}\n\n/**\n * Whether is exactly NaN. Notice isNaN('a') returns true.\n * @param {*} value\n * @return {boolean}\n */\nexport function eqNaN(value) {\n    return value !== value;\n}\n\n/**\n * If value1 is not null, then return value1, otherwise judget rest of values.\n * Low performance.\n * @memberOf module:zrender/core/util\n * @return {*} Final value\n */\nexport function retrieve(values) {\n    for (var i = 0, len = arguments.length; i < len; i++) {\n        if (arguments[i] != null) {\n            return arguments[i];\n        }\n    }\n}\n\nexport function retrieve2(value0, value1) {\n    return value0 != null\n        ? value0\n        : value1;\n}\n\nexport function retrieve3(value0, value1, value2) {\n    return value0 != null\n        ? value0\n        : value1 != null\n        ? value1\n        : value2;\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} arr\n * @param {number} startIndex\n * @param {number} endIndex\n * @return {Array}\n */\nexport function slice() {\n    return Function.call.apply(nativeSlice, arguments);\n}\n\n/**\n * Normalize css liked array configuration\n * e.g.\n *  3 => [3, 3, 3, 3]\n *  [4, 2] => [4, 2, 4, 2]\n *  [4, 3, 2] => [4, 3, 2, 3]\n * @param {number|Array.<number>} val\n * @return {Array.<number>}\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        // vertical | horizontal\n        return [val[0], val[1], val[0], val[1]];\n    }\n    else if (len === 3) {\n        // top | horizontal | bottom\n        return [val[0], val[1], val[2], val[1]];\n    }\n    return val;\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {boolean} condition\n * @param {string} message\n */\nexport function assert(condition, message) {\n    if (!condition) {\n        throw new Error(message);\n    }\n}\n\n/**\n * @memberOf module:zrender/core/util\n * @param {string} str string to be trimed\n * @return {string} trimed string\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}\n\nvar primitiveKey = '__ec_primitive__';\n/**\n * Set an object as primitive to be ignored traversing children in clone or merge\n */\nexport function setAsPrimitive(obj) {\n    obj[primitiveKey] = true;\n}\n\nexport function isPrimitive(obj) {\n    return obj[primitiveKey];\n}\n\n/**\n * @constructor\n * @param {Object} obj Only apply `ownProperty`.\n */\nfunction HashMap(obj) {\n    var isArr = isArray(obj);\n    // Key should not be set on this, otherwise\n    // methods get/set/... may be overrided.\n    this.data = {};\n    var thisMap = this;\n\n    (obj instanceof HashMap)\n        ? obj.each(visit)\n        : (obj && each(obj, visit));\n\n    function visit(value, key) {\n        isArr ? thisMap.set(value, key) : thisMap.set(key, value);\n    }\n}\n\nHashMap.prototype = {\n    constructor: HashMap,\n    // Do not provide `has` method to avoid defining what is `has`.\n    // (We usually treat `null` and `undefined` as the same, different\n    // from ES6 Map).\n    get: function (key) {\n        return this.data.hasOwnProperty(key) ? this.data[key] : null;\n    },\n    set: function (key, value) {\n        // Comparing with invocation chaining, `return value` is more commonly\n        // used in this case: `var someVal = map.set('a', genVal());`\n        return (this.data[key] = value);\n    },\n    // Although util.each can be performed on this hashMap directly, user\n    // should not use the exposed keys, who are prefixed.\n    each: function (cb, context) {\n        context !== void 0 && (cb = bind(cb, context));\n        for (var key in this.data) {\n            this.data.hasOwnProperty(key) && cb(this.data[key], key);\n        }\n    },\n    // Do not use this method if performance sensitive.\n    removeKey: function (key) {\n        delete this.data[key];\n    }\n};\n\nexport function createHashMap(obj) {\n    return new HashMap(obj);\n}\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 (i = 0; i < b.length; i++) {\n        newArray[i + offset] = b[i];\n    }\n    return newArray;\n}\n\n\nexport function noop() {}\n","\nvar ArrayCtor = typeof Float32Array === 'undefined'\n    ? Array\n    : Float32Array;\n\n/**\n * 创建一个向量\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @return {Vector2}\n */\nexport function create(x, y) {\n    var out = new ArrayCtor(2);\n    if (x == null) {\n        x = 0;\n    }\n    if (y == null) {\n        y = 0;\n    }\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\n\n/**\n * 复制向量数据\n * @param {Vector2} out\n * @param {Vector2} v\n * @return {Vector2}\n */\nexport function copy(out, v) {\n    out[0] = v[0];\n    out[1] = v[1];\n    return out;\n}\n\n/**\n * 克隆一个向量\n * @param {Vector2} v\n * @return {Vector2}\n */\nexport function clone(v) {\n    var out = new ArrayCtor(2);\n    out[0] = v[0];\n    out[1] = v[1];\n    return out;\n}\n\n/**\n * 设置向量的两个项\n * @param {Vector2} out\n * @param {number} a\n * @param {number} b\n * @return {Vector2} 结果\n */\nexport function set(out, a, b) {\n    out[0] = a;\n    out[1] = b;\n    return out;\n}\n\n/**\n * 向量相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\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}\n\n/**\n * 向量缩放后相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} a\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}\n\n/**\n * 向量相减\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\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}\n\n/**\n * 向量长度\n * @param {Vector2} v\n * @return {number}\n */\nexport function len(v) {\n    return Math.sqrt(lenSquare(v));\n}\nexport var length = len; // jshint ignore:line\n\n/**\n * 向量长度平方\n * @param {Vector2} v\n * @return {number}\n */\nexport function lenSquare(v) {\n    return v[0] * v[0] + v[1] * v[1];\n}\nexport var lengthSquare = lenSquare;\n\n/**\n * 向量乘法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\nexport function mul(out, v1, v2) {\n    out[0] = v1[0] * v2[0];\n    out[1] = v1[1] * v2[1];\n    return out;\n}\n\n/**\n * 向量除法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\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}\n\n/**\n * 向量点乘\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\nexport function dot(v1, v2) {\n    return v1[0] * v2[0] + v1[1] * v2[1];\n}\n\n/**\n * 向量缩放\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {number} s\n */\nexport function scale(out, v, s) {\n    out[0] = v[0] * s;\n    out[1] = v[1] * s;\n    return out;\n}\n\n/**\n * 向量归一化\n * @param {Vector2} out\n * @param {Vector2} v\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}\n\n/**\n * 计算向量间距离\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\nexport function distance(v1, v2) {\n    return Math.sqrt(\n        (v1[0] - v2[0]) * (v1[0] - v2[0])\n        + (v1[1] - v2[1]) * (v1[1] - v2[1])\n    );\n}\nexport var dist = distance;\n\n/**\n * 向量距离平方\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\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;\n\n/**\n * 求负向量\n * @param {Vector2} out\n * @param {Vector2} v\n */\nexport function negate(out, v) {\n    out[0] = -v[0];\n    out[1] = -v[1];\n    return out;\n}\n\n/**\n * 插值两个点\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} t\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}\n\n/**\n * 矩阵左乘向量\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {Vector2} m\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}\n\n/**\n * 求两个向量最小值\n * @param  {Vector2} out\n * @param  {Vector2} v1\n * @param  {Vector2} v2\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}\n\n/**\n * 求两个向量最大值\n * @param  {Vector2} out\n * @param  {Vector2} v1\n * @param  {Vector2} v2\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","// TODO Draggable for group\n// FIXME Draggable on element which has parent rotation or scale\nfunction Draggable() {\n\n    this.on('mousedown', this._dragStart, this);\n    this.on('mousemove', this._drag, this);\n    this.on('mouseup', this._dragEnd, this);\n    this.on('globalout', this._dragEnd, this);\n    // this._dropTarget = null;\n    // this._draggingTarget = null;\n\n    // this._x = 0;\n    // this._y = 0;\n}\n\nDraggable.prototype = {\n\n    constructor: Draggable,\n\n    _dragStart: function (e) {\n        var draggingTarget = e.target;\n        if (draggingTarget && draggingTarget.draggable) {\n            this._draggingTarget = draggingTarget;\n            draggingTarget.dragging = true;\n            this._x = e.offsetX;\n            this._y = e.offsetY;\n\n            this.dispatchToElement(param(draggingTarget, e), 'dragstart', e.event);\n        }\n    },\n\n    _drag: function (e) {\n        var draggingTarget = this._draggingTarget;\n        if (draggingTarget) {\n\n            var x = e.offsetX;\n            var y = e.offsetY;\n\n            var dx = x - this._x;\n            var dy = y - this._y;\n            this._x = x;\n            this._y = y;\n\n            draggingTarget.drift(dx, dy, e);\n            this.dispatchToElement(param(draggingTarget, e), 'drag', e.event);\n\n            var dropTarget = this.findHover(x, y, draggingTarget).target;\n            var lastDropTarget = this._dropTarget;\n            this._dropTarget = dropTarget;\n\n            if (draggingTarget !== dropTarget) {\n                if (lastDropTarget && dropTarget !== lastDropTarget) {\n                    this.dispatchToElement(param(lastDropTarget, e), 'dragleave', e.event);\n                }\n                if (dropTarget && dropTarget !== lastDropTarget) {\n                    this.dispatchToElement(param(dropTarget, e), 'dragenter', e.event);\n                }\n            }\n        }\n    },\n\n    _dragEnd: function (e) {\n        var draggingTarget = this._draggingTarget;\n\n        if (draggingTarget) {\n            draggingTarget.dragging = false;\n        }\n\n        this.dispatchToElement(param(draggingTarget, e), 'dragend', e.event);\n\n        if (this._dropTarget) {\n            this.dispatchToElement(param(this._dropTarget, e), 'drop', e.event);\n        }\n\n        this._draggingTarget = null;\n        this._dropTarget = null;\n    }\n\n};\n\nfunction param(target, e) {\n    return {target: target, topTarget: e && e.topTarget};\n}\n\nexport default Draggable;","/**\n * Event Mixin\n * @module zrender/mixin/Eventful\n * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         pissang (https://www.github.com/pissang)\n */\n\nvar arrySlice = Array.prototype.slice;\n\n/**\n * Event dispatcher.\n *\n * @alias module:zrender/mixin/Eventful\n * @constructor\n * @param {Object} [eventProcessor] The object eventProcessor is the scope when\n *        `eventProcessor.xxx` called.\n * @param {Function} [eventProcessor.normalizeQuery]\n *        param: {string|Object} Raw query.\n *        return: {string|Object} Normalized query.\n * @param {Function} [eventProcessor.filter] Event will be dispatched only\n *        if it returns `true`.\n *        param: {string} eventType\n *        param: {string|Object} query\n *        return: {boolean}\n * @param {Function} [eventProcessor.afterTrigger] Call after all handlers called.\n *        param: {string} eventType\n */\nvar Eventful = function (eventProcessor) {\n    this._$handlers = {};\n    this._$eventProcessor = eventProcessor;\n};\n\nEventful.prototype = {\n\n    constructor: Eventful,\n\n    /**\n     * The handler can only be triggered once, then removed.\n     *\n     * @param {string} event The event name.\n     * @param {string|Object} [query] Condition used on event filter.\n     * @param {Function} handler The event handler.\n     * @param {Object} context\n     */\n    one: function (event, query, handler, context) {\n        return on(this, event, query, handler, context, true);\n    },\n\n    /**\n     * Bind a handler.\n     *\n     * @param {string} event The event name.\n     * @param {string|Object} [query] Condition used on event filter.\n     * @param {Function} handler The event handler.\n     * @param {Object} [context]\n     */\n    on: function (event, query, handler, context) {\n        return on(this, event, query, handler, context, false);\n    },\n\n    /**\n     * Whether any handler has bound.\n     *\n     * @param  {string}  event\n     * @return {boolean}\n     */\n    isSilent: function (event) {\n        var _h = this._$handlers;\n        return !_h[event] || !_h[event].length;\n    },\n\n    /**\n     * Unbind a event.\n     *\n     * @param {string} event The event name.\n     * @param {Function} [handler] The event handler.\n     */\n    off: function (event, handler) {\n        var _h = this._$handlers;\n\n        if (!event) {\n            this._$handlers = {};\n            return this;\n        }\n\n        if (handler) {\n            if (_h[event]) {\n                var newList = [];\n                for (var i = 0, l = _h[event].length; i < l; i++) {\n                    if (_h[event][i].h !== handler) {\n                        newList.push(_h[event][i]);\n                    }\n                }\n                _h[event] = newList;\n            }\n\n            if (_h[event] && _h[event].length === 0) {\n                delete _h[event];\n            }\n        }\n        else {\n            delete _h[event];\n        }\n\n        return this;\n    },\n\n    /**\n     * Dispatch a event.\n     *\n     * @param {string} type The event name.\n     */\n    trigger: function (type) {\n        var _h = this._$handlers[type];\n        var eventProcessor = this._$eventProcessor;\n\n        if (_h) {\n            var args = arguments;\n            var argLen = args.length;\n\n            if (argLen > 3) {\n                args = arrySlice.call(args, 1);\n            }\n\n            var len = _h.length;\n            for (var i = 0; i < len;) {\n                var hItem = _h[i];\n                if (eventProcessor\n                    && eventProcessor.filter\n                    && hItem.query != null\n                    && !eventProcessor.filter(type, hItem.query)\n                ) {\n                    i++;\n                    continue;\n                }\n\n                // Optimize advise from backbone\n                switch (argLen) {\n                    case 1:\n                        hItem.h.call(hItem.ctx);\n                        break;\n                    case 2:\n                        hItem.h.call(hItem.ctx, args[1]);\n                        break;\n                    case 3:\n                        hItem.h.call(hItem.ctx, args[1], args[2]);\n                        break;\n                    default:\n                        // have more than 2 given arguments\n                        hItem.h.apply(hItem.ctx, args);\n                        break;\n                }\n\n                if (hItem.one) {\n                    _h.splice(i, 1);\n                    len--;\n                }\n                else {\n                    i++;\n                }\n            }\n        }\n\n        eventProcessor && eventProcessor.afterTrigger\n            && eventProcessor.afterTrigger(type);\n\n        return this;\n    },\n\n    /**\n     * Dispatch a event with context, which is specified at the last parameter.\n     *\n     * @param {string} type The event name.\n     */\n    triggerWithContext: function (type) {\n        var _h = this._$handlers[type];\n        var eventProcessor = this._$eventProcessor;\n\n        if (_h) {\n            var args = arguments;\n            var argLen = args.length;\n\n            if (argLen > 4) {\n                args = arrySlice.call(args, 1, args.length - 1);\n            }\n            var ctx = args[args.length - 1];\n\n            var len = _h.length;\n            for (var i = 0; i < len;) {\n                var hItem = _h[i];\n                if (eventProcessor\n                    && eventProcessor.filter\n                    && hItem.query != null\n                    && !eventProcessor.filter(type, hItem.query)\n                ) {\n                    i++;\n                    continue;\n                }\n\n                // Optimize advise from backbone\n                switch (argLen) {\n                    case 1:\n                        hItem.h.call(ctx);\n                        break;\n                    case 2:\n                        hItem.h.call(ctx, args[1]);\n                        break;\n                    case 3:\n                        hItem.h.call(ctx, args[1], args[2]);\n                        break;\n                    default:\n                        // have more than 2 given arguments\n                        hItem.h.apply(ctx, args);\n                        break;\n                }\n\n                if (hItem.one) {\n                    _h.splice(i, 1);\n                    len--;\n                }\n                else {\n                    i++;\n                }\n            }\n        }\n\n        eventProcessor && eventProcessor.afterTrigger\n            && eventProcessor.afterTrigger(type);\n\n        return this;\n    }\n};\n\nfunction normalizeQuery(host, query) {\n    var eventProcessor = host._$eventProcessor;\n    if (query != null && eventProcessor && eventProcessor.normalizeQuery) {\n        query = eventProcessor.normalizeQuery(query);\n    }\n    return query;\n}\n\nfunction on(eventful, event, query, handler, context, isOnce) {\n    var _h = eventful._$handlers;\n\n    if (typeof query === 'function') {\n        context = handler;\n        handler = query;\n        query = null;\n    }\n\n    if (!handler || !event) {\n        return eventful;\n    }\n\n    query = normalizeQuery(eventful, query);\n\n    if (!_h[event]) {\n        _h[event] = [];\n    }\n\n    for (var i = 0; i < _h[event].length; i++) {\n        if (_h[event][i].h === handler) {\n            return eventful;\n        }\n    }\n\n    var wrap = {\n        h: handler,\n        one: isOnce,\n        query: query,\n        ctx: context || eventful,\n        // FIXME\n        // Do not publish this feature util it is proved that it makes sense.\n        callAtLast: handler.zrEventfulCallAtLast\n    };\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\n    return eventful;\n}\n\n// ----------------------\n// The events in zrender\n// ----------------------\n\n/**\n * @event module:zrender/mixin/Eventful#onclick\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmouseover\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmouseout\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmousemove\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmousewheel\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmousedown\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#onmouseup\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondrag\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondragstart\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondragend\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondragenter\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondragleave\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondragover\n * @type {Function}\n * @default null\n */\n/**\n * @event module:zrender/mixin/Eventful#ondrop\n * @type {Function}\n * @default null\n */\n\nexport default Eventful;","/**\n * The algoritm is learnt from\n * https://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n * And we made some optimization for matrix inversion.\n * Other similar approaches:\n * \"cv::getPerspectiveTransform\", \"Direct Linear Transformation\".\n */\n\nvar LN2 = Math.log(2);\n\nfunction determinant(rows, rank, rowStart, rowMask, colMask, detCache) {\n    var cacheKey = rowMask + '-' + colMask;\n    var fullRank = rows.length;\n\n    if (detCache.hasOwnProperty(cacheKey)) {\n        return detCache[cacheKey];\n    }\n\n    if (rank === 1) {\n        // In this case the colMask must be like: `11101111`. We can find the place of `0`.\n        var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2);\n        return rows[rowStart][colStart];\n    }\n\n    var subRowMask = rowMask | (1 << rowStart);\n    var subRowStart = rowStart + 1;\n    while (rowMask & (1 << subRowStart)) {\n        subRowStart++;\n    }\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                // det(subMatrix(0, j))\n                * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);\n            colLocalIdx++;\n        }\n    }\n\n    detCache[cacheKey] = sum;\n\n    return sum;\n}\n\n/**\n * Usage:\n * ```js\n * var transformer = buildTransformer(\n *     [10, 44, 100, 44, 100, 300, 10, 300],\n *     [50, 54, 130, 14, 140, 330, 14, 220]\n * );\n * var out = [];\n * transformer && transformer([11, 33], out);\n * ```\n *\n * Notice: `buildTransformer` may take more than 10ms in some Android device.\n *\n * @param {Array.<number>} src source four points, [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param {Array.<number>} dest destination four points, [x0, y0, x1, y1, x2, y2, x3, y3]\n * @return {Function} transformer If fail, return null/undefined.\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\n    var detCache = {};\n    var det = determinant(mA, 8, 0, 0, 0, detCache);\n    if (det === 0) {\n        return;\n    }\n\n    // `invert(mA) * dest`, that is, `adj(mA) / det * dest`.\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                // det(subMatrix(i, j))\n                * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache)\n                / det * dest[i];\n        }\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","/**\n * Utilities for mouse or touch events.\n */\n\nimport Eventful from '../mixin/Eventful';\nimport env from './env';\nimport {buildTransformer} from './fourPointsTransform';\n\nvar isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener;\n\nvar MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;\nvar EVENT_SAVED_PROP = '___zrEVENTSAVED';\nvar _calcOut = [];\n\n/**\n * Get the `zrX` and `zrY`, which are relative to the top-left of\n * the input `el`.\n * CSS transform (2D & 3D) is supported.\n *\n * The strategy to fetch the coords:\n * + If `calculate` is not set as `true`, users of this method should\n * ensure that `el` is the same or the same size & location as `e.target`.\n * Otherwise the result coords are probably not expected. Because we\n * firstly try to get coords from e.offsetX/e.offsetY.\n * + If `calculate` is set as `true`, the input `el` can be any element\n * and we force to calculate the coords based on `el`.\n * + The input `el` should be positionable (not position:static).\n *\n * The force `calculate` can be used in case like:\n * When mousemove event triggered on ec tooltip, `e.target` is not `el`(zr painter.dom).\n *\n * @param {HTMLElement} el DOM element.\n * @param {Event} e Mouse event or touch event.\n * @param {Object} out Get `out.zrX` and `out.zrY` as the result.\n * @param {boolean} [calculate=false] Whether to force calculate\n *        the coordinates but not use ones provided by browser.\n */\nexport function clientToLocal(el, e, out, calculate) {\n    out = out || {};\n\n    // According to the W3C Working Draft, offsetX and offsetY should be relative\n    // to the padding edge of the target element. The only browser using this convention\n    // is IE. Webkit uses the border edge, Opera uses the content edge, and FireFox does\n    // not support the properties.\n    // (see http://www.jacklmoore.com/notes/mouse-position/)\n    // In zr painter.dom, padding edge equals to border edge.\n\n    if (calculate || !env.canvasSupported) {\n        calculateZrXY(el, e, out);\n    }\n    // Caution: In FireFox, layerX/layerY Mouse position relative to the closest positioned\n    // ancestor element, so we should make sure el is positioned (e.g., not position:static).\n    // BTW1, Webkit don't return the same results as FF in non-simple cases (like add\n    // zoom-factor, overflow / opacity layers, transforms ...)\n    // BTW2, (ev.offsetY || ev.pageY - $(ev.target).offset().top) is not correct in preserve-3d.\n    // <https://bugs.jquery.com/ticket/8523#comment:14>\n    // BTW3, In ff, offsetX/offsetY is always 0.\n    else if (env.browser.firefox && e.layerX != null && e.layerX !== e.offsetX) {\n        out.zrX = e.layerX;\n        out.zrY = e.layerY;\n    }\n    // For IE6+, chrome, safari, opera. (When will ff support offsetX?)\n    else if (e.offsetX != null) {\n        out.zrX = e.offsetX;\n        out.zrY = e.offsetY;\n    }\n    // For some other device, e.g., IOS safari.\n    else {\n        calculateZrXY(el, e, out);\n    }\n\n    return out;\n}\n\nfunction calculateZrXY(el, e, out) {\n    // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect.\n    if (el.getBoundingClientRect && env.domSupported) {\n        var ex = e.clientX;\n        var ey = e.clientY;\n\n        if (el.nodeName.toUpperCase() === 'CANVAS') {\n            // Original approach, which do not support CSS transform.\n            // marker can not be locationed in a canvas container\n            // (getBoundingClientRect is always 0). We do not support\n            // that input a pre-created canvas to zr while using css\n            // transform in iOS.\n            var box = el.getBoundingClientRect();\n            out.zrX = ex - box.left;\n            out.zrY = ey - box.top;\n            return;\n        }\n        else {\n            var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});\n            var transformer = preparePointerTransformer(prepareCoordMarkers(el, saved), saved);\n            if (transformer) {\n                transformer(_calcOut, ex, ey);\n                out.zrX = _calcOut[0];\n                out.zrY = _calcOut[1];\n                return;\n            }\n        }\n    }\n    out.zrX = out.zrY = 0;\n}\n\nfunction prepareCoordMarkers(el, saved) {\n    var markers = saved.markers;\n    if (markers) {\n        return markers;\n    }\n\n    markers = saved.markers = [];\n    var propLR = ['left', 'right'];\n    var propTB = ['top', 'bottom'];\n\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            'width:0',\n            'height:0',\n            // 'width: 5px',\n            // 'height: 5px',\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\n    return markers;\n}\n\nfunction preparePointerTransformer(markers, saved) {\n    var transformer = saved.transformer;\n    var oldSrcCoords = saved.srcCoords;\n    var useOld = true;\n    var srcCoords = [];\n    var destCoords = [];\n\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        useOld &= oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];\n        destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);\n    }\n\n    // Cache to avoid time consuming of `buildTransformer`.\n    return useOld\n        ? transformer\n        : (\n            saved.srcCoords = srcCoords,\n            saved.transformer = buildTransformer(srcCoords, destCoords)\n        );\n}\n\n/**\n * Normalize the coordinates of the input event.\n *\n * Get the `e.zrX` and `e.zrY`, which are relative to the top-left of\n * the input `el`.\n * Get `e.zrDelta` if using mouse wheel.\n * Get `e.which`, see the comment inside this function.\n *\n * Do not calculate repeatly if `zrX` and `zrY` already exist.\n *\n * Notice: see comments in `clientToLocal`. check the relationship\n * between the result coords and the parameters `el` and `calculate`.\n *\n * @param {HTMLElement} el DOM element.\n * @param {Event} [e] Mouse event or touch event. For lagency IE,\n *        do not need to input it and `window.event` is used.\n * @param {boolean} [calculate=false] Whether to force calculate\n *        the coordinates but not use ones provided by browser.\n */\nexport function normalizeEvent(el, e, calculate) {\n\n    e = e || window.event;\n\n    if (e.zrX != null) {\n        return e;\n    }\n\n    var eventType = e.type;\n    var isTouch = eventType && eventType.indexOf('touch') >= 0;\n\n    if (!isTouch) {\n        clientToLocal(el, e, e, calculate);\n        e.zrDelta = (e.wheelDelta) ? e.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\n    // Add which for click: 1 === left; 2 === middle; 3 === right; otherwise: 0;\n    // See jQuery: https://github.com/jquery/jquery/blob/master/src/event.js\n    // If e.which has been defined, it may be readonly,\n    // see: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which\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    // [Caution]: `e.which` from browser is not always reliable. For example,\n    // when press left button and `mousemove (pointermove)` in Edge, the `e.which`\n    // is 65536 and the `e.button` is -1. But the `mouseup (pointerup)` and\n    // `mousedown (pointerdown)` is the same as Chrome does.\n\n    return e;\n}\n\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Function} handler\n */\nexport function addEventListener(el, name, handler) {\n    if (isDomLevel2) {\n        // Reproduct the console warning:\n        // [Violation] Added non-passive event listener to a scroll-blocking <some> event.\n        // Consider marking event handler as 'passive' to make the page more responsive.\n        // Just set console log level: verbose in chrome dev tool.\n        // then the warning log will be printed when addEventListener called.\n        // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n        // We have not yet found a neat way to using passive. Because in zrender the dom event\n        // listener delegate all of the upper events of element. Some of those events need\n        // to prevent default. For example, the feature `preventDefaultMouseMove` of echarts.\n        // Before passive can be adopted, these issues should be considered:\n        // (1) Whether and how a zrender user specifies an event listener passive. And by default,\n        // passive or not.\n        // (2) How to tread that some zrender event listener is passive, and some is not. If\n        // we use other way but not preventDefault of mousewheel and touchmove, browser\n        // compatibility should be handled.\n\n        // var opts = (env.passiveSupported && name === 'mousewheel')\n        //     ? {passive: true}\n        //     // By default, the third param of el.addEventListener is `capture: false`.\n        //     : void 0;\n        // el.addEventListener(name, handler /* , opts */);\n        el.addEventListener(name, handler);\n    }\n    else {\n        el.attachEvent('on' + name, handler);\n    }\n}\n\nexport function removeEventListener(el, name, handler) {\n    if (isDomLevel2) {\n        el.removeEventListener(name, handler);\n    }\n    else {\n        el.detachEvent('on' + name, handler);\n    }\n}\n\n/**\n * preventDefault and stopPropagation.\n * Notice: do not use this method in zrender. It can only be\n * used by upper applications if necessary.\n *\n * @param {Event} e A mouse or touch event.\n */\nexport var stop = isDomLevel2\n    ? function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        e.cancelBubble = true;\n    }\n    : function (e) {\n        e.returnValue = false;\n        e.cancelBubble = true;\n    };\n\n/**\n * This method only works for mouseup and mousedown. The functionality is restricted\n * for fault tolerance, See the `e.which` compatibility above.\n *\n * @param {MouseEvent} e\n * @return {boolean}\n */\nexport function isMiddleOrRightButtonOnMouseUpDown(e) {\n    return e.which === 2 || e.which === 3;\n}\n\n/**\n * To be removed.\n * @deprecated\n */\nexport function notLeftMouse(e) {\n    // If e.which is undefined, considered as left mouse event.\n    return e.which > 1;\n}\n\n\n// For backward compatibility\nexport {Eventful as Dispatcher};\n","/**\n * Only implements needed gestures for mobile.\n */\n\nimport * as eventUtil from './event';\n\nvar GestureMgr = function () {\n\n    /**\n     * @private\n     * @type {Array.<Object>}\n     */\n    this._track = [];\n};\n\nGestureMgr.prototype = {\n\n    constructor: GestureMgr,\n\n    recognize: function (event, target, root) {\n        this._doTrack(event, target, root);\n        return this._recognize(event);\n    },\n\n    clear: function () {\n        this._track.length = 0;\n        return this;\n    },\n\n    _doTrack: function (event, target, root) {\n        var touches = event.touches;\n\n        if (!touches) {\n            return;\n        }\n\n        var trackItem = {\n            points: [],\n            touches: [],\n            target: target,\n            event: event\n        };\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\n        this._track.push(trackItem);\n    },\n\n    _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};\n\nfunction dist(pointPair) {\n    var dx = pointPair[1][0] - pointPair[0][0];\n    var dy = pointPair[1][1] - pointPair[0][1];\n\n    return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction center(pointPair) {\n    return [\n        (pointPair[0][0] + pointPair[1][0]) / 2,\n        (pointPair[0][1] + pointPair[1][1]) / 2\n    ];\n}\n\nvar recognizers = {\n\n    pinch: function (track, event) {\n        var trackLen = track.length;\n\n        if (!trackLen) {\n            return;\n        }\n\n        var pinchEnd = (track[trackLen - 1] || {}).points;\n        var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd;\n\n        if (pinchPre\n            && pinchPre.length > 1\n            && pinchEnd\n            && pinchEnd.length > 1\n        ) {\n            var pinchScale = dist(pinchEnd) / dist(pinchPre);\n            !isFinite(pinchScale) && (pinchScale = 1);\n\n            event.pinchScale = pinchScale;\n\n            var pinchCenter = center(pinchEnd);\n            event.pinchX = pinchCenter[0];\n            event.pinchY = pinchCenter[1];\n\n            return {\n                type: 'pinch',\n                target: track[0].target,\n                event: event\n            };\n        }\n    }\n\n    // Only pinch currently.\n};\n\nexport default GestureMgr;","import * as util from './core/util';\nimport * as vec2 from './core/vector';\nimport Draggable from './mixin/Draggable';\nimport Eventful from './mixin/Eventful';\nimport * as eventTool from './core/event';\nimport GestureMgr from './core/GestureMgr';\n\nvar SILENT = 'silent';\n\nfunction makeEventPacket(eveType, targetInfo, event) {\n    return {\n        type: eveType,\n        event: event,\n        // target can only be an element that is not silent.\n        target: targetInfo.target,\n        // topTarget can be a silent element.\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}\n\nfunction stopEvent(event) {\n    eventTool.stop(this.event);\n}\n\nfunction EmptyProxy() {}\nEmptyProxy.prototype.dispose = function () {};\n\nvar handlerNames = [\n    'click', 'dblclick', 'mousewheel', 'mouseout',\n    'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n];\n/**\n * @alias module:zrender/Handler\n * @constructor\n * @extends module:zrender/mixin/Eventful\n * @param {module:zrender/Storage} storage Storage instance.\n * @param {module:zrender/Painter} painter Painter instance.\n * @param {module:zrender/dom/HandlerProxy} proxy HandlerProxy instance.\n * @param {HTMLElement} painterRoot painter.root (not painter.getViewportRoot()).\n */\nvar Handler = function (storage, painter, proxy, painterRoot) {\n    Eventful.call(this);\n\n    this.storage = storage;\n\n    this.painter = painter;\n\n    this.painterRoot = painterRoot;\n\n    proxy = proxy || new EmptyProxy();\n\n    /**\n     * Proxy of event. can be Dom, WebGLSurface, etc.\n     */\n    this.proxy = null;\n\n    /**\n     * {target, topTarget, x, y}\n     * @private\n     * @type {Object}\n     */\n    this._hovered = {};\n\n    /**\n     * @private\n     * @type {Date}\n     */\n    this._lastTouchMoment;\n\n    /**\n     * @private\n     * @type {number}\n     */\n    this._lastX;\n\n    /**\n     * @private\n     * @type {number}\n     */\n    this._lastY;\n\n    /**\n     * @private\n     * @type {module:zrender/core/GestureMgr}\n     */\n    this._gestureMgr;\n\n\n    Draggable.call(this);\n\n    this.setHandlerProxy(proxy);\n};\n\nHandler.prototype = {\n\n    constructor: Handler,\n\n    setHandlerProxy: function (proxy) {\n        if (this.proxy) {\n            this.proxy.dispose();\n        }\n\n        if (proxy) {\n            util.each(handlerNames, function (name) {\n                proxy.on && proxy.on(name, this[name], this);\n            }, this);\n            // Attach handler\n            proxy.handler = this;\n        }\n        this.proxy = proxy;\n    },\n\n    mousemove: function (event) {\n        var x = event.zrX;\n        var y = event.zrY;\n\n        var lastHovered = this._hovered;\n        var lastHoveredTarget = lastHovered.target;\n\n        // If lastHoveredTarget is removed from zr (detected by '__zr') by some API call\n        // (like 'setOption' or 'dispatchAction') in event handlers, we should find\n        // lastHovered again here. Otherwise 'mouseout' can not be triggered normally.\n        // See #6198.\n        if (lastHoveredTarget && !lastHoveredTarget.__zr) {\n            lastHovered = this.findHover(lastHovered.x, lastHovered.y);\n            lastHoveredTarget = lastHovered.target;\n        }\n\n        var hovered = this._hovered = this.findHover(x, y);\n        var hoveredTarget = hovered.target;\n\n        var proxy = this.proxy;\n        proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default');\n\n        // Mouse out on previous hovered element\n        if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {\n            this.dispatchToElement(lastHovered, 'mouseout', event);\n        }\n\n        // Mouse moving on one element\n        this.dispatchToElement(hovered, 'mousemove', event);\n\n        // Mouse over on a new element\n        if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {\n            this.dispatchToElement(hovered, 'mouseover', event);\n        }\n    },\n\n    mouseout: function (event) {\n        this.dispatchToElement(this._hovered, 'mouseout', event);\n\n        // There might be some doms created by upper layer application\n        // at the same level of painter.getViewportRoot() (e.g., tooltip\n        // dom created by echarts), where 'globalout' event should not\n        // be triggered when mouse enters these doms. (But 'mouseout'\n        // should be triggered at the original hovered element as usual).\n        var element = event.toElement || event.relatedTarget;\n        var innerDom;\n        do {\n            element = element && element.parentNode;\n        }\n        while (element && element.nodeType !== 9 && !(\n            innerDom = element === this.painterRoot\n        ));\n\n        !innerDom && this.trigger('globalout', {event: event});\n    },\n\n    /**\n     * Resize\n     */\n    resize: function (event) {\n        this._hovered = {};\n    },\n\n    /**\n     * Dispatch event\n     * @param {string} eventName\n     * @param {event=} eventArgs\n     */\n    dispatch: function (eventName, eventArgs) {\n        var handler = this[eventName];\n        handler && handler.call(this, eventArgs);\n    },\n\n    /**\n     * Dispose\n     */\n    dispose: function () {\n\n        this.proxy.dispose();\n\n        this.storage =\n        this.proxy =\n        this.painter = null;\n    },\n\n    /**\n     * 设置默认的cursor style\n     * @param {string} [cursorStyle='default'] 例如 crosshair\n     */\n    setCursorStyle: function (cursorStyle) {\n        var proxy = this.proxy;\n        proxy.setCursor && proxy.setCursor(cursorStyle);\n    },\n\n    /**\n     * 事件分发代理\n     *\n     * @private\n     * @param {Object} targetInfo {target, topTarget} 目标图形元素\n     * @param {string} eventName 事件名称\n     * @param {Object} event 事件对象\n     */\n    dispatchToElement: function (targetInfo, eventName, event) {\n        targetInfo = targetInfo || {};\n        var el = targetInfo.target;\n        if (el && el.silent) {\n            return;\n        }\n        var eventHandler = 'on' + eventName;\n        var eventPacket = makeEventPacket(eventName, targetInfo, event);\n\n        while (el) {\n            el[eventHandler]\n                && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket));\n\n            el.trigger(eventName, eventPacket);\n\n            el = el.parent;\n\n            if (eventPacket.cancelBubble) {\n                break;\n            }\n        }\n\n        if (!eventPacket.cancelBubble) {\n            // 冒泡到顶级 zrender 对象\n            this.trigger(eventName, eventPacket);\n            // 分发事件到用户自定义层\n            // 用户有可能在全局 click 事件中 dispose，所以需要判断下 painter 是否存在\n            this.painter && this.painter.eachOtherLayer(function (layer) {\n                if (typeof (layer[eventHandler]) === 'function') {\n                    layer[eventHandler].call(layer, eventPacket);\n                }\n                if (layer.trigger) {\n                    layer.trigger(eventName, eventPacket);\n                }\n            });\n        }\n    },\n\n    /**\n     * @private\n     * @param {number} x\n     * @param {number} y\n     * @param {module:zrender/graphic/Displayable} exclude\n     * @return {model:zrender/Element}\n     * @method\n     */\n    findHover: function (x, y, exclude) {\n        var list = this.storage.getDisplayList();\n        var out = {x: x, y: y};\n\n        for (var i = list.length - 1; i >= 0; i--) {\n            var hoverCheckResult;\n            if (list[i] !== exclude\n                // getDisplayList may include ignored item in VML mode\n                && !list[i].ignore\n                && (hoverCheckResult = isHover(list[i], x, y))\n            ) {\n                !out.topTarget && (out.topTarget = list[i]);\n                if (hoverCheckResult !== SILENT) {\n                    out.target = list[i];\n                    break;\n                }\n            }\n        }\n\n        return out;\n    },\n\n    processGesture: function (event, stage) {\n        if (!this._gestureMgr) {\n            this._gestureMgr = new GestureMgr();\n        }\n        var gestureMgr = this._gestureMgr;\n\n        stage === 'start' && gestureMgr.clear();\n\n        var gestureInfo = gestureMgr.recognize(\n            event,\n            this.findHover(event.zrX, event.zrY, null).target,\n            this.proxy.dom\n        );\n\n        stage === 'end' && gestureMgr.clear();\n\n        // Do not do any preventDefault here. Upper application do that if necessary.\n        if (gestureInfo) {\n            var type = gestureInfo.type;\n            event.gestureEvent = type;\n\n            this.dispatchToElement({target: gestureInfo.target}, type, gestureInfo.event);\n        }\n    }\n};\n\n// Common handlers\nutil.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {\n    Handler.prototype[name] = function (event) {\n        // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover\n        var hovered = this.findHover(event.zrX, event.zrY);\n        var hoveredTarget = hovered.target;\n\n        if (name === 'mousedown') {\n            this._downEl = hoveredTarget;\n            this._downPoint = [event.zrX, event.zrY];\n            // In case click triggered before mouseup\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                // Original click event is triggered on the whole canvas element,\n                // including the case that `mousedown` - `mousemove` - `mouseup`,\n                // which should be filtered, otherwise it will bring trouble to\n                // pan and zoom.\n                || !this._downPoint\n                // Arbitrary value\n                || vec2.dist(this._downPoint, [event.zrX, event.zrY]) > 4\n            ) {\n                return;\n            }\n            this._downPoint = null;\n        }\n\n        this.dispatchToElement(hovered, name, event);\n    };\n});\n\nfunction isHover(displayable, x, y) {\n    if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {\n        var el = displayable;\n        var isSilent;\n        while (el) {\n            // If clipped by ancestor.\n            // FIXME: If clipPath has neither stroke nor fill,\n            // el.clipPath.contain(x, y) will always return false.\n            if (el.clipPath && !el.clipPath.contain(x, y)) {\n                return false;\n            }\n            if (el.silent) {\n                isSilent = true;\n            }\n            el = el.parent;\n        }\n        return isSilent ? SILENT : true;\n    }\n\n    return false;\n}\n\nutil.mixin(Handler, Eventful);\nutil.mixin(Handler, Draggable);\n\nexport default Handler;\n","/**\n * 3x2矩阵操作类\n * @exports zrender/tool/matrix\n */\n\nvar ArrayCtor = typeof Float32Array === 'undefined'\n    ? Array\n    : Float32Array;\n\n/**\n * Create a identity matrix.\n * @return {Float32Array|Array.<number>}\n */\nexport function create() {\n    var out = new ArrayCtor(6);\n    identity(out);\n\n    return out;\n}\n\n/**\n * 设置矩阵为单位矩阵\n * @param {Float32Array|Array.<number>} out\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}\n\n/**\n * 复制矩阵\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} m\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}\n\n/**\n * 矩阵相乘\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} m1\n * @param {Float32Array|Array.<number>} m2\n */\nexport function mul(out, m1, m2) {\n    // Consider matrix.mul(m, m2, m);\n    // where out is the same as m2.\n    // So use temp variable to escape error.\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}\n\n/**\n * 平移变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {Float32Array|Array.<number>} v\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}\n\n/**\n * 旋转变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {number} rad\n */\nexport function rotate(out, a, rad) {\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\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 + st * aty;\n    out[5] = ct * aty - st * atx;\n    return out;\n}\n\n/**\n * 缩放变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {Float32Array|Array.<number>} v\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}\n\n/**\n * 求逆矩阵\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n */\nexport function invert(out, a) {\n\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\n    var det = aa * ad - ab * ac;\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\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}\n\n/**\n * Clone a new matrix.\n * @param {Float32Array|Array.<number>} a\n */\nexport function clone(a) {\n    var b = create();\n    copy(b, a);\n    return b;\n}","/**\n * 提供变换扩展\n * @module zrender/mixin/Transformable\n * @author pissang (https://www.github.com/pissang)\n */\n\nimport * as matrix from '../core/matrix';\nimport * as vector from '../core/vector';\n\nvar mIdentity = matrix.identity;\n\nvar EPSILON = 5e-5;\n\nfunction isNotAroundZero(val) {\n    return val > EPSILON || val < -EPSILON;\n}\n\n/**\n * @alias module:zrender/mixin/Transformable\n * @constructor\n */\nvar Transformable = function (opts) {\n    opts = opts || {};\n    // If there are no given position, rotation, scale\n    if (!opts.position) {\n        /**\n         * 平移\n         * @type {Array.<number>}\n         * @default [0, 0]\n         */\n        this.position = [0, 0];\n    }\n    if (opts.rotation == null) {\n        /**\n         * 旋转\n         * @type {Array.<number>}\n         * @default 0\n         */\n        this.rotation = 0;\n    }\n    if (!opts.scale) {\n        /**\n         * 缩放\n         * @type {Array.<number>}\n         * @default [1, 1]\n         */\n        this.scale = [1, 1];\n    }\n    /**\n     * 旋转和缩放的原点\n     * @type {Array.<number>}\n     * @default null\n     */\n    this.origin = this.origin || null;\n};\n\nvar transformableProto = Transformable.prototype;\ntransformableProto.transform = null;\n\n/**\n * 判断是否需要有坐标变换\n * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵\n */\ntransformableProto.needLocalTransform = function () {\n    return isNotAroundZero(this.rotation)\n        || isNotAroundZero(this.position[0])\n        || isNotAroundZero(this.position[1])\n        || isNotAroundZero(this.scale[0] - 1)\n        || isNotAroundZero(this.scale[1] - 1);\n};\n\nvar scaleTmp = [];\ntransformableProto.updateTransform = function () {\n    var parent = this.parent;\n    var parentHasTransform = parent && parent.transform;\n    var needLocalTransform = this.needLocalTransform();\n\n    var m = this.transform;\n    if (!(needLocalTransform || parentHasTransform)) {\n        m && mIdentity(m);\n        return;\n    }\n\n    m = m || matrix.create();\n\n    if (needLocalTransform) {\n        this.getLocalTransform(m);\n    }\n    else {\n        mIdentity(m);\n    }\n\n    // 应用父节点变换\n    if (parentHasTransform) {\n        if (needLocalTransform) {\n            matrix.mul(m, parent.transform, m);\n        }\n        else {\n            matrix.copy(m, parent.transform);\n        }\n    }\n    // 保存这个变换矩阵\n    this.transform = m;\n\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\n        m[0] *= sx;\n        m[1] *= sx;\n        m[2] *= sy;\n        m[3] *= sy;\n    }\n\n    this.invTransform = this.invTransform || matrix.create();\n    matrix.invert(this.invTransform, m);\n};\n\ntransformableProto.getLocalTransform = function (m) {\n    return Transformable.getLocalTransform(this, m);\n};\n\n/**\n * 将自己的transform应用到context上\n * @param {CanvasRenderingContext2D} ctx\n */\ntransformableProto.setTransform = function (ctx) {\n    var m = this.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};\n\ntransformableProto.restoreTransform = function (ctx) {\n    var dpr = ctx.dpr || 1;\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n};\n\nvar tmpTransform = [];\nvar originTransform = matrix.create();\n\ntransformableProto.setLocalTransform = function (m) {\n    if (!m) {\n        // TODO return or set identity?\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 position = this.position;\n    var scale = this.scale;\n    if (isNotAroundZero(sx - 1)) {\n        sx = Math.sqrt(sx);\n    }\n    if (isNotAroundZero(sy - 1)) {\n        sy = Math.sqrt(sy);\n    }\n    if (m[0] < 0) {\n        sx = -sx;\n    }\n    if (m[3] < 0) {\n        sy = -sy;\n    }\n\n    position[0] = m[4];\n    position[1] = m[5];\n    scale[0] = sx;\n    scale[1] = sy;\n    this.rotation = Math.atan2(-m[1] / sy, m[0] / sx);\n};\n/**\n * 分解`transform`矩阵到`position`, `rotation`, `scale`\n */\ntransformableProto.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        // Get local transform and decompose them to position, scale, rotation\n        matrix.mul(tmpTransform, parent.invTransform, m);\n        m = tmpTransform;\n    }\n    var origin = this.origin;\n    if (origin && (origin[0] || origin[1])) {\n        originTransform[4] = origin[0];\n        originTransform[5] = origin[1];\n        matrix.mul(tmpTransform, m, originTransform);\n        tmpTransform[4] -= origin[0];\n        tmpTransform[5] -= origin[1];\n        m = tmpTransform;\n    }\n\n    this.setLocalTransform(m);\n};\n\n/**\n * Get global scale\n * @return {Array.<number>}\n */\ntransformableProto.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/**\n * 变换坐标位置到 shape 的局部坐标空间\n * @method\n * @param {number} x\n * @param {number} y\n * @return {Array.<number>}\n */\ntransformableProto.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\n/**\n * 变换局部坐标位置到全局坐标空间\n * @method\n * @param {number} x\n * @param {number} y\n * @return {Array.<number>}\n */\ntransformableProto.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\n/**\n * @static\n * @param {Object} target\n * @param {Array.<number>} target.origin\n * @param {number} target.rotation\n * @param {Array.<number>} target.position\n * @param {Array.<number>} [m]\n */\nTransformable.getLocalTransform = function (target, m) {\n    m = m || [];\n    mIdentity(m);\n\n    var origin = target.origin;\n    var scale = target.scale || [1, 1];\n    var rotation = target.rotation || 0;\n    var position = target.position || [0, 0];\n\n    if (origin) {\n        // Translate to origin\n        m[4] -= origin[0];\n        m[5] -= origin[1];\n    }\n    matrix.scale(m, m, scale);\n    if (rotation) {\n        matrix.rotate(m, m, rotation);\n    }\n    if (origin) {\n        // Translate back from origin\n        m[4] += origin[0];\n        m[5] += origin[1];\n    }\n\n    m[4] += position[0];\n    m[5] += position[1];\n\n    return m;\n};\n\nexport default Transformable;","/**\n * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js\n * @see http://sole.github.io/tween.js/examples/03_graphs.html\n * @exports zrender/animation/easing\n */\nvar easing = {\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    linear: function (k) {\n        return k;\n    },\n\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quadraticIn: function (k) {\n        return k * k;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quadraticOut: function (k) {\n        return k * (2 - k);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 三次方的缓动（t^3）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    cubicIn: function (k) {\n        return k * k * k;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    cubicOut: function (k) {\n        return --k * k * k + 1;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 四次方的缓动（t^4）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quarticIn: function (k) {\n        return k * k * k * k;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quarticOut: function (k) {\n        return 1 - (--k * k * k * k);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 五次方的缓动（t^5）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quinticIn: function (k) {\n        return k * k * k * k * k;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    quinticOut: function (k) {\n        return --k * k * k * k * k + 1;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 正弦曲线的缓动（sin(t)）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    sinusoidalIn: function (k) {\n        return 1 - Math.cos(k * Math.PI / 2);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    sinusoidalOut: function (k) {\n        return Math.sin(k * Math.PI / 2);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    sinusoidalInOut: function (k) {\n        return 0.5 * (1 - Math.cos(Math.PI * k));\n    },\n\n    // 指数曲线的缓动（2^t）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    exponentialIn: function (k) {\n        return k === 0 ? 0 : Math.pow(1024, k - 1);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    exponentialOut: function (k) {\n        return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 圆形曲线的缓动（sqrt(1-t^2)）\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    circularIn: function (k) {\n        return 1 - Math.sqrt(1 - k * k);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    circularOut: function (k) {\n        return Math.sqrt(1 - (--k * k));\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 创建类似于弹簧在停止前来回振荡的动画\n    /**\n    * @param {number} k\n    * @return {number}\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    /**\n    * @param {number} k\n    * @return {number}\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    /**\n    * @param {number} k\n    * @return {number}\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    },\n\n    // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    backIn: function (k) {\n        var s = 1.70158;\n        return k * k * ((s + 1) * k - s);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    backOut: function (k) {\n        var s = 1.70158;\n        return --k * k * ((s + 1) * k + s) + 1;\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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\n    // 创建弹跳效果\n    /**\n    * @param {number} k\n    * @return {number}\n    */\n    bounceIn: function (k) {\n        return 1 - easing.bounceOut(1 - k);\n    },\n    /**\n    * @param {number} k\n    * @return {number}\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    /**\n    * @param {number} k\n    * @return {number}\n    */\n    bounceInOut: function (k) {\n        if (k < 0.5) {\n            return easing.bounceIn(k * 2) * 0.5;\n        }\n        return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5;\n    }\n};\n\nexport default easing;","/**\n * 动画主控制器\n * @config target 动画对象，可以是数组，如果是数组的话会批量分发onframe等事件\n * @config life(1000) 动画时长\n * @config delay(0) 动画延迟时间\n * @config loop(true)\n * @config gap(0) 循环的间隔时间\n * @config onframe\n * @config easing(optional)\n * @config ondestroy(optional)\n * @config onrestart(optional)\n *\n * TODO pause\n */\n\nimport easingFuncs from './easing';\n\nfunction Clip(options) {\n\n    this._target = options.target;\n\n    // 生命周期\n    this._life = options.life || 1000;\n    // 延时\n    this._delay = options.delay || 0;\n    // 开始时间\n    // this._startTime = new Date().getTime() + this._delay;// 单位毫秒\n    this._initialized = false;\n\n    // 是否循环\n    this.loop = options.loop == null ? false : options.loop;\n\n    this.gap = options.gap || 0;\n\n    this.easing = options.easing || 'Linear';\n\n    this.onframe = options.onframe;\n    this.ondestroy = options.ondestroy;\n    this.onrestart = options.onrestart;\n\n    this._pausedTime = 0;\n    this._paused = false;\n}\n\nClip.prototype = {\n\n    constructor: Clip,\n\n    step: function (globalTime, deltaTime) {\n        // Set startTime on first step, or _startTime may has milleseconds different between clips\n        // PENDING\n        if (!this._initialized) {\n            this._startTime = globalTime + this._delay;\n            this._initialized = true;\n        }\n\n        if (this._paused) {\n            this._pausedTime += deltaTime;\n            return;\n        }\n\n        var percent = (globalTime - this._startTime - this._pausedTime) / this._life;\n\n        // 还没开始\n        if (percent < 0) {\n            return;\n        }\n\n        percent = Math.min(percent, 1);\n\n        var easing = this.easing;\n        var easingFunc = typeof easing === 'string' ? easingFuncs[easing] : easing;\n        var schedule = typeof easingFunc === 'function'\n            ? easingFunc(percent)\n            : percent;\n\n        this.fire('frame', schedule);\n\n        // 结束\n        if (percent === 1) {\n            if (this.loop) {\n                this.restart(globalTime);\n                // 重新开始周期\n                // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件\n                return 'restart';\n            }\n\n            // 动画完成将这个控制器标识为待删除\n            // 在Animation.update中进行批量删除\n            this._needsRemove = true;\n            return 'destroy';\n        }\n\n        return null;\n    },\n\n    restart: function (globalTime) {\n        var remainder = (globalTime - this._startTime - this._pausedTime) % this._life;\n        this._startTime = globalTime - remainder + this.gap;\n        this._pausedTime = 0;\n\n        this._needsRemove = false;\n    },\n\n    fire: function (eventType, arg) {\n        eventType = 'on' + eventType;\n        if (this[eventType]) {\n            this[eventType](this._target, arg);\n        }\n    },\n\n    pause: function () {\n        this._paused = true;\n    },\n\n    resume: function () {\n        this._paused = false;\n    }\n};\n\nexport default Clip;","// Simple LRU cache use doubly linked list\n// @module zrender/core/LRU\n\n/**\n * Simple double linked list. Compared with array, it has O(1) remove operation.\n * @constructor\n */\nvar LinkedList = function () {\n\n    /**\n     * @type {module:zrender/core/LRU~Entry}\n     */\n    this.head = null;\n\n    /**\n     * @type {module:zrender/core/LRU~Entry}\n     */\n    this.tail = null;\n\n    this._len = 0;\n};\n\nvar linkedListProto = LinkedList.prototype;\n/**\n * Insert a new value at the tail\n * @param  {} val\n * @return {module:zrender/core/LRU~Entry}\n */\nlinkedListProto.insert = function (val) {\n    var entry = new Entry(val);\n    this.insertEntry(entry);\n    return entry;\n};\n\n/**\n * Insert an entry at the tail\n * @param  {module:zrender/core/LRU~Entry} entry\n */\nlinkedListProto.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\n/**\n * Remove entry.\n * @param  {module:zrender/core/LRU~Entry} entry\n */\nlinkedListProto.remove = function (entry) {\n    var prev = entry.prev;\n    var next = entry.next;\n    if (prev) {\n        prev.next = next;\n    }\n    else {\n        // Is head\n        this.head = next;\n    }\n    if (next) {\n        next.prev = prev;\n    }\n    else {\n        // Is tail\n        this.tail = prev;\n    }\n    entry.next = entry.prev = null;\n    this._len--;\n};\n\n/**\n * @return {number}\n */\nlinkedListProto.len = function () {\n    return this._len;\n};\n\n/**\n * Clear list\n */\nlinkedListProto.clear = function () {\n    this.head = this.tail = null;\n    this._len = 0;\n};\n\n/**\n * @constructor\n * @param {} val\n */\nvar Entry = function (val) {\n    /**\n     * @type {}\n     */\n    this.value = val;\n\n    /**\n     * @type {module:zrender/core/LRU~Entry}\n     */\n    this.next;\n\n    /**\n     * @type {module:zrender/core/LRU~Entry}\n     */\n    this.prev;\n};\n\n/**\n * LRU Cache\n * @constructor\n * @alias module:zrender/core/LRU\n */\nvar LRU = function (maxSize) {\n\n    this._list = new LinkedList();\n\n    this._map = {};\n\n    this._maxSize = maxSize || 10;\n\n    this._lastRemovedEntry = null;\n};\n\nvar LRUProto = LRU.prototype;\n\n/**\n * @param  {string} key\n * @param  {} value\n * @return {} Removed value\n */\nLRUProto.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        // Reuse last removed entry\n        var entry = this._lastRemovedEntry;\n\n        if (len >= this._maxSize && len > 0) {\n            // Remove the least recently used\n            var leastUsedEntry = list.head;\n            list.remove(leastUsedEntry);\n            delete map[leastUsedEntry.key];\n\n            removed = leastUsedEntry.value;\n            this._lastRemovedEntry = leastUsedEntry;\n        }\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\n    return removed;\n};\n\n/**\n * @param  {string} key\n * @return {}\n */\nLRUProto.get = function (key) {\n    var entry = this._map[key];\n    var list = this._list;\n    if (entry != null) {\n        // Put the latest used entry in the tail\n        if (entry !== list.tail) {\n            list.remove(entry);\n            list.insertEntry(entry);\n        }\n\n        return entry.value;\n    }\n};\n\n/**\n * Clear the cache\n */\nLRUProto.clear = function () {\n    this._list.clear();\n    this._map = {};\n};\n\nexport default LRU;","import LRU from '../core/LRU';\n\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};\n\nfunction clampCssByte(i) {  // Clamp to integer 0 .. 255.\n    i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n    return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clampCssAngle(i) {  // Clamp to integer 0 .. 360.\n    i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n    return i < 0 ? 0 : i > 360 ? 360 : i;\n}\n\nfunction clampCssFloat(f) {  // Clamp to float 0.0 .. 1.0.\n    return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parseCssInt(str) {  // int or percentage.\n    if (str.length && str.charAt(str.length - 1) === '%') {\n        return clampCssByte(parseFloat(str) / 100 * 255);\n    }\n    return clampCssByte(parseInt(str, 10));\n}\n\nfunction parseCssFloat(str) {  // float or percentage.\n    if (str.length && str.charAt(str.length - 1) === '%') {\n        return clampCssFloat(parseFloat(str) / 100);\n    }\n    return clampCssFloat(parseFloat(str));\n}\n\nfunction cssHueToRgb(m1, m2, h) {\n    if (h < 0) {\n        h += 1;\n    }\n    else if (h > 1) {\n        h -= 1;\n    }\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}\n\nfunction lerpNumber(a, b, p) {\n    return a + (b - a) * p;\n}\n\nfunction setRgba(out, r, g, b, a) {\n    out[0] = r; out[1] = g; out[2] = b; out[3] = a;\n    return out;\n}\nfunction copyRgba(out, a) {\n    out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n    return out;\n}\n\nvar colorCache = new LRU(20);\nvar lastRemovedArr = null;\n\nfunction putToCache(colorStr, rgbaArr) {\n    // Reuse removed array\n    if (lastRemovedArr) {\n        copyRgba(lastRemovedArr, rgbaArr);\n    }\n    lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice()));\n}\n\n/**\n * @param {string} colorStr\n * @param {Array.<number>} out\n * @return {Array.<number>}\n * @memberOf module:zrender/util/color\n */\nexport function parse(colorStr, rgbaArr) {\n    if (!colorStr) {\n        return;\n    }\n    rgbaArr = rgbaArr || [];\n\n    var cached = colorCache.get(colorStr);\n    if (cached) {\n        return copyRgba(rgbaArr, cached);\n    }\n\n    // colorStr may be not string\n    colorStr = colorStr + '';\n    // Remove all whitespace, not compliant, but should just be more accepting.\n    var str = colorStr.replace(/ /g, '').toLowerCase();\n\n    // Color keywords (and transparent) lookup.\n    if (str in kCSSColorTable) {\n        copyRgba(rgbaArr, kCSSColorTable[str]);\n        putToCache(colorStr, rgbaArr);\n        return rgbaArr;\n    }\n\n    // #abc and #abc123 syntax.\n    if (str.charAt(0) === '#') {\n        if (str.length === 4) {\n            var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n            if (!(iv >= 0 && iv <= 0xfff)) {\n                setRgba(rgbaArr, 0, 0, 0, 1);\n                return;  // Covers NaN.\n            }\n            setRgba(rgbaArr,\n                ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n                (iv & 0xf0) | ((iv & 0xf0) >> 4),\n                (iv & 0xf) | ((iv & 0xf) << 4),\n                1\n            );\n            putToCache(colorStr, rgbaArr);\n            return rgbaArr;\n        }\n        else if (str.length === 7) {\n            var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n            if (!(iv >= 0 && iv <= 0xffffff)) {\n                setRgba(rgbaArr, 0, 0, 0, 1);\n                return;  // Covers NaN.\n            }\n            setRgba(rgbaArr,\n                (iv & 0xff0000) >> 16,\n                (iv & 0xff00) >> 8,\n                iv & 0xff,\n                1\n            );\n            putToCache(colorStr, rgbaArr);\n            return rgbaArr;\n        }\n\n        return;\n    }\n    var op = str.indexOf('(');\n    var ep = str.indexOf(')');\n    if (op !== -1 && ep + 1 === str.length) {\n        var fname = str.substr(0, op);\n        var params = str.substr(op + 1, ep - (op + 1)).split(',');\n        var alpha = 1;  // To allow case fallthrough.\n        switch (fname) {\n            case 'rgba':\n                if (params.length !== 4) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                alpha = parseCssFloat(params.pop()); // jshint ignore:line\n            // Fall through.\n            case 'rgb':\n                if (params.length !== 3) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                setRgba(rgbaArr,\n                    parseCssInt(params[0]),\n                    parseCssInt(params[1]),\n                    parseCssInt(params[2]),\n                    alpha\n                );\n                putToCache(colorStr, rgbaArr);\n                return rgbaArr;\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\n    setRgba(rgbaArr, 0, 0, 0, 1);\n    return;\n}\n\n/**\n * @param {Array.<number>} hsla\n * @param {Array.<number>} rgba\n * @return {Array.<number>} rgba\n */\nfunction hsla2rgba(hsla, rgba) {\n    var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n    // NOTE(deanm): According to the CSS spec s/l should only be\n    // percentages, but we don't bother and let float or percentage.\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\n    rgba = rgba || [];\n    setRgba(rgba,\n        clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255),\n        clampCssByte(cssHueToRgb(m1, m2, h) * 255),\n        clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255),\n        1\n    );\n\n    if (hsla.length === 4) {\n        rgba[3] = hsla[3];\n    }\n\n    return rgba;\n}\n\n/**\n * @param {Array.<number>} rgba\n * @return {Array.<number>} hsla\n */\nfunction rgba2hsla(rgba) {\n    if (!rgba) {\n        return;\n    }\n\n    // RGB from 0 to 255\n    var R = rgba[0] / 255;\n    var G = rgba[1] / 255;\n    var B = rgba[2] / 255;\n\n    var vMin = Math.min(R, G, B); // Min. value of RGB\n    var vMax = Math.max(R, G, B); // Max. value of RGB\n    var delta = vMax - vMin; // Delta RGB value\n\n    var L = (vMax + vMin) / 2;\n    var H;\n    var S;\n    // HSL results from 0 to 1\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\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\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\n        if (H < 0) {\n            H += 1;\n        }\n\n        if (H > 1) {\n            H -= 1;\n        }\n    }\n\n    var hsla = [H * 360, S, L];\n\n    if (rgba[3] != null) {\n        hsla.push(rgba[3]);\n    }\n\n    return hsla;\n}\n\n/**\n * @param {string} color\n * @param {number} level\n * @return {string}\n * @memberOf module:zrender/util/color\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 (color[i] < 0) {\n                colorArr[i] = 0;\n            }\n        }\n        return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');\n    }\n}\n\n/**\n * @param {string} color\n * @return {string}\n * @memberOf module:zrender/util/color\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}\n\n/**\n * Map value to color. Faster than lerp methods because color is represented by rgba array.\n * @param {number} normalizedValue A float between 0 and 1.\n * @param {Array.<Array.<number>>} colors List of rgba color array\n * @param {Array.<number>} [out] Mapped gba color array\n * @return {Array.<number>} will be null/undefined if input illegal.\n */\nexport function fastLerp(normalizedValue, colors, out) {\n    if (!(colors && colors.length)\n        || !(normalizedValue >= 0 && normalizedValue <= 1)\n    ) {\n        return;\n    }\n\n    out = out || [];\n\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\n    return out;\n}\n\n/**\n * @deprecated\n */\nexport var fastMapToColor = fastLerp;\n\n/**\n * @param {number} normalizedValue A float between 0 and 1.\n * @param {Array.<string>} colors Color list.\n * @param {boolean=} fullOutput Default false.\n * @return {(string|Object)} Result color. If fullOutput,\n *                           return {color: ..., leftIndex: ..., rightIndex: ..., value: ...},\n * @memberOf module:zrender/util/color\n */\nexport function lerp(normalizedValue, colors, fullOutput) {\n    if (!(colors && colors.length)\n        || !(normalizedValue >= 0 && normalizedValue <= 1)\n    ) {\n        return;\n    }\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\n    var color = stringify(\n        [\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        ],\n        'rgba'\n    );\n\n    return fullOutput\n        ? {\n            color: color,\n            leftIndex: leftIndex,\n            rightIndex: rightIndex,\n            value: value\n        }\n        : color;\n}\n\n/**\n * @deprecated\n */\nexport var mapToColor = lerp;\n\n/**\n * @param {string} color\n * @param {number=} h 0 ~ 360, ignore when null.\n * @param {number=} s 0 ~ 1, ignore when null.\n * @param {number=} l 0 ~ 1, ignore when null.\n * @return {string} Color string in rgba format.\n * @memberOf module:zrender/util/color\n */\nexport function modifyHSL(color, h, s, l) {\n    color = parse(color);\n\n    if (color) {\n        color = rgba2hsla(color);\n        h != null && (color[0] = clampCssAngle(h));\n        s != null && (color[1] = parseCssFloat(s));\n        l != null && (color[2] = parseCssFloat(l));\n\n        return stringify(hsla2rgba(color), 'rgba');\n    }\n}\n\n/**\n * @param {string} color\n * @param {number=} alpha 0 ~ 1\n * @return {string} Color string in rgba format.\n * @memberOf module:zrender/util/color\n */\nexport function modifyAlpha(color, alpha) {\n    color = parse(color);\n\n    if (color && alpha != null) {\n        color[3] = clampCssFloat(alpha);\n        return stringify(color, 'rgba');\n    }\n}\n\n/**\n * @param {Array.<number>} arrColor like [12,33,44,0.4]\n * @param {string} type 'rgba', 'hsva', ...\n * @return {string} Result color. (If input illegal, return undefined).\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}\n","/**\n * @module echarts/animation/Animator\n */\n\nimport Clip from './Clip';\nimport * as color from '../tool/color';\nimport {isArrayLike} from '../core/util';\n\nvar arraySlice = Array.prototype.slice;\n\nfunction defaultGetter(target, key) {\n    return target[key];\n}\n\nfunction defaultSetter(target, key, value) {\n    target[key] = value;\n}\n\n/**\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} percent\n * @return {number}\n */\nfunction interpolateNumber(p0, p1, percent) {\n    return (p1 - p0) * percent + p0;\n}\n\n/**\n * @param  {string} p0\n * @param  {string} p1\n * @param  {number} percent\n * @return {string}\n */\nfunction interpolateString(p0, p1, percent) {\n    return percent > 0.5 ? p1 : p0;\n}\n\n/**\n * @param  {Array} p0\n * @param  {Array} p1\n * @param  {number} percent\n * @param  {Array} out\n * @param  {number} arrDim\n */\nfunction interpolateArray(p0, p1, percent, out, arrDim) {\n    var len = p0.length;\n    if (arrDim === 1) {\n        for (var i = 0; i < len; i++) {\n            out[i] = interpolateNumber(p0[i], p1[i], percent);\n        }\n    }\n    else {\n        var len2 = len && p0[0].length;\n        for (var i = 0; i < len; i++) {\n            for (var j = 0; j < len2; j++) {\n                out[i][j] = interpolateNumber(\n                    p0[i][j], p1[i][j], percent\n                );\n            }\n        }\n    }\n}\n\n// arr0 is source array, arr1 is target array.\n// Do some preprocess to avoid error happened when interpolating from arr0 to arr1\nfunction fillArr(arr0, arr1, arrDim) {\n    var arr0Len = arr0.length;\n    var arr1Len = arr1.length;\n    if (arr0Len !== arr1Len) {\n        // FIXME Not work for TypedArray\n        var isPreviousLarger = arr0Len > arr1Len;\n        if (isPreviousLarger) {\n            // Cut the previous\n            arr0.length = arr1Len;\n        }\n        else {\n            // Fill the previous\n            for (var i = arr0Len; i < arr1Len; i++) {\n                arr0.push(\n                    arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])\n                );\n            }\n        }\n    }\n    // Handling NaN value\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}\n\n/**\n * @param  {Array} arr0\n * @param  {Array} arr1\n * @param  {number} arrDim\n * @return {boolean}\n */\nfunction isArraySame(arr0, arr1, arrDim) {\n    if (arr0 === arr1) {\n        return true;\n    }\n    var len = arr0.length;\n    if (len !== arr1.length) {\n        return false;\n    }\n    if (arrDim === 1) {\n        for (var i = 0; i < len; i++) {\n            if (arr0[i] !== arr1[i]) {\n                return false;\n            }\n        }\n    }\n    else {\n        var len2 = arr0[0].length;\n        for (var i = 0; i < len; i++) {\n            for (var j = 0; j < len2; j++) {\n                if (arr0[i][j] !== arr1[i][j]) {\n                    return false;\n                }\n            }\n        }\n    }\n    return true;\n}\n\n/**\n * Catmull Rom interpolate array\n * @param  {Array} p0\n * @param  {Array} p1\n * @param  {Array} p2\n * @param  {Array} p3\n * @param  {number} t\n * @param  {number} t2\n * @param  {number} t3\n * @param  {Array} out\n * @param  {number} arrDim\n */\nfunction catmullRomInterpolateArray(\n    p0, p1, p2, p3, t, t2, t3, out, arrDim\n) {\n    var len = p0.length;\n    if (arrDim === 1) {\n        for (var i = 0; i < len; i++) {\n            out[i] = catmullRomInterpolate(\n                p0[i], p1[i], p2[i], p3[i], t, t2, t3\n            );\n        }\n    }\n    else {\n        var len2 = p0[0].length;\n        for (var i = 0; i < len; i++) {\n            for (var j = 0; j < len2; j++) {\n                out[i][j] = catmullRomInterpolate(\n                    p0[i][j], p1[i][j], p2[i][j], p3[i][j],\n                    t, t2, t3\n                );\n            }\n        }\n    }\n}\n\n/**\n * Catmull Rom interpolate number\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @param  {number} t2\n * @param  {number} t3\n * @return {number}\n */\nfunction catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) {\n    var v0 = (p2 - p0) * 0.5;\n    var v1 = (p3 - p1) * 0.5;\n    return (2 * (p1 - p2) + v0 + v1) * t3\n            + (-3 * (p1 - p2) - 2 * v0 - v1) * t2\n            + v0 * t + p1;\n}\n\nfunction 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\n        return arraySlice.call(value);\n    }\n\n    return value;\n}\n\nfunction rgba2String(rgba) {\n    rgba[0] = Math.floor(rgba[0]);\n    rgba[1] = Math.floor(rgba[1]);\n    rgba[2] = Math.floor(rgba[2]);\n\n    return 'rgba(' + rgba.join(',') + ')';\n}\n\nfunction getArrayDim(keyframes) {\n    var lastValue = keyframes[keyframes.length - 1].value;\n    return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;\n}\n\nfunction createTrackClip(animator, easing, oneTrackDone, keyframes, propName, forceAnimate) {\n    var getter = animator._getter;\n    var setter = animator._setter;\n    var useSpline = easing === 'spline';\n\n    var trackLen = keyframes.length;\n    if (!trackLen) {\n        return;\n    }\n    // Guess data type\n    var firstVal = keyframes[0].value;\n    var isValueArray = isArrayLike(firstVal);\n    var isValueColor = false;\n    var isValueString = false;\n\n    // For vertices morphing\n    var arrDim = isValueArray ? getArrayDim(keyframes) : 0;\n\n    var trackMaxTime;\n    // Sort keyframe as ascending\n    keyframes.sort(function (a, b) {\n        return a.time - b.time;\n    });\n\n    trackMaxTime = keyframes[trackLen - 1].time;\n    // Percents of each keyframe\n    var kfPercents = [];\n    // Value of each keyframe\n    var kfValues = [];\n    var prevValue = keyframes[0].value;\n    var isAllValueEqual = true;\n    for (var i = 0; i < trackLen; i++) {\n        kfPercents.push(keyframes[i].time / trackMaxTime);\n        // Assume value is a color when it is a string\n        var value = keyframes[i].value;\n\n        // Check if value is equal, deep check if value is array\n        if (!((isValueArray && isArraySame(value, prevValue, arrDim))\n            || (!isValueArray && value === prevValue))) {\n            isAllValueEqual = false;\n        }\n        prevValue = value;\n\n        // Try converting a string to a color array\n        if (typeof value === 'string') {\n            var colorArray = color.parse(value);\n            if (colorArray) {\n                value = colorArray;\n                isValueColor = true;\n            }\n            else {\n                isValueString = true;\n            }\n        }\n        kfValues.push(value);\n    }\n    if (!forceAnimate && isAllValueEqual) {\n        return;\n    }\n\n    var lastValue = kfValues[trackLen - 1];\n    // Polyfill array and NaN value\n    for (var i = 0; i < trackLen - 1; i++) {\n        if (isValueArray) {\n            fillArr(kfValues[i], lastValue, arrDim);\n        }\n        else {\n            if (isNaN(kfValues[i]) && !isNaN(lastValue) && !isValueString && !isValueColor) {\n                kfValues[i] = lastValue;\n            }\n        }\n    }\n    isValueArray && fillArr(getter(animator._target, propName), lastValue, arrDim);\n\n    // Cache the key of last frame to speed up when\n    // animation playback is sequency\n    var lastFrame = 0;\n    var lastFramePercent = 0;\n    var start;\n    var w;\n    var p0;\n    var p1;\n    var p2;\n    var p3;\n\n    if (isValueColor) {\n        var rgba = [0, 0, 0, 0];\n    }\n\n    var onframe = function (target, percent) {\n        // Find the range keyframes\n        // kf1-----kf2---------current--------kf3\n        // find kf2 and kf3 and do interpolation\n        var frame;\n        // In the easing function like elasticOut, percent may less than 0\n        if (percent < 0) {\n            frame = 0;\n        }\n        else if (percent < lastFramePercent) {\n            // Start from next key\n            // PENDING start from lastFrame ?\n            start = Math.min(lastFrame + 1, trackLen - 1);\n            for (frame = start; frame >= 0; frame--) {\n                if (kfPercents[frame] <= percent) {\n                    break;\n                }\n            }\n            // PENDING really need to do this ?\n            frame = Math.min(frame, trackLen - 2);\n        }\n        else {\n            for (frame = lastFrame; frame < trackLen; frame++) {\n                if (kfPercents[frame] > percent) {\n                    break;\n                }\n            }\n            frame = Math.min(frame - 1, trackLen - 2);\n        }\n        lastFrame = frame;\n        lastFramePercent = percent;\n\n        var range = (kfPercents[frame + 1] - kfPercents[frame]);\n        if (range === 0) {\n            return;\n        }\n        else {\n            w = (percent - kfPercents[frame]) / range;\n        }\n        if (useSpline) {\n            p1 = kfValues[frame];\n            p0 = kfValues[frame === 0 ? frame : frame - 1];\n            p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1];\n            p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2];\n            if (isValueArray) {\n                catmullRomInterpolateArray(\n                    p0, p1, p2, p3, w, w * w, w * w * w,\n                    getter(target, propName),\n                    arrDim\n                );\n            }\n            else {\n                var value;\n                if (isValueColor) {\n                    value = catmullRomInterpolateArray(\n                        p0, p1, p2, p3, w, w * w, w * w * w,\n                        rgba, 1\n                    );\n                    value = rgba2String(rgba);\n                }\n                else if (isValueString) {\n                    // String is step(0.5)\n                    return interpolateString(p1, p2, w);\n                }\n                else {\n                    value = catmullRomInterpolate(\n                        p0, p1, p2, p3, w, w * w, w * w * w\n                    );\n                }\n                setter(\n                    target,\n                    propName,\n                    value\n                );\n            }\n        }\n        else {\n            if (isValueArray) {\n                interpolateArray(\n                    kfValues[frame], kfValues[frame + 1], w,\n                    getter(target, propName),\n                    arrDim\n                );\n            }\n            else {\n                var value;\n                if (isValueColor) {\n                    interpolateArray(\n                        kfValues[frame], kfValues[frame + 1], w,\n                        rgba, 1\n                    );\n                    value = rgba2String(rgba);\n                }\n                else if (isValueString) {\n                    // String is step(0.5)\n                    return interpolateString(kfValues[frame], kfValues[frame + 1], w);\n                }\n                else {\n                    value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w);\n                }\n                setter(\n                    target,\n                    propName,\n                    value\n                );\n            }\n        }\n    };\n\n    var clip = new Clip({\n        target: animator._target,\n        life: trackMaxTime,\n        loop: animator._loop,\n        delay: animator._delay,\n        onframe: onframe,\n        ondestroy: oneTrackDone\n    });\n\n    if (easing && easing !== 'spline') {\n        clip.easing = easing;\n    }\n\n    return clip;\n}\n\n/**\n * @alias module:zrender/animation/Animator\n * @constructor\n * @param {Object} target\n * @param {boolean} loop\n * @param {Function} getter\n * @param {Function} setter\n */\nvar Animator = function (target, loop, getter, setter) {\n    this._tracks = {};\n    this._target = target;\n\n    this._loop = loop || false;\n\n    this._getter = getter || defaultGetter;\n    this._setter = setter || defaultSetter;\n\n    this._clipCount = 0;\n\n    this._delay = 0;\n\n    this._doneList = [];\n\n    this._onframeList = [];\n\n    this._clipList = [];\n};\n\nAnimator.prototype = {\n    /**\n     * 设置动画关键帧\n     * @param  {number} time 关键帧时间，单位是ms\n     * @param  {Object} props 关键帧的属性值，key-value表示\n     * @return {module:zrender/animation/Animator}\n     */\n    when: function (time /* ms */, props) {\n        var tracks = this._tracks;\n        for (var propName in props) {\n            if (!props.hasOwnProperty(propName)) {\n                continue;\n            }\n\n            if (!tracks[propName]) {\n                tracks[propName] = [];\n                // Invalid value\n                var value = this._getter(this._target, propName);\n                if (value == null) {\n                    // zrLog('Invalid property ' + propName);\n                    continue;\n                }\n                // If time is 0\n                //  Then props is given initialize value\n                // Else\n                //  Initialize value from current prop value\n                if (time !== 0) {\n                    tracks[propName].push({\n                        time: 0,\n                        value: cloneValue(value)\n                    });\n                }\n            }\n            tracks[propName].push({\n                time: time,\n                value: props[propName]\n            });\n        }\n        return this;\n    },\n    /**\n     * 添加动画每一帧的回调函数\n     * @param  {Function} callback\n     * @return {module:zrender/animation/Animator}\n     */\n    during: function (callback) {\n        this._onframeList.push(callback);\n        return this;\n    },\n\n    pause: function () {\n        for (var i = 0; i < this._clipList.length; i++) {\n            this._clipList[i].pause();\n        }\n        this._paused = true;\n    },\n\n    resume: function () {\n        for (var i = 0; i < this._clipList.length; i++) {\n            this._clipList[i].resume();\n        }\n        this._paused = false;\n    },\n\n    isPaused: function () {\n        return !!this._paused;\n    },\n\n    _doneCallback: function () {\n        // Clear all tracks\n        this._tracks = {};\n        // Clear all clips\n        this._clipList.length = 0;\n\n        var doneList = this._doneList;\n        var len = doneList.length;\n        for (var i = 0; i < len; i++) {\n            doneList[i].call(this);\n        }\n    },\n    /**\n     * 开始执行动画\n     * @param  {string|Function} [easing]\n     *         动画缓动函数，详见{@link module:zrender/animation/easing}\n     * @param  {boolean} forceAnimate\n     * @return {module:zrender/animation/Animator}\n     */\n    start: function (easing, forceAnimate) {\n\n        var self = this;\n        var clipCount = 0;\n\n        var oneTrackDone = function () {\n            clipCount--;\n            if (!clipCount) {\n                self._doneCallback();\n            }\n        };\n\n        var lastClip;\n        for (var propName in this._tracks) {\n            if (!this._tracks.hasOwnProperty(propName)) {\n                continue;\n            }\n            var clip = createTrackClip(\n                this, easing, oneTrackDone,\n                this._tracks[propName], propName, forceAnimate\n            );\n            if (clip) {\n                this._clipList.push(clip);\n                clipCount++;\n\n                // If start after added to animation\n                if (this.animation) {\n                    this.animation.addClip(clip);\n                }\n\n                lastClip = clip;\n            }\n        }\n\n        // Add during callback on the last clip\n        if (lastClip) {\n            var oldOnFrame = lastClip.onframe;\n            lastClip.onframe = function (target, percent) {\n                oldOnFrame(target, percent);\n\n                for (var i = 0; i < self._onframeList.length; i++) {\n                    self._onframeList[i](target, percent);\n                }\n            };\n        }\n\n        // This optimization will help the case that in the upper application\n        // the view may be refreshed frequently, where animation will be\n        // called repeatly but nothing changed.\n        if (!clipCount) {\n            this._doneCallback();\n        }\n        return this;\n    },\n    /**\n     * 停止动画\n     * @param {boolean} forwardToLast If move to last frame before stop\n     */\n    stop: function (forwardToLast) {\n        var clipList = this._clipList;\n        var animation = this.animation;\n        for (var i = 0; i < clipList.length; i++) {\n            var clip = clipList[i];\n            if (forwardToLast) {\n                // Move to last frame before stop\n                clip.onframe(this._target, 1);\n            }\n            animation && animation.removeClip(clip);\n        }\n        clipList.length = 0;\n    },\n    /**\n     * 设置动画延迟开始的时间\n     * @param  {number} time 单位ms\n     * @return {module:zrender/animation/Animator}\n     */\n    delay: function (time) {\n        this._delay = time;\n        return this;\n    },\n    /**\n     * 添加动画结束的回调\n     * @param  {Function} cb\n     * @return {module:zrender/animation/Animator}\n     */\n    done: function (cb) {\n        if (cb) {\n            this._doneList.push(cb);\n        }\n        return this;\n    },\n\n    /**\n     * @return {Array.<module:zrender/animation/Clip>}\n     */\n    getClips: function () {\n        return this._clipList;\n    }\n};\n\nexport default Animator;","var dpr = 1;\n\n// If in browser environment\nif (typeof window !== 'undefined') {\n    dpr = Math.max(window.devicePixelRatio || 1, 1);\n}\n\n/**\n * config默认配置项\n * @exports zrender/config\n * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)\n */\n\n/**\n * debug日志选项：catchBrushException为true下有效\n * 0 : 不生成debug数据，发布用\n * 1 : 异常抛出，调试用\n * 2 : 控制台输出，调试用\n */\nexport var debugMode = 0;\n\n// retina 屏幕优化\nexport var devicePixelRatio = dpr;\n","import {debugMode} from '../config';\n\nvar log = function () {\n};\n\nif (debugMode === 1) {\n    log = function () {\n        for (var k in arguments) {\n            throw new Error(arguments[k]);\n        }\n    };\n}\nelse if (debugMode > 1) {\n    log = function () {\n        for (var k in arguments) {\n            console.log(arguments[k]);\n        }\n    };\n}\n\nexport default log;","import Animator from '../animation/Animator';\nimport log from '../core/log';\nimport {\n    isString,\n    isFunction,\n    isObject,\n    isArrayLike,\n    indexOf\n} from '../core/util';\n\n/**\n * @alias modue:zrender/mixin/Animatable\n * @constructor\n */\nvar Animatable = function () {\n\n    /**\n     * @type {Array.<module:zrender/animation/Animator>}\n     * @readOnly\n     */\n    this.animators = [];\n};\n\nAnimatable.prototype = {\n\n    constructor: Animatable,\n\n    /**\n     * 动画\n     *\n     * @param {string} path The path to fetch value from object, like 'a.b.c'.\n     * @param {boolean} [loop] Whether to loop animation.\n     * @return {module:zrender/animation/Animator}\n     * @example:\n     *     el.animate('style', false)\n     *         .when(1000, {x: 10} )\n     *         .done(function(){ // Animation done })\n     *         .start()\n     */\n    animate: function (path, loop) {\n        var target;\n        var animatingShape = false;\n        var el = this;\n        var zr = this.__zr;\n        if (path) {\n            var pathSplitted = path.split('.');\n            var prop = el;\n            // If animating shape\n            animatingShape = pathSplitted[0] === 'shape';\n            for (var i = 0, l = pathSplitted.length; i < l; i++) {\n                if (!prop) {\n                    continue;\n                }\n                prop = prop[pathSplitted[i]];\n            }\n            if (prop) {\n                target = prop;\n            }\n        }\n        else {\n            target = el;\n        }\n\n        if (!target) {\n            log(\n                'Property \"'\n                + path\n                + '\" is not existed in element '\n                + el.id\n            );\n            return;\n        }\n\n        var animators = el.animators;\n\n        var animator = new Animator(target, loop);\n\n        animator.during(function (target) {\n            el.dirty(animatingShape);\n        })\n        .done(function () {\n            // FIXME Animator will not be removed if use `Animator#stop` to stop animation\n            animators.splice(indexOf(animators, animator), 1);\n        });\n\n        animators.push(animator);\n\n        // If animate after added to the zrender\n        if (zr) {\n            zr.animation.addAnimator(animator);\n        }\n\n        return animator;\n    },\n\n    /**\n     * 停止动画\n     * @param {boolean} forwardToLast If move to last frame before stop\n     */\n    stopAnimation: function (forwardToLast) {\n        var animators = this.animators;\n        var len = animators.length;\n        for (var i = 0; i < len; i++) {\n            animators[i].stop(forwardToLast);\n        }\n        animators.length = 0;\n\n        return this;\n    },\n\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     * @param {Object} target\n     * @param {number} [time=500] Time in ms\n     * @param {string} [easing='linear']\n     * @param {number} [delay=0]\n     * @param {Function} [callback]\n     * @param {Function} [forceAnimate] Prevent stop animation and callback\n     *        immediently when target values are the same as current values.\n     *\n     * @example\n     *  // Animate position\n     *  el.animateTo({\n     *      position: [10, 10]\n     *  }, function () { // done })\n     *\n     *  // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing\n     *  el.animateTo({\n     *      shape: {\n     *          width: 500\n     *      },\n     *      style: {\n     *          fill: 'red'\n     *      }\n     *      position: [10, 10]\n     *  }, 100, 100, 'cubicOut', function () { // done })\n     */\n    // TODO Return animation key\n    animateTo: function (target, time, delay, easing, callback, forceAnimate) {\n        animateTo(this, target, time, delay, easing, callback, forceAnimate);\n    },\n\n    /**\n     * Animate from the target state to current state.\n     * The params and the return value are the same as `this.animateTo`.\n     */\n    animateFrom: function (target, time, delay, easing, callback, forceAnimate) {\n        animateTo(this, target, time, delay, easing, callback, forceAnimate, true);\n    }\n};\n\nfunction animateTo(animatable, target, time, delay, easing, callback, forceAnimate, reverse) {\n    // animateTo(target, time, easing, callback);\n    if (isString(delay)) {\n        callback = easing;\n        easing = delay;\n        delay = 0;\n    }\n    // animateTo(target, time, delay, callback);\n    else if (isFunction(easing)) {\n        callback = easing;\n        easing = 'linear';\n        delay = 0;\n    }\n    // animateTo(target, time, callback);\n    else if (isFunction(delay)) {\n        callback = delay;\n        delay = 0;\n    }\n    // animateTo(target, callback)\n    else if (isFunction(time)) {\n        callback = time;\n        time = 500;\n    }\n    // animateTo(target)\n    else if (!time) {\n        time = 500;\n    }\n    // Stop all previous animations\n    animatable.stopAnimation();\n    animateToShallow(animatable, '', animatable, target, time, delay, reverse);\n\n    // Animators may be removed immediately after start\n    // if there is nothing to animate\n    var animators = animatable.animators.slice();\n    var count = animators.length;\n    function done() {\n        count--;\n        if (!count) {\n            callback && callback();\n        }\n    }\n\n    // No animators. This should be checked before animators[i].start(),\n    // because 'done' may be executed immediately if no need to animate.\n    if (!count) {\n        callback && callback();\n    }\n    // Start after all animators created\n    // Incase any animator is done immediately when all animation properties are not changed\n    for (var i = 0; i < animators.length; i++) {\n        animators[i]\n            .done(done)\n            .start(easing, forceAnimate);\n    }\n}\n\n/**\n * @param {string} path=''\n * @param {Object} source=animatable\n * @param {Object} target\n * @param {number} [time=500]\n * @param {number} [delay=0]\n * @param {boolean} [reverse] If `true`, animate\n *        from the `target` to current state.\n *\n * @example\n *  // Animate position\n *  el._animateToShallow({\n *      position: [10, 10]\n *  })\n *\n *  // Animate shape, style and position in 100ms, delayed 100ms\n *  el._animateToShallow({\n *      shape: {\n *          width: 500\n *      },\n *      style: {\n *          fill: 'red'\n *      }\n *      position: [10, 10]\n *  }, 100, 100)\n */\nfunction animateToShallow(animatable, path, source, target, time, delay, reverse) {\n    var objShallow = {};\n    var propertyCount = 0;\n    for (var name in target) {\n        if (!target.hasOwnProperty(name)) {\n            continue;\n        }\n\n        if (source[name] != null) {\n            if (isObject(target[name]) && !isArrayLike(target[name])) {\n                animateToShallow(\n                    animatable,\n                    path ? path + '.' + name : name,\n                    source[name],\n                    target[name],\n                    time,\n                    delay,\n                    reverse\n                );\n            }\n            else {\n                if (reverse) {\n                    objShallow[name] = source[name];\n                    setAttrByPath(animatable, path, name, target[name]);\n                }\n                else {\n                    objShallow[name] = target[name];\n                }\n                propertyCount++;\n            }\n        }\n        else if (target[name] != null && !reverse) {\n            setAttrByPath(animatable, path, name, target[name]);\n        }\n    }\n\n    if (propertyCount > 0) {\n        animatable.animate(path, false)\n            .when(time == null ? 500 : time, objShallow)\n            .delay(delay || 0);\n    }\n}\n\nfunction setAttrByPath(el, path, name, value) {\n    // Attr directly if not has property\n    // FIXME, if some property not needed for element ?\n    if (!path) {\n        el.attr(name, value);\n    }\n    else {\n        // Only support set shape or style\n        var props = {};\n        props[path] = {};\n        props[path][name] = value;\n        el.attr(props);\n    }\n}\n\nexport default Animatable;","import guid from './core/guid';\nimport Eventful from './mixin/Eventful';\nimport Transformable from './mixin/Transformable';\nimport Animatable from './mixin/Animatable';\nimport * as zrUtil from './core/util';\n\n/**\n * @alias module:zrender/Element\n * @constructor\n * @extends {module:zrender/mixin/Animatable}\n * @extends {module:zrender/mixin/Transformable}\n * @extends {module:zrender/mixin/Eventful}\n */\nvar Element = function (opts) { // jshint ignore:line\n\n    Transformable.call(this, opts);\n    Eventful.call(this, opts);\n    Animatable.call(this, opts);\n\n    /**\n     * 画布元素ID\n     * @type {string}\n     */\n    this.id = opts.id || guid();\n};\n\nElement.prototype = {\n\n    /**\n     * 元素类型\n     * Element type\n     * @type {string}\n     */\n    type: 'element',\n\n    /**\n     * 元素名字\n     * Element name\n     * @type {string}\n     */\n    name: '',\n\n    /**\n     * ZRender 实例对象，会在 element 添加到 zrender 实例中后自动赋值\n     * ZRender instance will be assigned when element is associated with zrender\n     * @name module:/zrender/Element#__zr\n     * @type {module:zrender/ZRender}\n     */\n    __zr: null,\n\n    /**\n     * 图形是否忽略，为true时忽略图形的绘制以及事件触发\n     * If ignore drawing and events of the element object\n     * @name module:/zrender/Element#ignore\n     * @type {boolean}\n     * @default false\n     */\n    ignore: false,\n\n    /**\n     * 用于裁剪的路径(shape)，所有 Group 内的路径在绘制时都会被这个路径裁剪\n     * 该路径会继承被裁减对象的变换\n     * @type {module:zrender/graphic/Path}\n     * @see http://www.w3.org/TR/2dcontext/#clipping-region\n     * @readOnly\n     */\n    clipPath: null,\n\n    /**\n     * 是否是 Group\n     * @type {boolean}\n     */\n    isGroup: false,\n\n    /**\n     * Drift element\n     * @param  {number} dx dx on the global space\n     * @param  {number} dy dy on the global space\n     */\n    drift: function (dx, dy) {\n        switch (this.draggable) {\n            case 'horizontal':\n                dy = 0;\n                break;\n            case 'vertical':\n                dx = 0;\n                break;\n        }\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\n        this.decomposeTransform();\n        this.dirty(false);\n    },\n\n    /**\n     * Hook before update\n     */\n    beforeUpdate: function () {},\n    /**\n     * Hook after update\n     */\n    afterUpdate: function () {},\n    /**\n     * Update each frame\n     */\n    update: function () {\n        this.updateTransform();\n    },\n\n    /**\n     * @param  {Function} cb\n     * @param  {}   context\n     */\n    traverse: function (cb, context) {},\n\n    /**\n     * @protected\n     */\n    attrKV: function (key, value) {\n        if (key === 'position' || key === 'scale' || key === 'origin') {\n            // Copy the array\n            if (value) {\n                var target = this[key];\n                if (!target) {\n                    target = this[key] = [];\n                }\n                target[0] = value[0];\n                target[1] = value[1];\n            }\n        }\n        else {\n            this[key] = value;\n        }\n    },\n\n    /**\n     * Hide the element\n     */\n    hide: function () {\n        this.ignore = true;\n        this.__zr && this.__zr.refresh();\n    },\n\n    /**\n     * Show the element\n     */\n    show: function () {\n        this.ignore = false;\n        this.__zr && this.__zr.refresh();\n    },\n\n    /**\n     * @param {string|Object} key\n     * @param {*} value\n     */\n    attr: function (key, value) {\n        if (typeof key === 'string') {\n            this.attrKV(key, value);\n        }\n        else if (zrUtil.isObject(key)) {\n            for (var name in key) {\n                if (key.hasOwnProperty(name)) {\n                    this.attrKV(name, key[name]);\n                }\n            }\n        }\n\n        this.dirty(false);\n\n        return this;\n    },\n\n    /**\n     * @param {module:zrender/graphic/Path} clipPath\n     */\n    setClipPath: function (clipPath) {\n        var zr = this.__zr;\n        if (zr) {\n            clipPath.addSelfToZr(zr);\n        }\n\n        // Remove previous clip path\n        if (this.clipPath && this.clipPath !== clipPath) {\n            this.removeClipPath();\n        }\n\n        this.clipPath = clipPath;\n        clipPath.__zr = zr;\n        clipPath.__clipTarget = this;\n\n        this.dirty(false);\n    },\n\n    /**\n     */\n    removeClipPath: function () {\n        var clipPath = this.clipPath;\n        if (clipPath) {\n            if (clipPath.__zr) {\n                clipPath.removeSelfFromZr(clipPath.__zr);\n            }\n\n            clipPath.__zr = null;\n            clipPath.__clipTarget = null;\n            this.clipPath = null;\n\n            this.dirty(false);\n        }\n    },\n\n    /**\n     * Add self from zrender instance.\n     * Not recursively because it will be invoked when element added to storage.\n     * @param {module:zrender/ZRender} zr\n     */\n    addSelfToZr: function (zr) {\n        this.__zr = zr;\n        // 添加动画\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\n        if (this.clipPath) {\n            this.clipPath.addSelfToZr(zr);\n        }\n    },\n\n    /**\n     * Remove self from zrender instance.\n     * Not recursively because it will be invoked when element added to storage.\n     * @param {module:zrender/ZRender} zr\n     */\n    removeSelfFromZr: function (zr) {\n        this.__zr = null;\n        // 移除动画\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\n        if (this.clipPath) {\n            this.clipPath.removeSelfFromZr(zr);\n        }\n    }\n};\n\nzrUtil.mixin(Element, Animatable);\nzrUtil.mixin(Element, Transformable);\nzrUtil.mixin(Element, Eventful);\n\nexport default Element;","/**\n * @module echarts/core/BoundingRect\n */\n\nimport * as vec2 from './vector';\nimport * as matrix from './matrix';\n\nvar v2ApplyTransform = vec2.applyTransform;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\n\n/**\n * @alias module:echarts/core/BoundingRect\n */\nfunction BoundingRect(x, y, width, height) {\n\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\n    /**\n     * @type {number}\n     */\n    this.x = x;\n    /**\n     * @type {number}\n     */\n    this.y = y;\n    /**\n     * @type {number}\n     */\n    this.width = width;\n    /**\n     * @type {number}\n     */\n    this.height = height;\n}\n\nBoundingRect.prototype = {\n\n    constructor: BoundingRect,\n\n    /**\n     * @param {module:echarts/core/BoundingRect} other\n     */\n    union: function (other) {\n        var x = mathMin(other.x, this.x);\n        var y = mathMin(other.y, this.y);\n\n        this.width = mathMax(\n                other.x + other.width,\n                this.x + this.width\n            ) - x;\n        this.height = mathMax(\n                other.y + other.height,\n                this.y + this.height\n            ) - y;\n        this.x = x;\n        this.y = y;\n    },\n\n    /**\n     * @param {Array.<number>} m\n     * @methods\n     */\n    applyTransform: (function () {\n        var lt = [];\n        var rb = [];\n        var lb = [];\n        var rt = [];\n        return function (m) {\n            // In case usage like this\n            // el.getBoundingRect().applyTransform(el.transform)\n            // And element has no transform\n            if (!m) {\n                return;\n            }\n            lt[0] = lb[0] = this.x;\n            lt[1] = rt[1] = this.y;\n            rb[0] = rt[0] = this.x + this.width;\n            rb[1] = lb[1] = this.y + this.height;\n\n            v2ApplyTransform(lt, lt, m);\n            v2ApplyTransform(rb, rb, m);\n            v2ApplyTransform(lb, lb, m);\n            v2ApplyTransform(rt, rt, m);\n\n            this.x = mathMin(lt[0], rb[0], lb[0], rt[0]);\n            this.y = mathMin(lt[1], rb[1], lb[1], rt[1]);\n            var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]);\n            var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]);\n            this.width = maxX - this.x;\n            this.height = maxY - this.y;\n        };\n    })(),\n\n    /**\n     * Calculate matrix of transforming from self to target rect\n     * @param  {module:zrender/core/BoundingRect} b\n     * @return {Array.<number>}\n     */\n    calculateTransform: function (b) {\n        var a = this;\n        var sx = b.width / a.width;\n        var sy = b.height / a.height;\n\n        var m = matrix.create();\n\n        // 矩阵右乘\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\n        return m;\n    },\n\n    /**\n     * @param {(module:echarts/core/BoundingRect|Object)} b\n     * @return {boolean}\n     */\n    intersect: function (b) {\n        if (!b) {\n            return false;\n        }\n\n        if (!(b instanceof BoundingRect)) {\n            // Normalize negative width/height.\n            b = BoundingRect.create(b);\n        }\n\n        var a = this;\n        var ax0 = a.x;\n        var ax1 = a.x + a.width;\n        var ay0 = a.y;\n        var ay1 = a.y + a.height;\n\n        var bx0 = b.x;\n        var bx1 = b.x + b.width;\n        var by0 = b.y;\n        var by1 = b.y + b.height;\n\n        return !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);\n    },\n\n    contain: function (x, y) {\n        var rect = this;\n        return x >= rect.x\n            && x <= (rect.x + rect.width)\n            && y >= rect.y\n            && y <= (rect.y + rect.height);\n    },\n\n    /**\n     * @return {module:echarts/core/BoundingRect}\n     */\n    clone: function () {\n        return new BoundingRect(this.x, this.y, this.width, this.height);\n    },\n\n    /**\n     * Copy from another rect\n     */\n    copy: function (other) {\n        this.x = other.x;\n        this.y = other.y;\n        this.width = other.width;\n        this.height = other.height;\n    },\n\n    plain: function () {\n        return {\n            x: this.x,\n            y: this.y,\n            width: this.width,\n            height: this.height\n        };\n    }\n};\n\n/**\n * @param {Object|module:zrender/core/BoundingRect} rect\n * @param {number} rect.x\n * @param {number} rect.y\n * @param {number} rect.width\n * @param {number} rect.height\n * @return {module:zrender/core/BoundingRect}\n */\nBoundingRect.create = function (rect) {\n    return new BoundingRect(rect.x, rect.y, rect.width, rect.height);\n};\n\nexport default BoundingRect;","/**\n * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上\n * @module zrender/graphic/Group\n * @example\n *     var Group = require('zrender/container/Group');\n *     var Circle = require('zrender/graphic/shape/Circle');\n *     var g = new Group();\n *     g.position[0] = 100;\n *     g.position[1] = 100;\n *     g.add(new Circle({\n *         style: {\n *             x: 100,\n *             y: 100,\n *             r: 20,\n *         }\n *     }));\n *     zr.add(g);\n */\n\nimport * as zrUtil from '../core/util';\nimport Element from '../Element';\nimport BoundingRect from '../core/BoundingRect';\n\n/**\n * @alias module:zrender/graphic/Group\n * @constructor\n * @extends module:zrender/mixin/Transformable\n * @extends module:zrender/mixin/Eventful\n */\nvar Group = function (opts) {\n\n    opts = opts || {};\n\n    Element.call(this, opts);\n\n    for (var key in opts) {\n        if (opts.hasOwnProperty(key)) {\n            this[key] = opts[key];\n        }\n    }\n\n    this._children = [];\n\n    this.__storage = null;\n\n    this.__dirty = true;\n};\n\nGroup.prototype = {\n\n    constructor: Group,\n\n    isGroup: true,\n\n    /**\n     * @type {string}\n     */\n    type: 'group',\n\n    /**\n     * 所有子孙元素是否响应鼠标事件\n     * @name module:/zrender/container/Group#silent\n     * @type {boolean}\n     * @default false\n     */\n    silent: false,\n\n    /**\n     * @return {Array.<module:zrender/Element>}\n     */\n    children: function () {\n        return this._children.slice();\n    },\n\n    /**\n     * 获取指定 index 的儿子节点\n     * @param  {number} idx\n     * @return {module:zrender/Element}\n     */\n    childAt: function (idx) {\n        return this._children[idx];\n    },\n\n    /**\n     * 获取指定名字的儿子节点\n     * @param  {string} name\n     * @return {module:zrender/Element}\n     */\n    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\n    /**\n     * @return {number}\n     */\n    childCount: function () {\n        return this._children.length;\n    },\n\n    /**\n     * 添加子节点到最后\n     * @param {module:zrender/Element} child\n     */\n    add: function (child) {\n        if (child && child !== this && child.parent !== this) {\n\n            this._children.push(child);\n\n            this._doAdd(child);\n        }\n\n        return this;\n    },\n\n    /**\n     * 添加子节点在 nextSibling 之前\n     * @param {module:zrender/Element} child\n     * @param {module:zrender/Element} nextSibling\n     */\n    addBefore: function (child, nextSibling) {\n        if (child && child !== this && child.parent !== this\n            && nextSibling && nextSibling.parent === this) {\n\n            var children = this._children;\n            var idx = children.indexOf(nextSibling);\n\n            if (idx >= 0) {\n                children.splice(idx, 0, child);\n                this._doAdd(child);\n            }\n        }\n\n        return this;\n    },\n\n    _doAdd: function (child) {\n        if (child.parent) {\n            child.parent.remove(child);\n        }\n\n        child.parent = this;\n\n        var storage = this.__storage;\n        var zr = this.__zr;\n        if (storage && storage !== child.__storage) {\n\n            storage.addToStorage(child);\n\n            if (child instanceof Group) {\n                child.addChildrenToStorage(storage);\n            }\n        }\n\n        zr && zr.refresh();\n    },\n\n    /**\n     * 移除子节点\n     * @param {module:zrender/Element} child\n     */\n    remove: function (child) {\n        var zr = this.__zr;\n        var storage = this.__storage;\n        var children = this._children;\n\n        var idx = zrUtil.indexOf(children, child);\n        if (idx < 0) {\n            return this;\n        }\n        children.splice(idx, 1);\n\n        child.parent = null;\n\n        if (storage) {\n\n            storage.delFromStorage(child);\n\n            if (child instanceof Group) {\n                child.delChildrenFromStorage(storage);\n            }\n        }\n\n        zr && zr.refresh();\n\n        return this;\n    },\n\n    /**\n     * 移除所有子节点\n     */\n    removeAll: function () {\n        var children = this._children;\n        var storage = this.__storage;\n        var child;\n        var i;\n        for (i = 0; i < children.length; i++) {\n            child = children[i];\n            if (storage) {\n                storage.delFromStorage(child);\n                if (child instanceof Group) {\n                    child.delChildrenFromStorage(storage);\n                }\n            }\n            child.parent = null;\n        }\n        children.length = 0;\n\n        return this;\n    },\n\n    /**\n     * 遍历所有子节点\n     * @param  {Function} cb\n     * @param  {}   context\n     */\n    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\n    /**\n     * 深度优先遍历所有子孙节点\n     * @param  {Function} cb\n     * @param  {}   context\n     */\n    traverse: function (cb, context) {\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            cb.call(context, child);\n\n            if (child.type === 'group') {\n                child.traverse(cb, context);\n            }\n        }\n        return this;\n    },\n\n    addChildrenToStorage: function (storage) {\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            storage.addToStorage(child);\n            if (child instanceof Group) {\n                child.addChildrenToStorage(storage);\n            }\n        }\n    },\n\n    delChildrenFromStorage: function (storage) {\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            storage.delFromStorage(child);\n            if (child instanceof Group) {\n                child.delChildrenFromStorage(storage);\n            }\n        }\n    },\n\n    dirty: function () {\n        this.__dirty = true;\n        this.__zr && this.__zr.refresh();\n        return this;\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getBoundingRect: function (includeChildren) {\n        // TODO Caching\n        var rect = null;\n        var tmpRect = new BoundingRect(0, 0, 0, 0);\n        var children = includeChildren || this._children;\n        var tmpMat = [];\n\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            if (child.ignore || child.invisible) {\n                continue;\n            }\n\n            var childRect = child.getBoundingRect();\n            var transform = child.getLocalTransform(tmpMat);\n            // TODO\n            // The boundingRect cacluated by transforming original\n            // rect may be bigger than the actual bundingRect when rotation\n            // is used. (Consider a circle rotated aginst its center, where\n            // the actual boundingRect should be the same as that not be\n            // rotated.) But we can not find better approach to calculate\n            // actual boundingRect yet, considering performance.\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        return rect || tmpRect;\n    }\n};\n\nzrUtil.inherits(Group, Element);\n\nexport default Group;","// https://github.com/mziccard/node-timsort\nvar DEFAULT_MIN_MERGE = 32;\n\nvar DEFAULT_MIN_GALLOPING = 7;\n\nvar DEFAULT_TMP_STORAGE_LENGTH = 256;\n\nfunction minRunLength(n) {\n    var r = 0;\n\n    while (n >= DEFAULT_MIN_MERGE) {\n        r |= n & 1;\n        n >>= 1;\n    }\n\n    return n + r;\n}\n\nfunction makeAscendingRun(array, lo, hi, compare) {\n    var runHi = lo + 1;\n\n    if (runHi === hi) {\n        return 1;\n    }\n\n    if (compare(array[runHi++], array[lo]) < 0) {\n        while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n            runHi++;\n        }\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\n    return runHi - lo;\n}\n\nfunction reverseRun(array, lo, hi) {\n    hi--;\n\n    while (lo < hi) {\n        var t = array[lo];\n        array[lo++] = array[hi];\n        array[hi--] = t;\n    }\n}\n\nfunction binaryInsertionSort(array, lo, hi, start, compare) {\n    if (start === lo) {\n        start++;\n    }\n\n    for (; start < hi; start++) {\n        var pivot = array[start];\n\n        var left = lo;\n        var right = start;\n        var mid;\n\n        while (left < right) {\n            mid = left + right >>> 1;\n\n            if (compare(pivot, array[mid]) < 0) {\n                right = mid;\n            }\n            else {\n                left = mid + 1;\n            }\n        }\n\n        var n = start - left;\n\n        switch (n) {\n            case 3:\n                array[left + 3] = array[left + 2];\n\n            case 2:\n                array[left + 2] = array[left + 1];\n\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\n        array[left] = pivot;\n    }\n}\n\nfunction gallopLeft(value, array, start, length, hint, compare) {\n    var lastOffset = 0;\n    var maxOffset = 0;\n    var offset = 1;\n\n    if (compare(value, array[start + hint]) > 0) {\n        maxOffset = length - hint;\n\n        while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\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\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n\n        var tmp = lastOffset;\n        lastOffset = hint - offset;\n        offset = hint - tmp;\n    }\n\n    lastOffset++;\n    while (lastOffset < offset) {\n        var m = lastOffset + (offset - lastOffset >>> 1);\n\n        if (compare(value, array[start + m]) > 0) {\n            lastOffset = m + 1;\n        }\n        else {\n            offset = m;\n        }\n    }\n    return offset;\n}\n\nfunction gallopRight(value, array, start, length, hint, compare) {\n    var lastOffset = 0;\n    var maxOffset = 0;\n    var offset = 1;\n\n    if (compare(value, array[start + hint]) < 0) {\n        maxOffset = hint + 1;\n\n        while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n\n        var tmp = lastOffset;\n        lastOffset = hint - offset;\n        offset = hint - tmp;\n    }\n    else {\n        maxOffset = length - hint;\n\n        while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n\n        lastOffset += hint;\n        offset += hint;\n    }\n\n    lastOffset++;\n\n    while (lastOffset < offset) {\n        var m = lastOffset + (offset - lastOffset >>> 1);\n\n        if (compare(value, array[start + m]) < 0) {\n            offset = m;\n        }\n        else {\n            lastOffset = m + 1;\n        }\n    }\n\n    return offset;\n}\n\nfunction TimSort(array, compare) {\n    var minGallop = DEFAULT_MIN_GALLOPING;\n    var length = 0;\n    var tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n    var stackLength = 0;\n    var runStart;\n    var runLength;\n    var stackSize = 0;\n\n    length = array.length;\n\n    if (length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n        tmpStorageLength = length >>> 1;\n    }\n\n    var tmp = [];\n\n    stackLength = length < 120 ? 5 : length < 1542 ? 10 : length < 119151 ? 19 : 40;\n\n    runStart = [];\n    runLength = [];\n\n    function pushRun(_runStart, _runLength) {\n        runStart[stackSize] = _runStart;\n        runLength[stackSize] = _runLength;\n        stackSize += 1;\n    }\n\n    function mergeRuns() {\n        while (stackSize > 1) {\n            var n = stackSize - 2;\n\n            if (n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1] || 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\n    function forceMergeRuns() {\n        while (stackSize > 1) {\n            var n = stackSize - 2;\n\n            if (n > 0 && runLength[n - 1] < runLength[n + 1]) {\n                n--;\n            }\n\n            mergeAt(n);\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\n        runLength[i] = length1 + length2;\n\n        if (i === stackSize - 3) {\n            runStart[i + 1] = runStart[i + 2];\n            runLength[i + 1] = runLength[i + 2];\n        }\n\n        stackSize--;\n\n        var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n        start1 += k;\n        length1 -= k;\n\n        if (length1 === 0) {\n            return;\n        }\n\n        length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n        if (length2 === 0) {\n            return;\n        }\n\n        if (length1 <= length2) {\n            mergeLow(start1, length1, start2, length2);\n        }\n        else {\n            mergeHigh(start1, length1, start2, length2);\n        }\n    }\n\n    function mergeLow(start1, length1, start2, length2) {\n        var i = 0;\n\n        for (i = 0; i < length1; i++) {\n            tmp[i] = array[start1 + i];\n        }\n\n        var cursor1 = 0;\n        var cursor2 = start2;\n        var dest = start1;\n\n        array[dest++] = array[cursor2++];\n\n        if (--length2 === 0) {\n            for (i = 0; i < length1; i++) {\n                array[dest + i] = tmp[cursor1 + i];\n            }\n            return;\n        }\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\n        var _minGallop = minGallop;\n        var count1, count2, exit;\n\n        while (1) {\n            count1 = 0;\n            count2 = 0;\n            exit = false;\n\n            do {\n                if (compare(array[cursor2], tmp[cursor1]) < 0) {\n                    array[dest++] = array[cursor2++];\n                    count2++;\n                    count1 = 0;\n\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\n            if (exit) {\n                break;\n            }\n\n            do {\n                count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n                if (count1 !== 0) {\n                    for (i = 0; i < count1; i++) {\n                        array[dest + i] = tmp[cursor1 + i];\n                    }\n\n                    dest += count1;\n                    cursor1 += count1;\n                    length1 -= count1;\n                    if (length1 <= 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n\n                array[dest++] = array[cursor2++];\n\n                if (--length2 === 0) {\n                    exit = true;\n                    break;\n                }\n\n                count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n                if (count2 !== 0) {\n                    for (i = 0; i < count2; i++) {\n                        array[dest + i] = array[cursor2 + i];\n                    }\n\n                    dest += count2;\n                    cursor2 += count2;\n                    length2 -= count2;\n\n                    if (length2 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n                array[dest++] = tmp[cursor1++];\n\n                if (--length1 === 1) {\n                    exit = true;\n                    break;\n                }\n\n                _minGallop--;\n            } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n            if (exit) {\n                break;\n            }\n\n            if (_minGallop < 0) {\n                _minGallop = 0;\n            }\n\n            _minGallop += 2;\n        }\n\n        minGallop = _minGallop;\n\n        minGallop < 1 && (minGallop = 1);\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        }\n        else if (length1 === 0) {\n            throw new Error();\n            // throw new Error('mergeLow preconditions were not respected');\n        }\n        else {\n            for (i = 0; i < length1; i++) {\n                array[dest + i] = tmp[cursor1 + i];\n            }\n        }\n    }\n\n    function mergeHigh(start1, length1, start2, length2) {\n        var i = 0;\n\n        for (i = 0; i < length2; i++) {\n            tmp[i] = array[start2 + i];\n        }\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\n        array[dest--] = array[cursor1--];\n\n        if (--length1 === 0) {\n            customCursor = dest - (length2 - 1);\n\n            for (i = 0; i < length2; i++) {\n                array[customCursor + i] = tmp[i];\n            }\n\n            return;\n        }\n\n        if (length2 === 1) {\n            dest -= length1;\n            cursor1 -= length1;\n            customDest = dest + 1;\n            customCursor = cursor1 + 1;\n\n            for (i = length1 - 1; i >= 0; i--) {\n                array[customDest + i] = array[customCursor + i];\n            }\n\n            array[dest] = tmp[cursor2];\n            return;\n        }\n\n        var _minGallop = minGallop;\n\n        while (true) {\n            var count1 = 0;\n            var count2 = 0;\n            var exit = false;\n\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\n            if (exit) {\n                break;\n            }\n\n            do {\n                count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n                if (count1 !== 0) {\n                    dest -= count1;\n                    cursor1 -= count1;\n                    length1 -= count1;\n                    customDest = dest + 1;\n                    customCursor = cursor1 + 1;\n\n                    for (i = count1 - 1; i >= 0; i--) {\n                        array[customDest + i] = array[customCursor + i];\n                    }\n\n                    if (length1 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n\n                array[dest--] = tmp[cursor2--];\n\n                if (--length2 === 1) {\n                    exit = true;\n                    break;\n                }\n\n                count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n                if (count2 !== 0) {\n                    dest -= count2;\n                    cursor2 -= count2;\n                    length2 -= count2;\n                    customDest = dest + 1;\n                    customCursor = cursor2 + 1;\n\n                    for (i = 0; i < count2; i++) {\n                        array[customDest + i] = tmp[customCursor + i];\n                    }\n\n                    if (length2 <= 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n\n                array[dest--] = array[cursor1--];\n\n                if (--length1 === 0) {\n                    exit = true;\n                    break;\n                }\n\n                _minGallop--;\n            } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n            if (exit) {\n                break;\n            }\n\n            if (_minGallop < 0) {\n                _minGallop = 0;\n            }\n\n            _minGallop += 2;\n        }\n\n        minGallop = _minGallop;\n\n        if (minGallop < 1) {\n            minGallop = 1;\n        }\n\n        if (length2 === 1) {\n            dest -= length1;\n            cursor1 -= length1;\n            customDest = dest + 1;\n            customCursor = cursor1 + 1;\n\n            for (i = length1 - 1; i >= 0; i--) {\n                array[customDest + i] = array[customCursor + i];\n            }\n\n            array[dest] = tmp[cursor2];\n        }\n        else if (length2 === 0) {\n            throw new Error();\n            // throw new Error('mergeHigh preconditions were not respected');\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\n    this.mergeRuns = mergeRuns;\n    this.forceMergeRuns = forceMergeRuns;\n    this.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\n    var remaining = hi - lo;\n\n    if (remaining < 2) {\n        return;\n    }\n\n    var runLength = 0;\n\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\n    var ts = new TimSort(array, compare);\n\n    var minRun = minRunLength(remaining);\n\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\n            binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n            runLength = force;\n        }\n\n        ts.pushRun(lo, runLength);\n        ts.mergeRuns();\n\n        remaining -= runLength;\n        lo += runLength;\n    } while (remaining !== 0);\n\n    ts.forceMergeRuns();\n}\n","import * as util from './core/util';\nimport env from './core/env';\nimport Group from './container/Group';\n\n// Use timsort because in most case elements are partially sorted\n// https://jsfiddle.net/pissang/jr4x7mdm/8/\nimport timsort from './core/timsort';\n\nfunction shapeCompareFunc(a, b) {\n    if (a.zlevel === b.zlevel) {\n        if (a.z === b.z) {\n            // if (a.z2 === b.z2) {\n            //     // FIXME Slow has renderidx compare\n            //     // http://stackoverflow.com/questions/20883421/sorting-in-javascript-should-every-compare-function-have-a-return-0-statement\n            //     // https://github.com/v8/v8/blob/47cce544a31ed5577ffe2963f67acb4144ee0232/src/js/array.js#L1012\n            //     return a.__renderidx - b.__renderidx;\n            // }\n            return a.z2 - b.z2;\n        }\n        return a.z - b.z;\n    }\n    return a.zlevel - b.zlevel;\n}\n/**\n * 内容仓库 (M)\n * @alias module:zrender/Storage\n * @constructor\n */\nvar Storage = function () { // jshint ignore:line\n    this._roots = [];\n\n    this._displayList = [];\n\n    this._displayListLen = 0;\n};\n\nStorage.prototype = {\n\n    constructor: Storage,\n\n    /**\n     * @param  {Function} cb\n     *\n     */\n    traverse: function (cb, context) {\n        for (var i = 0; i < this._roots.length; i++) {\n            this._roots[i].traverse(cb, context);\n        }\n    },\n\n    /**\n     * 返回所有图形的绘制队列\n     * @param {boolean} [update=false] 是否在返回前更新该数组\n     * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组, 在 update 为 true 的时候有效\n     *\n     * 详见{@link module:zrender/graphic/Displayable.prototype.updateDisplayList}\n     * @return {Array.<module:zrender/graphic/Displayable>}\n     */\n    getDisplayList: function (update, includeIgnore) {\n        includeIgnore = includeIgnore || false;\n        if (update) {\n            this.updateDisplayList(includeIgnore);\n        }\n        return this._displayList;\n    },\n\n    /**\n     * 更新图形的绘制队列。\n     * 每次绘制前都会调用，该方法会先深度优先遍历整个树，更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中，\n     * 最后根据绘制的优先级（zlevel > z > 插入顺序）排序得到绘制队列\n     * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组\n     */\n    updateDisplayList: function (includeIgnore) {\n        this._displayListLen = 0;\n\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\n        displayList.length = this._displayListLen;\n\n        env.canvasSupported && timsort(displayList, shapeCompareFunc);\n    },\n\n    _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) {\n\n        if (el.ignore && !includeIgnore) {\n            return;\n        }\n\n        el.beforeUpdate();\n\n        if (el.__dirty) {\n\n            el.update();\n\n        }\n\n        el.afterUpdate();\n\n        var userSetClipPath = el.clipPath;\n        if (userSetClipPath) {\n\n            // FIXME 效率影响\n            if (clipPaths) {\n                clipPaths = clipPaths.slice();\n            }\n            else {\n                clipPaths = [];\n            }\n\n            var currentClipPath = userSetClipPath;\n            var parentClipPath = el;\n            // Recursively add clip path\n            while (currentClipPath) {\n                // clipPath 的变换是基于使用这个 clipPath 的元素\n                currentClipPath.parent = parentClipPath;\n                currentClipPath.updateTransform();\n\n                clipPaths.push(currentClipPath);\n\n                parentClipPath = currentClipPath;\n                currentClipPath = currentClipPath.clipPath;\n            }\n        }\n\n        if (el.isGroup) {\n            var children = el._children;\n\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n\n                // Force to mark as dirty if group is dirty\n                // FIXME __dirtyPath ?\n                if (el.__dirty) {\n                    child.__dirty = true;\n                }\n\n                this._updateAndAddDisplayable(child, clipPaths, includeIgnore);\n            }\n\n            // Mark group clean here\n            el.__dirty = false;\n\n        }\n        else {\n            el.__clipPaths = clipPaths;\n\n            this._displayList[this._displayListLen++] = el;\n        }\n    },\n\n    /**\n     * 添加图形(Shape)或者组(Group)到根节点\n     * @param {module:zrender/Element} el\n     */\n    addRoot: function (el) {\n        if (el.__storage === this) {\n            return;\n        }\n\n        if (el instanceof Group) {\n            el.addChildrenToStorage(this);\n        }\n\n        this.addToStorage(el);\n        this._roots.push(el);\n    },\n\n    /**\n     * 删除指定的图形(Shape)或者组(Group)\n     * @param {string|Array.<string>} [el] 如果为空清空整个Storage\n     */\n    delRoot: function (el) {\n        if (el == null) {\n            // 不指定el清空\n            for (var i = 0; i < this._roots.length; i++) {\n                var root = this._roots[i];\n                if (root instanceof Group) {\n                    root.delChildrenFromStorage(this);\n                }\n            }\n\n            this._roots = [];\n            this._displayList = [];\n            this._displayListLen = 0;\n\n            return;\n        }\n\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\n\n        var idx = util.indexOf(this._roots, el);\n        if (idx >= 0) {\n            this.delFromStorage(el);\n            this._roots.splice(idx, 1);\n            if (el instanceof Group) {\n                el.delChildrenFromStorage(this);\n            }\n        }\n    },\n\n    addToStorage: function (el) {\n        if (el) {\n            el.__storage = this;\n            el.dirty(false);\n        }\n        return this;\n    },\n\n    delFromStorage: function (el) {\n        if (el) {\n            el.__storage = null;\n        }\n\n        return this;\n    },\n\n    /**\n     * 清空并且释放Storage\n     */\n    dispose: function () {\n        this._renderList =\n        this._roots = null;\n    },\n\n    displayableSortFunc: shapeCompareFunc\n};\n\nexport default Storage;","\nvar SHADOW_PROPS = {\n    'shadowBlur': 1,\n    'shadowOffsetX': 1,\n    'shadowOffsetY': 1,\n    'textShadowBlur': 1,\n    'textShadowOffsetX': 1,\n    'textShadowOffsetY': 1,\n    'textBoxShadowBlur': 1,\n    'textBoxShadowOffsetX': 1,\n    'textBoxShadowOffsetY': 1\n};\n\nexport default function (ctx, propName, value) {\n    if (SHADOW_PROPS.hasOwnProperty(propName)) {\n        return value *= ctx.dpr;\n    }\n    return value;\n}\n","\nexport var ContextCachedBy = {\n    NONE: 0,\n    STYLE_BIND: 1,\n    PLAIN_TEXT: 2\n};\n\n// Avoid confused with 0/false.\nexport var WILL_BE_RESTORED = 9;\n","\nimport fixShadow from './helper/fixShadow';\nimport {ContextCachedBy} from './constant';\n\nvar STYLE_COMMON_PROPS = [\n    ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],\n    ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]\n];\n\n// var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);\n// var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);\n\nvar Style = function (opts) {\n    this.extendFrom(opts, false);\n};\n\nfunction 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\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\n    // Fix NaN when rect is Infinity\n    x = isNaN(x) ? 0 : x;\n    x2 = isNaN(x2) ? 1 : x2;\n    y = isNaN(y) ? 0 : y;\n    y2 = isNaN(y2) ? 0 : y2;\n\n    var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);\n\n    return canvasGradient;\n}\n\nfunction createRadialGradient(ctx, obj, rect) {\n    var width = rect.width;\n    var height = rect.height;\n    var min = Math.min(width, height);\n\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\n    var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);\n\n    return canvasGradient;\n}\n\n\nStyle.prototype = {\n\n    constructor: Style,\n\n    /**\n     * @type {string}\n     */\n    fill: '#000',\n\n    /**\n     * @type {string}\n     */\n    stroke: null,\n\n    /**\n     * @type {number}\n     */\n    opacity: 1,\n\n    /**\n     * @type {number}\n     */\n    fillOpacity: null,\n\n    /**\n     * @type {number}\n     */\n    strokeOpacity: null,\n\n    /**\n     * `true` is not supported.\n     * `false`/`null`/`undefined` are the same.\n     * `false` is used to remove lineDash in some \n     * case that `null`/`undefined` can not be set. \n     * (e.g., emphasis.lineStyle in echarts)\n     * @type {Array.<number>|boolean}\n     */\n    lineDash: null,\n\n    /**\n     * @type {number}\n     */\n    lineDashOffset: 0,\n\n    /**\n     * @type {number}\n     */\n    shadowBlur: 0,\n\n    /**\n     * @type {number}\n     */\n    shadowOffsetX: 0,\n\n    /**\n     * @type {number}\n     */\n    shadowOffsetY: 0,\n\n    /**\n     * @type {number}\n     */\n    lineWidth: 1,\n\n    /**\n     * If stroke ignore scale\n     * @type {Boolean}\n     */\n    strokeNoScale: false,\n\n    // Bounding rect text configuration\n    // Not affected by element transform\n    /**\n     * @type {string}\n     */\n    text: null,\n\n    /**\n     * If `fontSize` or `fontFamily` exists, `font` will be reset by\n     * `fontSize`, `fontStyle`, `fontWeight`, `fontFamily`.\n     * So do not visit it directly in upper application (like echarts),\n     * but use `contain/text#makeFont` instead.\n     * @type {string}\n     */\n    font: null,\n\n    /**\n     * The same as font. Use font please.\n     * @deprecated\n     * @type {string}\n     */\n    textFont: null,\n\n    /**\n     * It helps merging respectively, rather than parsing an entire font string.\n     * @type {string}\n     */\n    fontStyle: null,\n\n    /**\n     * It helps merging respectively, rather than parsing an entire font string.\n     * @type {string}\n     */\n    fontWeight: null,\n\n    /**\n     * It helps merging respectively, rather than parsing an entire font string.\n     * Should be 12 but not '12px'.\n     * @type {number}\n     */\n    fontSize: null,\n\n    /**\n     * It helps merging respectively, rather than parsing an entire font string.\n     * @type {string}\n     */\n    fontFamily: null,\n\n    /**\n     * Reserved for special functinality, like 'hr'.\n     * @type {string}\n     */\n    textTag: null,\n\n    /**\n     * @type {string}\n     */\n    textFill: '#000',\n\n    /**\n     * @type {string}\n     */\n    textStroke: null,\n\n    /**\n     * @type {number}\n     */\n    textWidth: null,\n\n    /**\n     * Only for textBackground.\n     * @type {number}\n     */\n    textHeight: null,\n\n    /**\n     * textStroke may be set as some color as a default\n     * value in upper applicaion, where the default value\n     * of textStrokeWidth should be 0 to make sure that\n     * user can choose to do not use text stroke.\n     * @type {number}\n     */\n    textStrokeWidth: 0,\n\n    /**\n     * @type {number}\n     */\n    textLineHeight: null,\n\n    /**\n     * 'inside', 'left', 'right', 'top', 'bottom'\n     * [x, y]\n     * Based on x, y of rect.\n     * @type {string|Array.<number>}\n     * @default 'inside'\n     */\n    textPosition: 'inside',\n\n    /**\n     * If not specified, use the boundingRect of a `displayable`.\n     * @type {Object}\n     */\n    textRect: null,\n\n    /**\n     * [x, y]\n     * @type {Array.<number>}\n     */\n    textOffset: null,\n\n    /**\n     * @type {string}\n     */\n    textAlign: null,\n\n    /**\n     * @type {string}\n     */\n    textVerticalAlign: null,\n\n    /**\n     * @type {number}\n     */\n    textDistance: 5,\n\n    /**\n     * @type {string}\n     */\n    textShadowColor: 'transparent',\n\n    /**\n     * @type {number}\n     */\n    textShadowBlur: 0,\n\n    /**\n     * @type {number}\n     */\n    textShadowOffsetX: 0,\n\n    /**\n     * @type {number}\n     */\n    textShadowOffsetY: 0,\n\n    /**\n     * @type {string}\n     */\n    textBoxShadowColor: 'transparent',\n\n    /**\n     * @type {number}\n     */\n    textBoxShadowBlur: 0,\n\n    /**\n     * @type {number}\n     */\n    textBoxShadowOffsetX: 0,\n\n    /**\n     * @type {number}\n     */\n    textBoxShadowOffsetY: 0,\n\n    /**\n     * Whether transform text.\n     * Only useful in Path and Image element\n     * @type {boolean}\n     */\n    transformText: false,\n\n    /**\n     * Text rotate around position of Path or Image\n     * Only useful in Path and Image element and transformText is false.\n     */\n    textRotation: 0,\n\n    /**\n     * Text origin of text rotation, like [10, 40].\n     * Based on x, y of rect.\n     * Useful in label rotation of circular symbol.\n     * By default, this origin is textPosition.\n     * Can be 'center'.\n     * @type {string|Array.<number>}\n     */\n    textOrigin: null,\n\n    /**\n     * @type {string}\n     */\n    textBackgroundColor: null,\n\n    /**\n     * @type {string}\n     */\n    textBorderColor: null,\n\n    /**\n     * @type {number}\n     */\n    textBorderWidth: 0,\n\n    /**\n     * @type {number}\n     */\n    textBorderRadius: 0,\n\n    /**\n     * Can be `2` or `[2, 4]` or `[2, 3, 4, 5]`\n     * @type {number|Array.<number>}\n     */\n    textPadding: null,\n\n    /**\n     * Text styles for rich text.\n     * @type {Object}\n     */\n    rich: null,\n\n    /**\n     * {outerWidth, outerHeight, ellipsis, placeholder}\n     * @type {Object}\n     */\n    truncate: null,\n\n    /**\n     * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n     * @type {string}\n     */\n    blend: null,\n\n    /**\n     * @param {CanvasRenderingContext2D} ctx\n     */\n    bind: function (ctx, el, prevEl) {\n        var style = this;\n        var prevStyle = prevEl && prevEl.style;\n        // If no prevStyle, it means first draw.\n        // Only apply cache if the last time cachced by this function.\n        var notCheckCache = !prevStyle || ctx.__attrCachedBy !== ContextCachedBy.STYLE_BIND;\n\n        ctx.__attrCachedBy = ContextCachedBy.STYLE_BIND;\n\n        for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n            var prop = STYLE_COMMON_PROPS[i];\n            var styleName = prop[0];\n\n            if (notCheckCache || style[styleName] !== prevStyle[styleName]) {\n                // FIXME Invalid property value will cause style leak from previous element.\n                ctx[styleName] =\n                    fixShadow(ctx, styleName, style[styleName] || prop[1]);\n            }\n        }\n\n        if ((notCheckCache || style.fill !== prevStyle.fill)) {\n            ctx.fillStyle = style.fill;\n        }\n        if ((notCheckCache || style.stroke !== prevStyle.stroke)) {\n            ctx.strokeStyle = style.stroke;\n        }\n        if ((notCheckCache || style.opacity !== prevStyle.opacity)) {\n            ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;\n        }\n\n        if ((notCheckCache || style.blend !== prevStyle.blend)) {\n            ctx.globalCompositeOperation = style.blend || 'source-over';\n        }\n        if (this.hasStroke()) {\n            var lineWidth = style.lineWidth;\n            ctx.lineWidth = lineWidth / (\n                (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1\n            );\n        }\n    },\n\n    hasFill: function () {\n        var fill = this.fill;\n        return fill != null && fill !== 'none';\n    },\n\n    hasStroke: function () {\n        var stroke = this.stroke;\n        return stroke != null && stroke !== 'none' && this.lineWidth > 0;\n    },\n\n    /**\n     * Extend from other style\n     * @param {zrender/graphic/Style} otherStyle\n     * @param {boolean} overwrite true: overwrirte any way.\n     *                            false: overwrite only when !target.hasOwnProperty\n     *                            others: overwrite when property is not null/undefined.\n     */\n    extendFrom: function (otherStyle, overwrite) {\n        if (otherStyle) {\n            for (var name in otherStyle) {\n                if (otherStyle.hasOwnProperty(name)\n                    && (overwrite === true\n                        || (\n                            overwrite === false\n                                ? !this.hasOwnProperty(name)\n                                : otherStyle[name] != null\n                        )\n                    )\n                ) {\n                    this[name] = otherStyle[name];\n                }\n            }\n        }\n    },\n\n    /**\n     * Batch setting style with a given object\n     * @param {Object|string} obj\n     * @param {*} [obj]\n     */\n    set: function (obj, value) {\n        if (typeof obj === 'string') {\n            this[obj] = value;\n        }\n        else {\n            this.extendFrom(obj, true);\n        }\n    },\n\n    /**\n     * Clone\n     * @return {zrender/graphic/Style} [description]\n     */\n    clone: function () {\n        var newStyle = new this.constructor();\n        newStyle.extendFrom(this, true);\n        return newStyle;\n    },\n\n    getGradient: function (ctx, obj, rect) {\n        var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;\n        var canvasGradient = method(ctx, obj, rect);\n        var colorStops = obj.colorStops;\n        for (var i = 0; i < colorStops.length; i++) {\n            canvasGradient.addColorStop(\n                colorStops[i].offset, colorStops[i].color\n            );\n        }\n        return canvasGradient;\n    }\n\n};\n\nvar styleProto = Style.prototype;\nfor (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n    var prop = STYLE_COMMON_PROPS[i];\n    if (!(prop[0] in styleProto)) {\n        styleProto[prop[0]] = prop[1];\n    }\n}\n\n// Provide for others\nStyle.getGradient = styleProto.getGradient;\n\nexport default Style;","\nvar Pattern = function (image, repeat) {\n    // Should do nothing more in this constructor. Because gradient can be\n    // declard by `color: {image: ...}`, where this constructor will not be called.\n\n    this.image = image;\n    this.repeat = repeat;\n\n    // Can be cloned\n    this.type = 'pattern';\n};\n\nPattern.prototype.getCanvasPattern = function (ctx) {\n    return ctx.createPattern(this.image, this.repeat || 'repeat');\n};\n\nexport default Pattern;","/**\n * @module zrender/Layer\n * @author pissang(https://www.github.com/pissang)\n */\n\nimport * as util from './core/util';\nimport {devicePixelRatio} from './config';\nimport Style from './graphic/Style';\nimport Pattern from './graphic/Pattern';\n\nfunction returnFalse() {\n    return false;\n}\n\n/**\n * 创建dom\n *\n * @inner\n * @param {string} id dom id 待用\n * @param {Painter} painter painter instance\n * @param {number} number\n */\nfunction createDom(id, painter, dpr) {\n    var newDom = util.createCanvas();\n    var width = painter.getWidth();\n    var height = painter.getHeight();\n\n    var newDomStyle = newDom.style;\n    if (newDomStyle) {  // In node or some other non-browser environment\n        newDomStyle.position = 'absolute';\n        newDomStyle.left = 0;\n        newDomStyle.top = 0;\n        newDomStyle.width = width + 'px';\n        newDomStyle.height = height + 'px';\n\n        newDom.setAttribute('data-zr-dom-id', id);\n    }\n\n    newDom.width = width * dpr;\n    newDom.height = height * dpr;\n\n    return newDom;\n}\n\n/**\n * @alias module:zrender/Layer\n * @constructor\n * @extends module:zrender/mixin/Transformable\n * @param {string} id\n * @param {module:zrender/Painter} painter\n * @param {number} [dpr]\n */\nvar Layer = function (id, painter, dpr) {\n    var dom;\n    dpr = dpr || devicePixelRatio;\n    if (typeof id === 'string') {\n        dom = createDom(id, painter, dpr);\n    }\n    // Not using isDom because in node it will return false\n    else if (util.isObject(id)) {\n        dom = id;\n        id = dom.id;\n    }\n    this.id = id;\n    this.dom = dom;\n\n    var domStyle = dom.style;\n    if (domStyle) { // Not in node\n        dom.onselectstart = returnFalse; // 避免页面选中的尴尬\n        domStyle['-webkit-user-select'] = 'none';\n        domStyle['user-select'] = 'none';\n        domStyle['-webkit-touch-callout'] = 'none';\n        domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)';\n        domStyle['padding'] = 0;\n        domStyle['margin'] = 0;\n        domStyle['border-width'] = 0;\n    }\n\n    this.domBack = null;\n    this.ctxBack = null;\n\n    this.painter = painter;\n\n    this.config = null;\n\n    // Configs\n    /**\n     * 每次清空画布的颜色\n     * @type {string}\n     * @default 0\n     */\n    this.clearColor = 0;\n    /**\n     * 是否开启动态模糊\n     * @type {boolean}\n     * @default false\n     */\n    this.motionBlur = false;\n    /**\n     * 在开启动态模糊的时候使用，与上一帧混合的alpha值，值越大尾迹越明显\n     * @type {number}\n     * @default 0.7\n     */\n    this.lastFrameAlpha = 0.7;\n\n    /**\n     * Layer dpr\n     * @type {number}\n     */\n    this.dpr = dpr;\n};\n\nLayer.prototype = {\n\n    constructor: Layer,\n\n    __dirty: true,\n\n    __used: false,\n\n    __drawIndex: 0,\n    __startIndex: 0,\n    __endIndex: 0,\n\n    incremental: false,\n\n    getElementCount: function () {\n        return this.__endIndex - this.__startIndex;\n    },\n\n    initContext: function () {\n        this.ctx = this.dom.getContext('2d');\n        this.ctx.dpr = this.dpr;\n    },\n\n    createBackBuffer: function () {\n        var dpr = this.dpr;\n\n        this.domBack = createDom('back-' + this.id, this.painter, dpr);\n        this.ctxBack = this.domBack.getContext('2d');\n\n        if (dpr !== 1) {\n            this.ctxBack.scale(dpr, dpr);\n        }\n    },\n\n    /**\n     * @param  {number} width\n     * @param  {number} height\n     */\n    resize: function (width, height) {\n        var dpr = this.dpr;\n\n        var dom = this.dom;\n        var domStyle = dom.style;\n        var domBack = this.domBack;\n\n        if (domStyle) {\n            domStyle.width = width + 'px';\n            domStyle.height = height + 'px';\n        }\n\n        dom.width = width * dpr;\n        dom.height = height * dpr;\n\n        if (domBack) {\n            domBack.width = width * dpr;\n            domBack.height = height * dpr;\n\n            if (dpr !== 1) {\n                this.ctxBack.scale(dpr, dpr);\n            }\n        }\n    },\n\n    /**\n     * 清空该层画布\n     * @param {boolean} [clearAll]=false Clear all with out motion blur\n     * @param {Color} [clearColor]\n     */\n    clear: function (clearAll, clearColor) {\n        var dom = this.dom;\n        var ctx = this.ctx;\n        var width = dom.width;\n        var height = dom.height;\n\n        var clearColor = clearColor || this.clearColor;\n        var haveMotionBLur = this.motionBlur && !clearAll;\n        var lastFrameAlpha = this.lastFrameAlpha;\n\n        var dpr = this.dpr;\n\n        if (haveMotionBLur) {\n            if (!this.domBack) {\n                this.createBackBuffer();\n            }\n\n            this.ctxBack.globalCompositeOperation = 'copy';\n            this.ctxBack.drawImage(\n                dom, 0, 0,\n                width / dpr,\n                height / dpr\n            );\n        }\n\n        ctx.clearRect(0, 0, width, height);\n        if (clearColor && clearColor !== 'transparent') {\n            var clearColorGradientOrPattern;\n            // Gradient\n            if (clearColor.colorStops) {\n                // Cache canvas gradient\n                clearColorGradientOrPattern = clearColor.__canvasGradient || Style.getGradient(ctx, clearColor, {\n                    x: 0,\n                    y: 0,\n                    width: width,\n                    height: height\n                });\n\n                clearColor.__canvasGradient = clearColorGradientOrPattern;\n            }\n            // Pattern\n            else if (clearColor.image) {\n                clearColorGradientOrPattern = Pattern.prototype.getCanvasPattern.call(clearColor, ctx);\n            }\n            ctx.save();\n            ctx.fillStyle = clearColorGradientOrPattern || clearColor;\n            ctx.fillRect(0, 0, width, height);\n            ctx.restore();\n        }\n\n        if (haveMotionBLur) {\n            var domBack = this.domBack;\n            ctx.save();\n            ctx.globalAlpha = lastFrameAlpha;\n            ctx.drawImage(domBack, 0, 0, width, height);\n            ctx.restore();\n        }\n    }\n};\n\nexport default Layer;","\nexport default (\n    typeof window !== 'undefined'\n    && (\n        (window.requestAnimationFrame && window.requestAnimationFrame.bind(window))\n        // https://github.com/ecomfe/zrender/issues/189#issuecomment-224919809\n        || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window))\n        || window.mozRequestAnimationFrame\n        || window.webkitRequestAnimationFrame\n    )\n) || function (func) {\n    setTimeout(func, 16);\n};","\nimport LRU from '../../core/LRU';\n\nvar globalImageCache = new LRU(50);\n\n/**\n * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc\n * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image\n */\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}\n\n/**\n * Caution: User should cache loaded images, but not just count on LRU.\n * Consider if required images more than LRU size, will dead loop occur?\n *\n * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc\n * @param {HTMLImageElement|HTMLCanvasElement|Canvas} image Existent image.\n * @param {module:zrender/Element} [hostEl] For calling `dirty`.\n * @param {Function} [cb] params: (image, cbPayload)\n * @param {Object} [cbPayload] Payload on cb calling.\n * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image\n */\nexport function createOrUpdateImage(newImageOrSrc, image, hostEl, cb, cbPayload) {\n    if (!newImageOrSrc) {\n        return image;\n    }\n    else if (typeof newImageOrSrc === 'string') {\n\n        // Image should not be loaded repeatly.\n        if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) {\n            return image;\n        }\n\n        // Only when there is no existent image or existent image src\n        // is different, this method is responsible for load.\n        var cachedImgObj = globalImageCache.get(newImageOrSrc);\n\n        var pendingWrap = {hostEl: hostEl, cb: cb, cbPayload: cbPayload};\n\n        if (cachedImgObj) {\n            image = cachedImgObj.image;\n            !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);\n        }\n        else {\n            image = new Image();\n            image.onload = image.onerror = imageOnLoad;\n\n            globalImageCache.put(\n                newImageOrSrc,\n                image.__cachedImgObj = {\n                    image: image,\n                    pending: [pendingWrap]\n                }\n            );\n\n            image.src = image.__zrImageSrc = newImageOrSrc;\n        }\n\n        return image;\n    }\n    // newImageOrSrc is an HTMLImageElement or HTMLCanvasElement or Canvas\n    else {\n        return newImageOrSrc;\n    }\n}\n\nfunction imageOnLoad() {\n    var cachedImgObj = this.__cachedImgObj;\n    this.onload = this.onerror = this.__cachedImgObj = null;\n\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}\n\nexport function isImageReady(image) {\n    return image && image.width && image.height;\n}\n\n","import BoundingRect from '../core/BoundingRect';\nimport * as imageHelper from '../graphic/helper/image';\nimport {\n    getContext,\n    extend,\n    retrieve2,\n    retrieve3,\n    trim\n} from '../core/util';\n\nvar textWidthCache = {};\nvar textWidthCacheCounter = 0;\n\nvar TEXT_CACHE_MAX = 5000;\nvar STYLE_REG = /\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;\n\nexport var DEFAULT_FONT = '12px sans-serif';\n\n// Avoid assign to an exported variable, for transforming to cjs.\nvar methods = {};\n\nexport function $override(name, fn) {\n    methods[name] = fn;\n}\n\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @return {number} width\n */\nexport function getWidth(text, font) {\n    font = font || DEFAULT_FONT;\n    var key = text + ':' + font;\n    if (textWidthCache[key]) {\n        return textWidthCache[key];\n    }\n\n    var textLines = (text + '').split('\\n');\n    var width = 0;\n\n    for (var i = 0, l = textLines.length; i < l; i++) {\n        // textContain.measureText may be overrided in SVG or VML\n        width = Math.max(measureText(textLines[i], font).width, width);\n    }\n\n    if (textWidthCacheCounter > TEXT_CACHE_MAX) {\n        textWidthCacheCounter = 0;\n        textWidthCache = {};\n    }\n    textWidthCacheCounter++;\n    textWidthCache[key] = width;\n\n    return width;\n}\n\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @param {string} [textAlign='left']\n * @param {string} [textVerticalAlign='top']\n * @param {Array.<number>} [textPadding]\n * @param {Object} [rich]\n * @param {Object} [truncate]\n * @return {Object} {x, y, width, height, lineHeight}\n */\nexport function getBoundingRect(text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, rich, truncate) {\n    return rich\n        ? getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, rich, truncate)\n        : getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, truncate);\n}\n\nfunction getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, truncate) {\n    var contentBlock = parsePlainText(text, font, textPadding, textLineHeight, truncate);\n    var outerWidth = getWidth(text, font);\n    if (textPadding) {\n        outerWidth += textPadding[1] + textPadding[3];\n    }\n    var outerHeight = contentBlock.outerHeight;\n\n    var x = adjustTextX(0, outerWidth, textAlign);\n    var y = adjustTextY(0, outerHeight, textVerticalAlign);\n\n    var rect = new BoundingRect(x, y, outerWidth, outerHeight);\n    rect.lineHeight = contentBlock.lineHeight;\n\n    return rect;\n}\n\nfunction getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, rich, truncate) {\n    var contentBlock = parseRichText(text, {\n        rich: rich,\n        truncate: truncate,\n        font: font,\n        textAlign: textAlign,\n        textPadding: textPadding,\n        textLineHeight: textLineHeight\n    });\n    var outerWidth = contentBlock.outerWidth;\n    var outerHeight = contentBlock.outerHeight;\n\n    var x = adjustTextX(0, outerWidth, textAlign);\n    var y = adjustTextY(0, outerHeight, textVerticalAlign);\n\n    return new BoundingRect(x, y, outerWidth, outerHeight);\n}\n\n/**\n * @public\n * @param {number} x\n * @param {number} width\n * @param {string} [textAlign='left']\n * @return {number} Adjusted x.\n */\nexport function adjustTextX(x, width, textAlign) {\n    // FIXME Right to left language\n    if (textAlign === 'right') {\n        x -= width;\n    }\n    else if (textAlign === 'center') {\n        x -= width / 2;\n    }\n    return x;\n}\n\n/**\n * @public\n * @param {number} y\n * @param {number} height\n * @param {string} [textVerticalAlign='top']\n * @return {number} Adjusted y.\n */\nexport function adjustTextY(y, height, textVerticalAlign) {\n    if (textVerticalAlign === 'middle') {\n        y -= height / 2;\n    }\n    else if (textVerticalAlign === 'bottom') {\n        y -= height;\n    }\n    return y;\n}\n\n/**\n * Follow same interface to `Displayable.prototype.calculateTextPosition`.\n * @public\n * @param {Obejct} [out] Prepared out object. If not input, auto created in the method.\n * @param {module:zrender/graphic/Style} style where `textPosition` and `textDistance` are visited.\n * @param {Object} rect {x, y, width, height} Rect of the host elment, according to which the text positioned.\n * @return {Object} The input `out`. Set: {x, y, textAlign, textVerticalAlign}\n */\nexport function calculateTextPosition(out, style, rect) {\n    var textPosition = style.textPosition;\n    var distance = style.textDistance;\n\n    var x = rect.x;\n    var y = rect.y;\n\n    var height = rect.height;\n    var width = rect.width;\n    var halfHeight = height / 2;\n\n    var textAlign = 'left';\n    var textVerticalAlign = 'top';\n\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.textAlign = textAlign;\n    out.textVerticalAlign = textVerticalAlign;\n\n    return out;\n}\n\n/**\n * To be removed. But still do not remove in case that some one has imported it.\n * @deprecated\n * @public\n * @param {stirng} textPosition\n * @param {Object} rect {x, y, width, height}\n * @param {number} distance\n * @return {Object} {x, y, textAlign, textVerticalAlign}\n */\nexport function adjustTextPositionOnRect(textPosition, rect, distance) {\n    var dummyStyle = {textPosition: textPosition, textDistance: distance};\n    return calculateTextPosition({}, dummyStyle, rect);\n}\n\n/**\n * Show ellipsis if overflow.\n *\n * @public\n * @param  {string} text\n * @param  {string} containerWidth\n * @param  {string} font\n * @param  {number} [ellipsis='...']\n * @param  {Object} [options]\n * @param  {number} [options.maxIterations=3]\n * @param  {number} [options.minChar=0] If truncate result are less\n *                  then minChar, ellipsis will not show, which is\n *                  better for user hint in some cases.\n * @param  {number} [options.placeholder=''] When all truncated, use the placeholder.\n * @return {string}\n */\nexport function truncateText(text, containerWidth, font, ellipsis, options) {\n    if (!containerWidth) {\n        return '';\n    }\n\n    var textLines = (text + '').split('\\n');\n    options = prepareTruncateOptions(containerWidth, font, ellipsis, options);\n\n    // FIXME\n    // It is not appropriate that every line has '...' when truncate multiple lines.\n    for (var i = 0, len = textLines.length; i < len; i++) {\n        textLines[i] = truncateSingleLine(textLines[i], options);\n    }\n\n    return textLines.join('\\n');\n}\n\nfunction prepareTruncateOptions(containerWidth, font, ellipsis, options) {\n    options = extend({}, options);\n\n    options.font = font;\n    var ellipsis = retrieve2(ellipsis, '...');\n    options.maxIterations = retrieve2(options.maxIterations, 2);\n    var minChar = options.minChar = retrieve2(options.minChar, 0);\n    // FIXME\n    // Other languages?\n    options.cnCharWidth = getWidth('国', font);\n    // FIXME\n    // Consider proportional font?\n    var ascCharWidth = options.ascCharWidth = getWidth('a', font);\n    options.placeholder = retrieve2(options.placeholder, '');\n\n    // Example 1: minChar: 3, text: 'asdfzxcv', truncate result: 'asdf', but not: 'a...'.\n    // Example 2: minChar: 3, text: '维度', truncate result: '维', but not: '...'.\n    var contentWidth = containerWidth = Math.max(0, containerWidth - 1); // Reserve some gap.\n    for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {\n        contentWidth -= ascCharWidth;\n    }\n\n    var ellipsisWidth = getWidth(ellipsis, font);\n    if (ellipsisWidth > contentWidth) {\n        ellipsis = '';\n        ellipsisWidth = 0;\n    }\n\n    contentWidth = containerWidth - ellipsisWidth;\n\n    options.ellipsis = ellipsis;\n    options.ellipsisWidth = ellipsisWidth;\n    options.contentWidth = contentWidth;\n    options.containerWidth = containerWidth;\n\n    return options;\n}\n\nfunction truncateSingleLine(textLine, options) {\n    var containerWidth = options.containerWidth;\n    var font = options.font;\n    var contentWidth = options.contentWidth;\n\n    if (!containerWidth) {\n        return '';\n    }\n\n    var lineWidth = getWidth(textLine, font);\n\n    if (lineWidth <= containerWidth) {\n        return textLine;\n    }\n\n    for (var j = 0; ; j++) {\n        if (lineWidth <= contentWidth || j >= options.maxIterations) {\n            textLine += options.ellipsis;\n            break;\n        }\n\n        var subLength = j === 0\n            ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth)\n            : lineWidth > 0\n            ? Math.floor(textLine.length * contentWidth / lineWidth)\n            : 0;\n\n        textLine = textLine.substr(0, subLength);\n        lineWidth = getWidth(textLine, font);\n    }\n\n    if (textLine === '') {\n        textLine = options.placeholder;\n    }\n\n    return textLine;\n}\n\nfunction estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {\n    var width = 0;\n    var i = 0;\n    for (var len = text.length; i < len && width < contentWidth; i++) {\n        var charCode = text.charCodeAt(i);\n        width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth;\n    }\n    return i;\n}\n\n/**\n * @public\n * @param {string} font\n * @return {number} line height\n */\nexport function getLineHeight(font) {\n    // FIXME A rough approach.\n    return getWidth('国', font);\n}\n\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @return {Object} width\n */\nexport function measureText(text, font) {\n    return methods.measureText(text, font);\n}\n\n// Avoid assign to an exported variable, for transforming to cjs.\nmethods.measureText = function (text, font) {\n    var ctx = getContext();\n    ctx.font = font || DEFAULT_FONT;\n    return ctx.measureText(text);\n};\n\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @param {Object} [truncate]\n * @return {Object} block: {lineHeight, lines, height, outerHeight}\n *  Notice: for performance, do not calculate outerWidth util needed.\n */\nexport function parsePlainText(text, font, padding, textLineHeight, truncate) {\n    text != null && (text += '');\n\n    var lineHeight = retrieve2(textLineHeight, getLineHeight(font));\n    var lines = text ? text.split('\\n') : [];\n    var height = lines.length * lineHeight;\n    var outerHeight = height;\n\n    if (padding) {\n        outerHeight += padding[0] + padding[2];\n    }\n\n    if (text && truncate) {\n        var truncOuterHeight = truncate.outerHeight;\n        var truncOuterWidth = truncate.outerWidth;\n        if (truncOuterHeight != null && outerHeight > truncOuterHeight) {\n            text = '';\n            lines = [];\n        }\n        else if (truncOuterWidth != null) {\n            var options = prepareTruncateOptions(\n                truncOuterWidth - (padding ? padding[1] + padding[3] : 0),\n                font,\n                truncate.ellipsis,\n                {minChar: truncate.minChar, placeholder: truncate.placeholder}\n            );\n\n            // FIXME\n            // It is not appropriate that every line has '...' when truncate multiple lines.\n            for (var i = 0, len = lines.length; i < len; i++) {\n                lines[i] = truncateSingleLine(lines[i], options);\n            }\n        }\n    }\n\n    return {\n        lines: lines,\n        height: height,\n        outerHeight: outerHeight,\n        lineHeight: lineHeight\n    };\n}\n\n/**\n * For example: 'some text {a|some text}other text{b|some text}xxx{c|}xxx'\n * Also consider 'bbbb{a|xxx\\nzzz}xxxx\\naaaa'.\n *\n * @public\n * @param {string} text\n * @param {Object} style\n * @return {Object} block\n * {\n *      width,\n *      height,\n *      lines: [{\n *          lineHeight,\n *          width,\n *          tokens: [[{\n *              styleName,\n *              text,\n *              width,      // include textPadding\n *              height,     // include textPadding\n *              textWidth, // pure text width\n *              textHeight, // pure text height\n *              lineHeihgt,\n *              font,\n *              textAlign,\n *              textVerticalAlign\n *          }], [...], ...]\n *      }, ...]\n * }\n * If styleName is undefined, it is plain text.\n */\nexport function parseRichText(text, style) {\n    var contentBlock = {lines: [], width: 0, height: 0};\n\n    text != null && (text += '');\n    if (!text) {\n        return contentBlock;\n    }\n\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));\n        }\n        pushTokens(contentBlock, result[2], result[1]);\n        lastIndex = STYLE_REG.lastIndex;\n    }\n\n    if (lastIndex < text.length) {\n        pushTokens(contentBlock, text.substring(lastIndex, text.length));\n    }\n\n    var lines = contentBlock.lines;\n    var contentHeight = 0;\n    var contentWidth = 0;\n    // For `textWidth: 100%`\n    var pendingList = [];\n\n    var stlPadding = style.textPadding;\n\n    var truncate = style.truncate;\n    var truncateWidth = truncate && truncate.outerWidth;\n    var truncateHeight = truncate && truncate.outerHeight;\n    if (stlPadding) {\n        truncateWidth != null && (truncateWidth -= stlPadding[1] + stlPadding[3]);\n        truncateHeight != null && (truncateHeight -= stlPadding[0] + stlPadding[2]);\n    }\n\n    // Calculate layout info of tokens.\n    for (var i = 0; i < lines.length; i++) {\n        var line = lines[i];\n        var lineHeight = 0;\n        var lineWidth = 0;\n\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            // textPadding should not inherit from style.\n            var textPadding = token.textPadding = tokenStyle.textPadding;\n\n            // textFont has been asigned to font by `normalizeStyle`.\n            var font = token.font = tokenStyle.font || style.font;\n\n            // textHeight can be used when textVerticalAlign is specified in token.\n            var tokenHeight = token.textHeight = retrieve2(\n                // textHeight should not be inherited, consider it can be specified\n                // as box height of the block.\n                tokenStyle.textHeight, getLineHeight(font)\n            );\n            textPadding && (tokenHeight += textPadding[0] + textPadding[2]);\n            token.height = tokenHeight;\n            token.lineHeight = retrieve3(\n                tokenStyle.textLineHeight, style.textLineHeight, tokenHeight\n            );\n\n            token.textAlign = tokenStyle && tokenStyle.textAlign || style.textAlign;\n            token.textVerticalAlign = tokenStyle && tokenStyle.textVerticalAlign || 'middle';\n\n            if (truncateHeight != null && contentHeight + token.lineHeight > truncateHeight) {\n                return {lines: [], width: 0, height: 0};\n            }\n\n            token.textWidth = getWidth(token.text, font);\n            var tokenWidth = tokenStyle.textWidth;\n            var tokenWidthNotSpecified = tokenWidth == null || tokenWidth === 'auto';\n\n            // Percent width, can be `100%`, can be used in drawing separate\n            // line when box width is needed to be auto.\n            if (typeof tokenWidth === 'string' && tokenWidth.charAt(tokenWidth.length - 1) === '%') {\n                token.percentWidth = tokenWidth;\n                pendingList.push(token);\n                tokenWidth = 0;\n                // Do not truncate in this case, because there is no user case\n                // and it is too complicated.\n            }\n            else {\n                if (tokenWidthNotSpecified) {\n                    tokenWidth = token.textWidth;\n\n                    // FIXME: If image is not loaded and textWidth is not specified, calling\n                    // `getBoundingRect()` will not get correct result.\n                    var textBackgroundColor = tokenStyle.textBackgroundColor;\n                    var bgImg = textBackgroundColor && textBackgroundColor.image;\n\n                    // Use cases:\n                    // (1) If image is not loaded, it will be loaded at render phase and call\n                    // `dirty()` and `textBackgroundColor.image` will be replaced with the loaded\n                    // image, and then the right size will be calculated here at the next tick.\n                    // See `graphic/helper/text.js`.\n                    // (2) If image loaded, and `textBackgroundColor.image` is image src string,\n                    // use `imageHelper.findExistImage` to find cached image.\n                    // `imageHelper.findExistImage` will always be called here before\n                    // `imageHelper.createOrUpdateImage` in `graphic/helper/text.js#renderRichText`\n                    // which ensures that image will not be rendered before correct size calcualted.\n                    if (bgImg) {\n                        bgImg = imageHelper.findExistImage(bgImg);\n                        if (imageHelper.isImageReady(bgImg)) {\n                            tokenWidth = Math.max(tokenWidth, bgImg.width * tokenHeight / bgImg.height);\n                        }\n                    }\n                }\n\n                var paddingW = textPadding ? textPadding[1] + textPadding[3] : 0;\n                tokenWidth += paddingW;\n\n                var remianTruncWidth = truncateWidth != null ? truncateWidth - lineWidth : null;\n\n                if (remianTruncWidth != null && remianTruncWidth < tokenWidth) {\n                    if (!tokenWidthNotSpecified || remianTruncWidth < paddingW) {\n                        token.text = '';\n                        token.textWidth = tokenWidth = 0;\n                    }\n                    else {\n                        token.text = truncateText(\n                            token.text, remianTruncWidth - paddingW, font, truncate.ellipsis,\n                            {minChar: truncate.minChar}\n                        );\n                        token.textWidth = getWidth(token.text, font);\n                        tokenWidth = token.textWidth + paddingW;\n                    }\n                }\n            }\n\n            lineWidth += (token.width = tokenWidth);\n            tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));\n        }\n\n        line.width = lineWidth;\n        line.lineHeight = lineHeight;\n        contentHeight += lineHeight;\n        contentWidth = Math.max(contentWidth, lineWidth);\n    }\n\n    contentBlock.outerWidth = contentBlock.width = retrieve2(style.textWidth, contentWidth);\n    contentBlock.outerHeight = contentBlock.height = retrieve2(style.textHeight, contentHeight);\n\n    if (stlPadding) {\n        contentBlock.outerWidth += stlPadding[1] + stlPadding[3];\n        contentBlock.outerHeight += stlPadding[0] + stlPadding[2];\n    }\n\n    for (var i = 0; i < pendingList.length; i++) {\n        var token = pendingList[i];\n        var percentWidth = token.percentWidth;\n        // Should not base on outerWidth, because token can not be placed out of padding.\n        token.width = parseInt(percentWidth, 10) / 100 * contentWidth;\n    }\n\n    return contentBlock;\n}\n\nfunction pushTokens(block, str, styleName) {\n    var isEmptyStr = str === '';\n    var strs = str.split('\\n');\n    var lines = block.lines;\n\n    for (var i = 0; i < strs.length; i++) {\n        var text = strs[i];\n        var token = {\n            styleName: styleName,\n            text: text,\n            isLineHolder: !text && !isEmptyStr\n        };\n\n        // The first token should be appended to the last line.\n        if (!i) {\n            var tokens = (lines[lines.length - 1] || (lines[0] = {tokens: []})).tokens;\n\n            // Consider cases:\n            // (1) ''.split('\\n') => ['', '\\n', ''], the '' at the first item\n            // (which is a placeholder) should be replaced by new token.\n            // (2) A image backage, where token likes {a|}.\n            // (3) A redundant '' will affect textAlign in line.\n            // (4) tokens with the same tplName should not be merged, because\n            // they should be displayed in different box (with border and padding).\n            var tokensLen = tokens.length;\n            (tokensLen === 1 && tokens[0].isLineHolder)\n                ? (tokens[0] = token)\n                // Consider text is '', only insert when it is the \"lineHolder\" or\n                // \"emptyStr\". Otherwise a redundant '' will affect textAlign in line.\n                : ((text || !tokensLen || isEmptyStr) && tokens.push(token));\n        }\n        // Other tokens always start a new line.\n        else {\n            // If there is '', insert it as a placeholder.\n            lines.push({tokens: [token]});\n        }\n    }\n}\n\nexport function makeFont(style) {\n    // FIXME in node-canvas fontWeight is before fontStyle\n    // Use `fontSize` `fontFamily` to check whether font properties are defined.\n    var font = (style.fontSize || style.fontFamily) && [\n        style.fontStyle,\n        style.fontWeight,\n        (style.fontSize || 12) + 'px',\n        // If font properties are defined, `fontFamily` should not be ignored.\n        style.fontFamily || 'sans-serif'\n    ].join(' ');\n    return font && trim(font) || style.textFont || style.font;\n}\n","\n/**\n * @param {Object} ctx\n * @param {Object} shape\n * @param {number} shape.x\n * @param {number} shape.y\n * @param {number} shape.width\n * @param {number} shape.height\n * @param {number} shape.r\n */\nexport 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\n    // Convert width and height to positive for better borderRadius\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\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\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","\nimport {\n    retrieve2,\n    retrieve3,\n    each,\n    normalizeCssArray,\n    isString,\n    isObject\n} from '../../core/util';\nimport * as textContain from '../../contain/text';\nimport * as roundRectHelper from './roundRect';\nimport * as imageHelper from './image';\nimport fixShadow from './fixShadow';\nimport {ContextCachedBy, WILL_BE_RESTORED} from '../constant';\n\nvar DEFAULT_FONT = textContain.DEFAULT_FONT;\n\n// TODO: Have not support 'start', 'end' yet.\nvar VALID_TEXT_ALIGN = {left: 1, right: 1, center: 1};\nvar VALID_TEXT_VERTICAL_ALIGN = {top: 1, bottom: 1, middle: 1};\n// Different from `STYLE_COMMON_PROPS` of `graphic/Style`,\n// the default value of shadowColor is `'transparent'`.\nvar SHADOW_STYLE_COMMON_PROPS = [\n    ['textShadowBlur', 'shadowBlur', 0],\n    ['textShadowOffsetX', 'shadowOffsetX', 0],\n    ['textShadowOffsetY', 'shadowOffsetY', 0],\n    ['textShadowColor', 'shadowColor', 'transparent']\n];\nvar _tmpTextPositionResult = {};\nvar _tmpBoxPositionResult = {};\n\n/**\n * @param {module:zrender/graphic/Style} style\n * @return {module:zrender/graphic/Style} The input style.\n */\nexport function normalizeTextStyle(style) {\n    normalizeStyle(style);\n    each(style.rich, normalizeStyle);\n    return style;\n}\n\nfunction normalizeStyle(style) {\n    if (style) {\n\n        style.font = textContain.makeFont(style);\n\n        var textAlign = style.textAlign;\n        textAlign === 'middle' && (textAlign = 'center');\n        style.textAlign = (\n            textAlign == null || VALID_TEXT_ALIGN[textAlign]\n        ) ? textAlign : 'left';\n\n        // Compatible with textBaseline.\n        var textVerticalAlign = style.textVerticalAlign || style.textBaseline;\n        textVerticalAlign === 'center' && (textVerticalAlign = 'middle');\n        style.textVerticalAlign = (\n            textVerticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[textVerticalAlign]\n        ) ? textVerticalAlign : 'top';\n\n        var textPadding = style.textPadding;\n        if (textPadding) {\n            style.textPadding = normalizeCssArray(style.textPadding);\n        }\n    }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {string} text\n * @param {module:zrender/graphic/Style} style\n * @param {Object|boolean} [rect] {x, y, width, height}\n *                  If set false, rect text is not used.\n * @param {Element|module:zrender/graphic/helper/constant.WILL_BE_RESTORED} [prevEl] For ctx prop cache.\n */\nexport function renderText(hostEl, ctx, text, style, rect, prevEl) {\n    style.rich\n        ? renderRichText(hostEl, ctx, text, style, rect, prevEl)\n        : renderPlainText(hostEl, ctx, text, style, rect, prevEl);\n}\n\n// Avoid setting to ctx according to prevEl if possible for\n// performance in scenarios of large amount text.\nfunction renderPlainText(hostEl, ctx, text, style, rect, prevEl) {\n    'use strict';\n\n    var needDrawBg = needDrawBackground(style);\n\n    var prevStyle;\n    var checkCache = false;\n    var cachedByMe = ctx.__attrCachedBy === ContextCachedBy.PLAIN_TEXT;\n\n    // Only take and check cache for `Text` el, but not RectText.\n    if (prevEl !== WILL_BE_RESTORED) {\n        if (prevEl) {\n            prevStyle = prevEl.style;\n            checkCache = !needDrawBg && cachedByMe && prevStyle;\n        }\n\n        // Prevent from using cache in `Style::bind`, because of the case:\n        // ctx property is modified by other properties than `Style::bind`\n        // used, and Style::bind is called next.\n        ctx.__attrCachedBy = needDrawBg ? ContextCachedBy.NONE : ContextCachedBy.PLAIN_TEXT;\n    }\n    // Since this will be restored, prevent from using these props to check cache in the next\n    // entering of this method. But do not need to clear other cache like `Style::bind`.\n    else if (cachedByMe) {\n        ctx.__attrCachedBy = ContextCachedBy.NONE;\n    }\n\n    var styleFont = style.font || DEFAULT_FONT;\n    // PENDING\n    // Only `Text` el set `font` and keep it (`RectText` will restore). So theoretically\n    // we can make font cache on ctx, which can cache for text el that are discontinuous.\n    // But layer save/restore needed to be considered.\n    // if (styleFont !== ctx.__fontCache) {\n    //     ctx.font = styleFont;\n    //     if (prevEl !== WILL_BE_RESTORED) {\n    //         ctx.__fontCache = styleFont;\n    //     }\n    // }\n    if (!checkCache || styleFont !== (prevStyle.font || DEFAULT_FONT)) {\n        ctx.font = styleFont;\n    }\n\n    // Use the final font from context-2d, because the final\n    // font might not be the style.font when it is illegal.\n    // But get `ctx.font` might be time consuming.\n    var computedFont = hostEl.__computedFont;\n    if (hostEl.__styleFont !== styleFont) {\n        hostEl.__styleFont = styleFont;\n        computedFont = hostEl.__computedFont = ctx.font;\n    }\n\n    var textPadding = style.textPadding;\n    var textLineHeight = style.textLineHeight;\n\n    var contentBlock = hostEl.__textCotentBlock;\n    if (!contentBlock || hostEl.__dirtyText) {\n        contentBlock = hostEl.__textCotentBlock = textContain.parsePlainText(\n            text, computedFont, textPadding, textLineHeight, style.truncate\n        );\n    }\n\n    var outerHeight = contentBlock.outerHeight;\n\n    var textLines = contentBlock.lines;\n    var lineHeight = contentBlock.lineHeight;\n\n    var boxPos = getBoxPosition(_tmpBoxPositionResult, hostEl, style, rect);\n    var baseX = boxPos.baseX;\n    var baseY = boxPos.baseY;\n    var textAlign = boxPos.textAlign || 'left';\n    var textVerticalAlign = boxPos.textVerticalAlign;\n\n    // Origin of textRotation should be the base point of text drawing.\n    applyTextRotation(ctx, style, rect, baseX, baseY);\n\n    var boxY = textContain.adjustTextY(baseY, outerHeight, textVerticalAlign);\n    var textX = baseX;\n    var textY = boxY;\n\n    if (needDrawBg || textPadding) {\n        // Consider performance, do not call getTextWidth util necessary.\n        var textWidth = textContain.getWidth(text, computedFont);\n        var outerWidth = textWidth;\n        textPadding && (outerWidth += textPadding[1] + textPadding[3]);\n        var boxX = textContain.adjustTextX(baseX, outerWidth, textAlign);\n\n        needDrawBg && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);\n\n        if (textPadding) {\n            textX = getTextXForPadding(baseX, textAlign, textPadding);\n            textY += textPadding[0];\n        }\n    }\n\n    // Always set textAlign and textBase line, because it is difficute to calculate\n    // textAlign from prevEl, and we dont sure whether textAlign will be reset if\n    // font set happened.\n    ctx.textAlign = textAlign;\n    // Force baseline to be \"middle\". Otherwise, if using \"top\", the\n    // text will offset downward a little bit in font \"Microsoft YaHei\".\n    ctx.textBaseline = 'middle';\n    // Set text opacity\n    ctx.globalAlpha = style.opacity || 1;\n\n    // Always set shadowBlur and shadowOffset to avoid leak from displayable.\n    for (var i = 0; i < SHADOW_STYLE_COMMON_PROPS.length; i++) {\n        var propItem = SHADOW_STYLE_COMMON_PROPS[i];\n        var styleProp = propItem[0];\n        var ctxProp = propItem[1];\n        var val = style[styleProp];\n        if (!checkCache || val !== prevStyle[styleProp]) {\n            ctx[ctxProp] = fixShadow(ctx, ctxProp, val || propItem[2]);\n        }\n    }\n\n    // `textBaseline` is set as 'middle'.\n    textY += lineHeight / 2;\n\n    var textStrokeWidth = style.textStrokeWidth;\n    var textStrokeWidthPrev = checkCache ? prevStyle.textStrokeWidth : null;\n    var strokeWidthChanged = !checkCache || textStrokeWidth !== textStrokeWidthPrev;\n    var strokeChanged = !checkCache || strokeWidthChanged || style.textStroke !== prevStyle.textStroke;\n    var textStroke = getStroke(style.textStroke, textStrokeWidth);\n    var textFill = getFill(style.textFill);\n\n    if (textStroke) {\n        if (strokeWidthChanged) {\n            ctx.lineWidth = textStrokeWidth;\n        }\n        if (strokeChanged) {\n            ctx.strokeStyle = textStroke;\n        }\n    }\n    if (textFill) {\n        if (!checkCache || style.textFill !== prevStyle.textFill) {\n            ctx.fillStyle = textFill;\n        }\n    }\n\n    // Optimize simply, in most cases only one line exists.\n    if (textLines.length === 1) {\n        // Fill after stroke so the outline will not cover the main part.\n        textStroke && ctx.strokeText(textLines[0], textX, textY);\n        textFill && ctx.fillText(textLines[0], textX, textY);\n    }\n    else {\n        for (var i = 0; i < textLines.length; i++) {\n            // Fill after stroke so the outline will not cover the main part.\n            textStroke && ctx.strokeText(textLines[i], textX, textY);\n            textFill && ctx.fillText(textLines[i], textX, textY);\n            textY += lineHeight;\n        }\n    }\n}\n\nfunction renderRichText(hostEl, ctx, text, style, rect, prevEl) {\n    // Do not do cache for rich text because of the complexity.\n    // But `RectText` this will be restored, do not need to clear other cache like `Style::bind`.\n    if (prevEl !== WILL_BE_RESTORED) {\n        ctx.__attrCachedBy = ContextCachedBy.NONE;\n    }\n\n    var contentBlock = hostEl.__textCotentBlock;\n\n    if (!contentBlock || hostEl.__dirtyText) {\n        contentBlock = hostEl.__textCotentBlock = textContain.parseRichText(text, style);\n    }\n\n    drawRichText(hostEl, ctx, contentBlock, style, rect);\n}\n\nfunction drawRichText(hostEl, ctx, contentBlock, style, rect) {\n    var contentWidth = contentBlock.width;\n    var outerWidth = contentBlock.outerWidth;\n    var outerHeight = contentBlock.outerHeight;\n    var textPadding = style.textPadding;\n\n    var boxPos = getBoxPosition(_tmpBoxPositionResult, hostEl, style, rect);\n    var baseX = boxPos.baseX;\n    var baseY = boxPos.baseY;\n    var textAlign = boxPos.textAlign;\n    var textVerticalAlign = boxPos.textVerticalAlign;\n\n    // Origin of textRotation should be the base point of text drawing.\n    applyTextRotation(ctx, style, rect, baseX, baseY);\n\n    var boxX = textContain.adjustTextX(baseX, outerWidth, textAlign);\n    var boxY = textContain.adjustTextY(baseY, outerHeight, textVerticalAlign);\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\n    needDrawBackground(style) && drawBackground(\n        hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight\n    );\n\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 usedWidth = line.width;\n\n        var leftIndex = 0;\n        var lineXLeft = xLeft;\n        var lineXRight = xRight;\n        var rightIndex = tokenCount - 1;\n        var token;\n\n        while (\n            leftIndex < tokenCount\n            && (token = tokens[leftIndex], !token.textAlign || token.textAlign === 'left')\n        ) {\n            placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft, 'left');\n            usedWidth -= token.width;\n            lineXLeft += token.width;\n            leftIndex++;\n        }\n\n        while (\n            rightIndex >= 0\n            && (token = tokens[rightIndex], token.textAlign === 'right')\n        ) {\n            placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXRight, 'right');\n            usedWidth -= token.width;\n            lineXRight -= token.width;\n            rightIndex--;\n        }\n\n        // The other tokens are placed as textAlign 'center' if there is enough space.\n        lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - usedWidth) / 2;\n        while (leftIndex <= rightIndex) {\n            token = tokens[leftIndex];\n            // Consider width specified by user, use 'center' rather than 'left'.\n            placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center');\n            lineXLeft += token.width;\n            leftIndex++;\n        }\n\n        lineTop += lineHeight;\n    }\n}\n\nfunction applyTextRotation(ctx, style, rect, x, y) {\n    // textRotation only apply in RectText.\n    if (rect && style.textRotation) {\n        var origin = style.textOrigin;\n        if (origin === 'center') {\n            x = rect.width / 2 + rect.x;\n            y = rect.height / 2 + rect.y;\n        }\n        else if (origin) {\n            x = origin[0] + rect.x;\n            y = origin[1] + rect.y;\n        }\n\n        ctx.translate(x, y);\n        // Positive: anticlockwise\n        ctx.rotate(-style.textRotation);\n        ctx.translate(-x, -y);\n    }\n}\n\nfunction placeToken(hostEl, ctx, token, style, lineHeight, lineTop, x, textAlign) {\n    var tokenStyle = style.rich[token.styleName] || {};\n    tokenStyle.text = token.text;\n\n    // 'ctx.textBaseline' is always set as 'middle', for sake of\n    // the bias of \"Microsoft YaHei\".\n    var textVerticalAlign = token.textVerticalAlign;\n    var y = lineTop + lineHeight / 2;\n    if (textVerticalAlign === 'top') {\n        y = lineTop + token.height / 2;\n    }\n    else if (textVerticalAlign === 'bottom') {\n        y = lineTop + lineHeight - token.height / 2;\n    }\n\n    !token.isLineHolder && needDrawBackground(tokenStyle) && drawBackground(\n        hostEl,\n        ctx,\n        tokenStyle,\n        textAlign === 'right'\n            ? x - token.width\n            : textAlign === 'center'\n            ? x - token.width / 2\n            : x,\n        y - token.height / 2,\n        token.width,\n        token.height\n    );\n\n    var textPadding = token.textPadding;\n    if (textPadding) {\n        x = getTextXForPadding(x, textAlign, textPadding);\n        y -= token.height / 2 - textPadding[2] - token.textHeight / 2;\n    }\n\n    setCtx(ctx, 'shadowBlur', retrieve3(tokenStyle.textShadowBlur, style.textShadowBlur, 0));\n    setCtx(ctx, 'shadowColor', tokenStyle.textShadowColor || style.textShadowColor || 'transparent');\n    setCtx(ctx, 'shadowOffsetX', retrieve3(tokenStyle.textShadowOffsetX, style.textShadowOffsetX, 0));\n    setCtx(ctx, 'shadowOffsetY', retrieve3(tokenStyle.textShadowOffsetY, style.textShadowOffsetY, 0));\n\n    setCtx(ctx, 'textAlign', textAlign);\n    // Force baseline to be \"middle\". Otherwise, if using \"top\", the\n    // text will offset downward a little bit in font \"Microsoft YaHei\".\n    setCtx(ctx, 'textBaseline', 'middle');\n\n    setCtx(ctx, 'font', token.font || DEFAULT_FONT);\n\n    var textStroke = getStroke(tokenStyle.textStroke || style.textStroke, textStrokeWidth);\n    var textFill = getFill(tokenStyle.textFill || style.textFill);\n    var textStrokeWidth = retrieve2(tokenStyle.textStrokeWidth, style.textStrokeWidth);\n\n    // Fill after stroke so the outline will not cover the main part.\n    if (textStroke) {\n        setCtx(ctx, 'lineWidth', textStrokeWidth);\n        setCtx(ctx, 'strokeStyle', textStroke);\n        ctx.strokeText(token.text, x, y);\n    }\n    if (textFill) {\n        setCtx(ctx, 'fillStyle', textFill);\n        ctx.fillText(token.text, x, y);\n    }\n}\n\nfunction needDrawBackground(style) {\n    return !!(\n        style.textBackgroundColor\n        || (style.textBorderWidth && style.textBorderColor)\n    );\n}\n\n// style: {textBackgroundColor, textBorderWidth, textBorderColor, textBorderRadius, text}\n// shape: {x, y, width, height}\nfunction drawBackground(hostEl, ctx, style, x, y, width, height) {\n    var textBackgroundColor = style.textBackgroundColor;\n    var textBorderWidth = style.textBorderWidth;\n    var textBorderColor = style.textBorderColor;\n    var isPlainBg = isString(textBackgroundColor);\n\n    setCtx(ctx, 'shadowBlur', style.textBoxShadowBlur || 0);\n    setCtx(ctx, 'shadowColor', style.textBoxShadowColor || 'transparent');\n    setCtx(ctx, 'shadowOffsetX', style.textBoxShadowOffsetX || 0);\n    setCtx(ctx, 'shadowOffsetY', style.textBoxShadowOffsetY || 0);\n\n    if (isPlainBg || (textBorderWidth && textBorderColor)) {\n        ctx.beginPath();\n        var textBorderRadius = style.textBorderRadius;\n        if (!textBorderRadius) {\n            ctx.rect(x, y, width, height);\n        }\n        else {\n            roundRectHelper.buildPath(ctx, {\n                x: x, y: y, width: width, height: height, r: textBorderRadius\n            });\n        }\n        ctx.closePath();\n    }\n\n    if (isPlainBg) {\n        setCtx(ctx, 'fillStyle', textBackgroundColor);\n\n        if (style.fillOpacity != null) {\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    }\n    else if (isObject(textBackgroundColor)) {\n        var image = textBackgroundColor.image;\n\n        image = imageHelper.createOrUpdateImage(\n            image, null, hostEl, onBgImageLoaded, textBackgroundColor\n        );\n        if (image && imageHelper.isImageReady(image)) {\n            ctx.drawImage(image, x, y, width, height);\n        }\n    }\n\n    if (textBorderWidth && textBorderColor) {\n        setCtx(ctx, 'lineWidth', textBorderWidth);\n        setCtx(ctx, 'strokeStyle', textBorderColor);\n\n        if (style.strokeOpacity != null) {\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    }\n}\n\nfunction onBgImageLoaded(image, textBackgroundColor) {\n    // Replace image, so that `contain/text.js#parseRichText`\n    // will get correct result in next tick.\n    textBackgroundColor.image = image;\n}\n\nfunction getBoxPosition(out, hostEl, style, rect) {\n    var baseX = style.x || 0;\n    var baseY = style.y || 0;\n    var textAlign = style.textAlign;\n    var textVerticalAlign = style.textVerticalAlign;\n\n    // Text position represented by coord\n    if (rect) {\n        var textPosition = style.textPosition;\n        if (textPosition instanceof Array) {\n            // Percent\n            baseX = rect.x + parsePercent(textPosition[0], rect.width);\n            baseY = rect.y + parsePercent(textPosition[1], rect.height);\n        }\n        else {\n            var res = (hostEl && hostEl.calculateTextPosition)\n                ? hostEl.calculateTextPosition(_tmpTextPositionResult, style, rect)\n                : textContain.calculateTextPosition(_tmpTextPositionResult, style, rect);\n            baseX = res.x;\n            baseY = res.y;\n            // Default align and baseline when has textPosition\n            textAlign = textAlign || res.textAlign;\n            textVerticalAlign = textVerticalAlign || res.textVerticalAlign;\n        }\n\n        // textOffset is only support in RectText, otherwise\n        // we have to adjust boundingRect for textOffset.\n        var textOffset = style.textOffset;\n        if (textOffset) {\n            baseX += textOffset[0];\n            baseY += textOffset[1];\n        }\n    }\n\n    out = out || {};\n    out.baseX = baseX;\n    out.baseY = baseY;\n    out.textAlign = textAlign;\n    out.textVerticalAlign = textVerticalAlign;\n\n    return out;\n}\n\n\nfunction setCtx(ctx, prop, value) {\n    ctx[prop] = fixShadow(ctx, prop, value);\n    return ctx[prop];\n}\n\n/**\n * @param {string} [stroke] If specified, do not check style.textStroke.\n * @param {string} [lineWidth] If specified, do not check style.textStroke.\n * @param {number} style\n */\nexport function getStroke(stroke, lineWidth) {\n    return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none')\n        ? null\n        // TODO pattern and gradient?\n        : (stroke.image || stroke.colorStops)\n        ? '#000'\n        : stroke;\n}\n\nexport function getFill(fill) {\n    return (fill == null || fill === 'none')\n        ? null\n        // TODO pattern and gradient?\n        : (fill.image || fill.colorStops)\n        ? '#000'\n        : fill;\n}\n\nfunction 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}\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}\n\n/**\n * @param {string} text\n * @param {module:zrender/Style} style\n * @return {boolean}\n */\nexport function needDrawText(text, style) {\n    return text != null\n        && (text\n            || style.textBackgroundColor\n            || (style.textBorderWidth && style.textBorderColor)\n            || style.textPadding\n        );\n}\n","/**\n * Mixin for drawing text in a element bounding rect\n * @module zrender/mixin/RectText\n */\n\nimport * as textHelper from '../helper/text';\nimport BoundingRect from '../../core/BoundingRect';\nimport {WILL_BE_RESTORED} from '../constant';\n\nvar tmpRect = new BoundingRect();\n\nvar RectText = function () {};\n\nRectText.prototype = {\n\n    constructor: RectText,\n\n    /**\n     * Draw text in a rect with specified position.\n     * @param  {CanvasRenderingContext2D} ctx\n     * @param  {Object} rect Displayable rect\n     */\n    drawRectText: function (ctx, rect) {\n        var style = this.style;\n\n        rect = style.textRect || rect;\n\n        // Optimize, avoid normalize every time.\n        this.__dirty && textHelper.normalizeTextStyle(style, true);\n\n        var text = style.text;\n\n        // Convert to string\n        text != null && (text += '');\n\n        if (!textHelper.needDrawText(text, style)) {\n            return;\n        }\n\n        // FIXME\n        // Do not provide prevEl to `textHelper.renderText` for ctx prop cache,\n        // but use `ctx.save()` and `ctx.restore()`. Because the cache for rect\n        // text propably break the cache for its host elements.\n        ctx.save();\n\n        // Transform rect to view space\n        var transform = this.transform;\n        if (!style.transformText) {\n            if (transform) {\n                tmpRect.copy(rect);\n                tmpRect.applyTransform(transform);\n                rect = tmpRect;\n            }\n        }\n        else {\n            this.setTransform(ctx);\n        }\n\n        // transformText and textRotation can not be used at the same time.\n        textHelper.renderText(this, ctx, text, style, rect, WILL_BE_RESTORED);\n\n        ctx.restore();\n    }\n};\n\nexport default RectText;","/**\n * 可绘制的图形基类\n * Base class of all displayable graphic objects\n * @module zrender/graphic/Displayable\n */\n\n\nimport * as zrUtil from '../core/util';\nimport Style from './Style';\nimport Element from '../Element';\nimport RectText from './mixin/RectText';\n\n/**\n * @alias module:zrender/graphic/Displayable\n * @extends module:zrender/Element\n * @extends module:zrender/graphic/mixin/RectText\n */\nfunction Displayable(opts) {\n\n    opts = opts || {};\n\n    Element.call(this, opts);\n\n    // Extend properties\n    for (var name in opts) {\n        if (\n            opts.hasOwnProperty(name)\n                && name !== 'style'\n        ) {\n            this[name] = opts[name];\n        }\n    }\n\n    /**\n     * @type {module:zrender/graphic/Style}\n     */\n    this.style = new Style(opts.style, this);\n\n    this._rect = null;\n    // Shapes for cascade clipping.\n    // Can only be `null`/`undefined` or an non-empty array, MUST NOT be an empty array.\n    // because it is easy to only using null to check whether clipPaths changed.\n    this.__clipPaths = null;\n\n    // FIXME Stateful must be mixined after style is setted\n    // Stateful.call(this, opts);\n}\n\nDisplayable.prototype = {\n\n    constructor: Displayable,\n\n    type: 'displayable',\n\n    /**\n     * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制\n     * Dirty flag. From which painter will determine if this displayable object needs brush\n     * @name module:zrender/graphic/Displayable#__dirty\n     * @type {boolean}\n     */\n    __dirty: true,\n\n    /**\n     * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件\n     * If ignore drawing of the displayable object. Mouse event will still be triggered\n     * @name module:/zrender/graphic/Displayable#invisible\n     * @type {boolean}\n     * @default false\n     */\n    invisible: false,\n\n    /**\n     * @name module:/zrender/graphic/Displayable#z\n     * @type {number}\n     * @default 0\n     */\n    z: 0,\n\n    /**\n     * @name module:/zrender/graphic/Displayable#z\n     * @type {number}\n     * @default 0\n     */\n    z2: 0,\n\n    /**\n     * z层level，决定绘画在哪层canvas中\n     * @name module:/zrender/graphic/Displayable#zlevel\n     * @type {number}\n     * @default 0\n     */\n    zlevel: 0,\n\n    /**\n     * 是否可拖拽\n     * @name module:/zrender/graphic/Displayable#draggable\n     * @type {boolean}\n     * @default false\n     */\n    draggable: false,\n\n    /**\n     * 是否正在拖拽\n     * @name module:/zrender/graphic/Displayable#draggable\n     * @type {boolean}\n     * @default false\n     */\n    dragging: false,\n\n    /**\n     * 是否相应鼠标事件\n     * @name module:/zrender/graphic/Displayable#silent\n     * @type {boolean}\n     * @default false\n     */\n    silent: false,\n\n    /**\n     * If enable culling\n     * @type {boolean}\n     * @default false\n     */\n    culling: false,\n\n    /**\n     * Mouse cursor when hovered\n     * @name module:/zrender/graphic/Displayable#cursor\n     * @type {string}\n     */\n    cursor: 'pointer',\n\n    /**\n     * If hover area is bounding rect\n     * @name module:/zrender/graphic/Displayable#rectHover\n     * @type {string}\n     */\n    rectHover: false,\n\n    /**\n     * Render the element progressively when the value >= 0,\n     * usefull for large data.\n     * @type {boolean}\n     */\n    progressive: false,\n\n    /**\n     * @type {boolean}\n     */\n    incremental: false,\n    /**\n     * Scale ratio for global scale.\n     * @type {boolean}\n     */\n    globalScaleRatio: 1,\n\n    beforeBrush: function (ctx) {},\n\n    afterBrush: function (ctx) {},\n\n    /**\n     * 图形绘制方法\n     * @param {CanvasRenderingContext2D} ctx\n     */\n    // Interface\n    brush: function (ctx, prevEl) {},\n\n    /**\n     * 获取最小包围盒\n     * @return {module:zrender/core/BoundingRect}\n     */\n    // Interface\n    getBoundingRect: function () {},\n\n    /**\n     * 判断坐标 x, y 是否在图形上\n     * If displayable element contain coord x, y\n     * @param  {number} x\n     * @param  {number} y\n     * @return {boolean}\n     */\n    contain: function (x, y) {\n        return this.rectContain(x, y);\n    },\n\n    /**\n     * @param  {Function} cb\n     * @param  {}   context\n     */\n    traverse: function (cb, context) {\n        cb.call(context, this);\n    },\n\n    /**\n     * 判断坐标 x, y 是否在图形的包围盒上\n     * If bounding rect of element contain coord x, y\n     * @param  {number} x\n     * @param  {number} y\n     * @return {boolean}\n     */\n    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\n    /**\n     * 标记图形元素为脏，并且在下一帧重绘\n     * Mark displayable element dirty and refresh next frame\n     */\n    dirty: function () {\n        this.__dirty = this.__dirtyText = true;\n\n        this._rect = null;\n\n        this.__zr && this.__zr.refresh();\n    },\n\n    /**\n     * 图形是否会触发事件\n     * If displayable object binded any event\n     * @return {boolean}\n     */\n    // TODO, 通过 bind 绑定的事件\n    // isSilent: function () {\n    //     return !(\n    //         this.hoverable || this.draggable\n    //         || this.onmousemove || this.onmouseover || this.onmouseout\n    //         || this.onmousedown || this.onmouseup || this.onclick\n    //         || this.ondragenter || this.ondragover || this.ondragleave\n    //         || this.ondrop\n    //     );\n    // },\n    /**\n     * Alias for animate('style')\n     * @param {boolean} loop\n     */\n    animateStyle: function (loop) {\n        return this.animate('style', loop);\n    },\n\n    attrKV: function (key, value) {\n        if (key !== 'style') {\n            Element.prototype.attrKV.call(this, key, value);\n        }\n        else {\n            this.style.set(value);\n        }\n    },\n\n    /**\n     * @param {Object|string} key\n     * @param {*} value\n     */\n    setStyle: function (key, value) {\n        this.style.set(key, value);\n        this.dirty(false);\n        return this;\n    },\n\n    /**\n     * Use given style object\n     * @param  {Object} obj\n     */\n    useStyle: function (obj) {\n        this.style = new Style(obj, this);\n        this.dirty(false);\n        return this;\n    },\n\n    /**\n     * The string value of `textPosition` needs to be calculated to a real postion.\n     * For example, `'inside'` is calculated to `[rect.width/2, rect.height/2]`\n     * by default. See `contain/text.js#calculateTextPosition` for more details.\n     * But some coutom shapes like \"pin\", \"flag\" have center that is not exactly\n     * `[width/2, height/2]`. So we provide this hook to customize the calculation\n     * for those shapes. It will be called if the `style.textPosition` is a string.\n     * @param {Obejct} [out] Prepared out object. If not provided, this method should\n     *        be responsible for creating one.\n     * @param {module:zrender/graphic/Style} style\n     * @param {Object} rect {x, y, width, height}\n     * @return {Obejct} out The same as the input out.\n     *         {\n     *             x: number. mandatory.\n     *             y: number. mandatory.\n     *             textAlign: string. optional. use style.textAlign by default.\n     *             textVerticalAlign: string. optional. use style.textVerticalAlign by default.\n     *         }\n     */\n    calculateTextPosition: null\n};\n\nzrUtil.inherits(Displayable, Element);\n\nzrUtil.mixin(Displayable, RectText);\n// zrUtil.mixin(Displayable, Stateful);\n\nexport default Displayable;","import Displayable from './Displayable';\nimport BoundingRect from '../core/BoundingRect';\nimport * as zrUtil from '../core/util';\nimport * as imageHelper from './helper/image';\n\n/**\n * @alias zrender/graphic/Image\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\nfunction ZImage(opts) {\n    Displayable.call(this, opts);\n}\n\nZImage.prototype = {\n\n    constructor: ZImage,\n\n    type: 'image',\n\n    brush: function (ctx, prevEl) {\n        var style = this.style;\n        var src = style.image;\n\n        // Must bind each time\n        style.bind(ctx, this, prevEl);\n\n        var image = this._image = imageHelper.createOrUpdateImage(\n            src,\n            this._image,\n            this,\n            this.onload\n        );\n\n        if (!image || !imageHelper.isImageReady(image)) {\n            return;\n        }\n\n        // 图片已经加载完成\n        // if (image.nodeName.toUpperCase() == 'IMG') {\n        //     if (!image.complete) {\n        //         return;\n        //     }\n        // }\n        // Else is canvas\n\n        var x = style.x || 0;\n        var y = style.y || 0;\n        var width = style.width;\n        var height = style.height;\n        var aspect = image.width / image.height;\n        if (width == null && height != null) {\n            // Keep image/height ratio\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\n        // 设置transform\n        this.setTransform(ctx);\n\n        if (style.sWidth && style.sHeight) {\n            var sx = style.sx || 0;\n            var sy = style.sy || 0;\n            ctx.drawImage(\n                image,\n                sx, sy, style.sWidth, style.sHeight,\n                x, y, width, height\n            );\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(\n                image,\n                sx, sy, sWidth, sHeight,\n                x, y, width, height\n            );\n        }\n        else {\n            ctx.drawImage(image, x, y, width, height);\n        }\n\n        // Draw rect text\n        if (style.text != null) {\n            // Only restore transform when needs draw text.\n            this.restoreTransform(ctx);\n            this.drawRectText(ctx, this.getBoundingRect());\n        }\n    },\n\n    getBoundingRect: function () {\n        var style = this.style;\n        if (!this._rect) {\n            this._rect = new BoundingRect(\n                style.x || 0, style.y || 0, style.width || 0, style.height || 0\n            );\n        }\n        return this._rect;\n    }\n};\n\nzrUtil.inherits(ZImage, Displayable);\n\nexport default ZImage;","import {devicePixelRatio} from './config';\nimport * as util from './core/util';\nimport log from './core/log';\nimport BoundingRect from './core/BoundingRect';\nimport timsort from './core/timsort';\nimport Layer from './Layer';\nimport requestAnimationFrame from './animation/requestAnimationFrame';\nimport Image from './graphic/Image';\nimport env from './core/env';\n\nvar HOVER_LAYER_ZLEVEL = 1e5;\nvar CANVAS_ZLEVEL = 314159;\n\nvar EL_AFTER_INCREMENTAL_INC = 0.01;\nvar INCREMENTAL_INC = 0.001;\n\nfunction parseInt10(val) {\n    return parseInt(val, 10);\n}\n\nfunction isLayerValid(layer) {\n    if (!layer) {\n        return false;\n    }\n\n    if (layer.__builtin__) {\n        return true;\n    }\n\n    if (typeof (layer.resize) !== 'function'\n        || typeof (layer.refresh) !== 'function'\n    ) {\n        return false;\n    }\n\n    return true;\n}\n\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}\n\nfunction isClipPathChanged(clipPaths, prevClipPaths) {\n    // displayable.__clipPaths can only be `null`/`undefined` or an non-empty array.\n    if (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}\n\nfunction doClip(clipPaths, ctx) {\n    for (var i = 0; i < clipPaths.length; i++) {\n        var clipPath = clipPaths[i];\n\n        clipPath.setTransform(ctx);\n        ctx.beginPath();\n        clipPath.buildPath(ctx, clipPath.shape);\n        ctx.clip();\n        // Transform back\n        clipPath.restoreTransform(ctx);\n    }\n}\n\nfunction createRoot(width, height) {\n    var domRoot = document.createElement('div');\n\n    // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬\n    domRoot.style.cssText = [\n        'position:relative',\n        'overflow:hidden',\n        'width:' + width + 'px',\n        'height:' + height + 'px',\n        'padding:0',\n        'margin:0',\n        'border-width:0'\n    ].join(';') + ';';\n\n    return domRoot;\n}\n\n\n/**\n * @alias module:zrender/Painter\n * @constructor\n * @param {HTMLElement} root 绘图容器\n * @param {module:zrender/Storage} storage\n * @param {Object} opts\n */\nvar Painter = function (root, storage, opts) {\n\n    this.type = 'canvas';\n\n    // In node environment using node-canvas\n    var singleCanvas = !root.nodeName // In node ?\n        || root.nodeName.toUpperCase() === 'CANVAS';\n\n    this._opts = opts = util.extend({}, opts || {});\n\n    /**\n     * @type {number}\n     */\n    this.dpr = opts.devicePixelRatio || devicePixelRatio;\n    /**\n     * @type {boolean}\n     * @private\n     */\n    this._singleCanvas = singleCanvas;\n    /**\n     * 绘图容器\n     * @type {HTMLElement}\n     */\n    this.root = root;\n\n    var rootStyle = root.style;\n\n    if (rootStyle) {\n        rootStyle['-webkit-tap-highlight-color'] = 'transparent';\n        rootStyle['-webkit-user-select'] =\n        rootStyle['user-select'] =\n        rootStyle['-webkit-touch-callout'] = 'none';\n\n        root.innerHTML = '';\n    }\n\n    /**\n     * @type {module:zrender/Storage}\n     */\n    this.storage = storage;\n\n    /**\n     * @type {Array.<number>}\n     * @private\n     */\n    var zlevelList = this._zlevelList = [];\n\n    /**\n     * @type {Object.<string, module:zrender/Layer>}\n     * @private\n     */\n    var layers = this._layers = {};\n\n    /**\n     * @type {Object.<string, Object>}\n     * @private\n     */\n    this._layerConfig = {};\n\n    /**\n     * zrender will do compositing when root is a canvas and have multiple zlevels.\n     */\n    this._needsManuallyCompositing = false;\n\n    if (!singleCanvas) {\n        this._width = this._getSize(0);\n        this._height = this._getSize(1);\n\n        var domRoot = this._domRoot = createRoot(\n            this._width, this._height\n        );\n        root.appendChild(domRoot);\n    }\n    else {\n        var width = root.width;\n        var height = root.height;\n\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\n        // Use canvas width and height directly\n        root.width = width * this.dpr;\n        root.height = height * this.dpr;\n\n        this._width = width;\n        this._height = height;\n\n        // Create layer if only one given canvas\n        // Device can be specified to create a high dpi image.\n        var mainLayer = new Layer(root, this, this.dpr);\n        mainLayer.__builtin__ = true;\n        mainLayer.initContext();\n        // FIXME Use canvas width and height\n        // mainLayer.resize(width, height);\n        layers[CANVAS_ZLEVEL] = mainLayer;\n        mainLayer.zlevel = CANVAS_ZLEVEL;\n        // Not use common zlevel.\n        zlevelList.push(CANVAS_ZLEVEL);\n\n        this._domRoot = root;\n    }\n\n    /**\n     * @type {module:zrender/Layer}\n     * @private\n     */\n    this._hoverlayer = null;\n\n    this._hoverElements = [];\n};\n\nPainter.prototype = {\n\n    constructor: Painter,\n\n    getType: function () {\n        return 'canvas';\n    },\n\n    /**\n     * If painter use a single canvas\n     * @return {boolean}\n     */\n    isSingleCanvas: function () {\n        return this._singleCanvas;\n    },\n    /**\n     * @return {HTMLDivElement}\n     */\n    getViewportRoot: function () {\n        return this._domRoot;\n    },\n\n    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\n    /**\n     * 刷新\n     * @param {boolean} [paintAll=false] 强制绘制所有displayable\n     */\n    refresh: function (paintAll) {\n\n        var list = this.storage.getDisplayList(true);\n\n        var zlevelList = this._zlevelList;\n\n        this._redrawId = Math.random();\n\n        this._paintList(list, paintAll, this._redrawId);\n\n        // Paint custum layers\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\n        this.refreshHover();\n\n        return this;\n    },\n\n    addHover: function (el, hoverStyle) {\n        if (el.__hoverMir) {\n            return;\n        }\n        var elMirror = new el.constructor({\n            style: el.style,\n            shape: el.shape,\n            z: el.z,\n            z2: el.z2,\n            silent: el.silent\n        });\n        elMirror.__from = el;\n        el.__hoverMir = elMirror;\n        hoverStyle && elMirror.setStyle(hoverStyle);\n        this._hoverElements.push(elMirror);\n\n        return elMirror;\n    },\n\n    removeHover: function (el) {\n        var elMirror = el.__hoverMir;\n        var hoverElements = this._hoverElements;\n        var idx = util.indexOf(hoverElements, elMirror);\n        if (idx >= 0) {\n            hoverElements.splice(idx, 1);\n        }\n        el.__hoverMir = null;\n    },\n\n    clearHover: function (el) {\n        var hoverElements = this._hoverElements;\n        for (var i = 0; i < hoverElements.length; i++) {\n            var from = hoverElements[i].__from;\n            if (from) {\n                from.__hoverMir = null;\n            }\n        }\n        hoverElements.length = 0;\n    },\n\n    refreshHover: function () {\n        var hoverElements = this._hoverElements;\n        var len = hoverElements.length;\n        var hoverLayer = this._hoverlayer;\n        hoverLayer && hoverLayer.clear();\n\n        if (!len) {\n            return;\n        }\n        timsort(hoverElements, this.storage.displayableSortFunc);\n\n        // Use a extream large zlevel\n        // FIXME?\n        if (!hoverLayer) {\n            hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL);\n        }\n\n        var scope = {};\n        hoverLayer.ctx.save();\n        for (var i = 0; i < len;) {\n            var el = hoverElements[i];\n            var originalEl = el.__from;\n            // Original el is removed\n            // PENDING\n            if (!(originalEl && originalEl.__zr)) {\n                hoverElements.splice(i, 1);\n                originalEl.__hoverMir = null;\n                len--;\n                continue;\n            }\n            i++;\n\n            // Use transform\n            // FIXME style and shape ?\n            if (!originalEl.invisible) {\n                el.transform = originalEl.transform;\n                el.invTransform = originalEl.invTransform;\n                el.__clipPaths = originalEl.__clipPaths;\n                // el.\n                this._doPaintEl(el, hoverLayer, true, scope);\n            }\n        }\n\n        hoverLayer.ctx.restore();\n    },\n\n    getHoverLayer: function () {\n        return this.getLayer(HOVER_LAYER_ZLEVEL);\n    },\n\n    _paintList: function (list, paintAll, redrawId) {\n        if (this._redrawId !== redrawId) {\n            return;\n        }\n\n        paintAll = paintAll || false;\n\n        this._updateLayerStatus(list);\n\n        var finished = this._doPaintList(list, paintAll);\n\n        if (this._needsManuallyCompositing) {\n            this._compositeManually();\n        }\n\n        if (!finished) {\n            var self = this;\n            requestAnimationFrame(function () {\n                self._paintList(list, paintAll, redrawId);\n            });\n        }\n    },\n\n    _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        // PENDING, If only builtin layer?\n        this.eachBuiltinLayer(function (layer) {\n            if (layer.virtual) {\n                ctx.drawImage(layer.dom, 0, 0, width, height);\n            }\n        });\n    },\n\n    _doPaintList: function (list, paintAll) {\n        var layerList = [];\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            ) {\n                layerList.push(layer);\n            }\n        }\n\n        var finished = true;\n\n        for (var k = 0; k < layerList.length; k++) {\n            var layer = layerList[k];\n            var ctx = layer.ctx;\n            var scope = {};\n            ctx.save();\n\n            var start = paintAll ? layer.__startIndex : layer.__drawIndex;\n\n            var useTimer = !paintAll && layer.incremental && Date.now;\n            var startTime = useTimer && Date.now();\n\n            var clearColor = layer.zlevel === this._zlevelList[0]\n                ? this._backgroundColor : null;\n            // All elements in this layer are cleared.\n            if (layer.__startIndex === layer.__endIndex) {\n                layer.clear(false, clearColor);\n            }\n            else if (start === layer.__startIndex) {\n                var firstEl = list[start];\n                if (!firstEl.incremental || !firstEl.notClear || paintAll) {\n                    layer.clear(false, clearColor);\n                }\n            }\n            if (start === -1) {\n                console.error('For some unknown reason. drawIndex is -1');\n                start = layer.__startIndex;\n            }\n            for (var i = start; i < layer.__endIndex; i++) {\n                var el = list[i];\n                this._doPaintEl(el, layer, paintAll, scope);\n                el.__dirty = el.__dirtyText = false;\n\n                if (useTimer) {\n                    // Date.now can be executed in 13,025,305 ops/second.\n                    var dTime = Date.now() - startTime;\n                    // Give 15 millisecond to draw.\n                    // The rest elements will be drawn in the next frame.\n                    if (dTime > 15) {\n                        break;\n                    }\n                }\n            }\n\n            layer.__drawIndex = i;\n\n            if (layer.__drawIndex < layer.__endIndex) {\n                finished = false;\n            }\n\n            if (scope.prevElClipPaths) {\n                // Needs restore the state. If last drawn element is in the clipping area.\n                ctx.restore();\n            }\n\n            ctx.restore();\n        }\n\n        if (env.wxa) {\n            // Flush for weixin application\n            util.each(this._layers, function (layer) {\n                if (layer && layer.ctx && layer.ctx.draw) {\n                    layer.ctx.draw();\n                }\n            });\n        }\n\n        return finished;\n    },\n\n    _doPaintEl: function (el, currentLayer, forcePaint, scope) {\n        var ctx = currentLayer.ctx;\n        var m = el.transform;\n        if (\n            (currentLayer.__dirty || forcePaint)\n            // Ignore invisible element\n            && !el.invisible\n            // Ignore transparent element\n            && el.style.opacity !== 0\n            // Ignore scale 0 element, in some environment like node-canvas\n            // Draw a scale 0 element can cause all following draw wrong\n            // And setTransform with scale 0 will cause set back transform failed.\n            && !(m && !m[0] && !m[3])\n            // Ignore culled element\n            && !(el.culling && isDisplayableCulled(el, this._width, this._height))\n        ) {\n\n            var clipPaths = el.__clipPaths;\n            var prevElClipPaths = scope.prevElClipPaths;\n\n            // Optimize when clipping on group with several elements\n            if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) {\n                // If has previous clipping state, restore from it\n                if (prevElClipPaths) {\n                    ctx.restore();\n                    scope.prevElClipPaths = null;\n                    // Reset prevEl since context has been restored\n                    scope.prevEl = null;\n                }\n                // New clipping state\n                if (clipPaths) {\n                    ctx.save();\n                    doClip(clipPaths, ctx);\n                    scope.prevElClipPaths = clipPaths;\n                }\n            }\n            el.beforeBrush && el.beforeBrush(ctx);\n\n            el.brush(ctx, scope.prevEl || null);\n            scope.prevEl = el;\n\n            el.afterBrush && el.afterBrush(ctx);\n        }\n    },\n\n    /**\n     * 获取 zlevel 所在层，如果不存在则会创建一个新的层\n     * @param {number} zlevel\n     * @param {boolean} virtual Virtual layer will not be inserted into dom.\n     * @return {module:zrender/Layer}\n     */\n    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            // Create a new layer\n            layer = new Layer('zr_' + zlevel, this, this.dpr);\n            layer.zlevel = zlevel;\n            layer.__builtin__ = true;\n\n            if (this._layerConfig[zlevel]) {\n                util.merge(layer, this._layerConfig[zlevel], true);\n            }\n\n            if (virtual) {\n                layer.virtual = virtual;\n            }\n\n            this.insertLayer(zlevel, layer);\n\n            // Context is created after dom inserted to document\n            // Or excanvas will get 0px clientWidth and clientHeight\n            layer.initContext();\n        }\n\n        return layer;\n    },\n\n    insertLayer: function (zlevel, layer) {\n\n        var layersMap = this._layers;\n        var zlevelList = this._zlevelList;\n        var len = zlevelList.length;\n        var prevLayer = null;\n        var i = -1;\n        var domRoot = this._domRoot;\n\n        if (layersMap[zlevel]) {\n            log('ZLevel ' + zlevel + ' has been used already');\n            return;\n        }\n        // Check if is a valid layer\n        if (!isLayerValid(layer)) {\n            log('Layer of zlevel ' + zlevel + ' is not valid');\n            return;\n        }\n\n        if (len > 0 && zlevel > zlevelList[0]) {\n            for (i = 0; i < len - 1; i++) {\n                if (\n                    zlevelList[i] < zlevel\n                    && zlevelList[i + 1] > zlevel\n                ) {\n                    break;\n                }\n            }\n            prevLayer = layersMap[zlevelList[i]];\n        }\n        zlevelList.splice(i + 1, 0, zlevel);\n\n        layersMap[zlevel] = layer;\n\n        // Vitual layer will not directly show on the screen.\n        // (It can be a WebGL layer and assigned to a ZImage element)\n        // But it still under management of zrender.\n        if (!layer.virtual) {\n            if (prevLayer) {\n                var prevDom = prevLayer.dom;\n                if (prevDom.nextSibling) {\n                    domRoot.insertBefore(\n                        layer.dom,\n                        prevDom.nextSibling\n                    );\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    },\n\n    // Iterate each layer\n    eachLayer: function (cb, context) {\n        var zlevelList = this._zlevelList;\n        var z;\n        var i;\n        for (i = 0; i < zlevelList.length; i++) {\n            z = zlevelList[i];\n            cb.call(context, this._layers[z], z);\n        }\n    },\n\n    // Iterate each buildin layer\n    eachBuiltinLayer: function (cb, context) {\n        var zlevelList = this._zlevelList;\n        var layer;\n        var z;\n        var i;\n        for (i = 0; i < zlevelList.length; i++) {\n            z = zlevelList[i];\n            layer = this._layers[z];\n            if (layer.__builtin__) {\n                cb.call(context, layer, z);\n            }\n        }\n    },\n\n    // Iterate each other layer except buildin layer\n    eachOtherLayer: function (cb, context) {\n        var zlevelList = this._zlevelList;\n        var layer;\n        var z;\n        var i;\n        for (i = 0; i < zlevelList.length; i++) {\n            z = zlevelList[i];\n            layer = this._layers[z];\n            if (!layer.__builtin__) {\n                cb.call(context, layer, z);\n            }\n        }\n    },\n\n    /**\n     * 获取所有已创建的层\n     * @param {Array.<module:zrender/Layer>} [prevLayer]\n     */\n    getLayers: function () {\n        return this._layers;\n    },\n\n    _updateLayerStatus: function (list) {\n\n        this.eachBuiltinLayer(function (layer, z) {\n            layer.__dirty = layer.__used = false;\n        });\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\n        if (this._singleCanvas) {\n            for (var i = 1; i < list.length; i++) {\n                var el = list[i];\n                if (el.zlevel !== list[i - 1].zlevel || el.incremental) {\n                    this._needsManuallyCompositing = true;\n                    break;\n                }\n            }\n        }\n\n        var prevLayer = null;\n        var incrementalLayerCount = 0;\n        for (var i = 0; i < list.length; i++) {\n            var el = list[i];\n            var zlevel = el.zlevel;\n            var layer;\n            // PENDING If change one incremental element style ?\n            // TODO Where there are non-incremental elements between incremental elements.\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\n            if (!layer.__builtin__) {\n                log('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id);\n            }\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                    // Mark layer draw index needs to update.\n                    layer.__drawIndex = -1;\n                }\n                updatePrevLayer(i);\n                prevLayer = layer;\n            }\n            if (el.__dirty) {\n                layer.__dirty = true;\n                if (layer.incremental && layer.__drawIndex < 0) {\n                    // Start draw from the first dirty element.\n                    layer.__drawIndex = i;\n                }\n            }\n        }\n\n        updatePrevLayer(i);\n\n        this.eachBuiltinLayer(function (layer, z) {\n            // Used in last frame but not in this frame. Needs clear\n            if (!layer.__used && layer.getElementCount() > 0) {\n                layer.__dirty = true;\n                layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0;\n            }\n            // For incremental layer. In case start index changed and no elements are dirty.\n            if (layer.__dirty && layer.__drawIndex < 0) {\n                layer.__drawIndex = layer.__startIndex;\n            }\n        });\n    },\n\n    /**\n     * 清除hover层外所有内容\n     */\n    clear: function () {\n        this.eachBuiltinLayer(this._clearLayer);\n        return this;\n    },\n\n    _clearLayer: function (layer) {\n        layer.clear();\n    },\n\n    setBackgroundColor: function (backgroundColor) {\n        this._backgroundColor = backgroundColor;\n    },\n\n    /**\n     * 修改指定zlevel的绘制参数\n     *\n     * @param {string} zlevel\n     * @param {Object} config 配置对象\n     * @param {string} [config.clearColor=0] 每次清空画布的颜色\n     * @param {string} [config.motionBlur=false] 是否开启动态模糊\n     * @param {number} [config.lastFrameAlpha=0.7]\n     *                 在开启动态模糊的时候使用，与上一帧混合的alpha值，值越大尾迹越明显\n     */\n    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\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\n    /**\n     * 删除指定层\n     * @param {number} zlevel 层所在的zlevel\n     */\n    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\n        zlevelList.splice(util.indexOf(zlevelList, zlevel), 1);\n    },\n\n    /**\n     * 区域大小变化后重绘\n     */\n    resize: function (width, height) {\n        if (!this._domRoot.style) { // Maybe in node or worker\n            if (width == null || height == null) {\n                return;\n            }\n            this._width = width;\n            this._height = height;\n\n            this.getLayer(CANVAS_ZLEVEL).resize(width, height);\n        }\n        else {\n            var domRoot = this._domRoot;\n            // FIXME Why ?\n            domRoot.style.display = 'none';\n\n            // Save input w/h\n            var opts = this._opts;\n            width != null && (opts.width = width);\n            height != null && (opts.height = height);\n\n            width = this._getSize(0);\n            height = this._getSize(1);\n\n            domRoot.style.display = '';\n\n            // 优化没有实际改变的resize\n            if (this._width !== width || height !== this._height) {\n                domRoot.style.width = width + 'px';\n                domRoot.style.height = height + 'px';\n\n                for (var id in this._layers) {\n                    if (this._layers.hasOwnProperty(id)) {\n                        this._layers[id].resize(width, height);\n                    }\n                }\n                util.each(this._progressiveLayers, function (layer) {\n                    layer.resize(width, height);\n                });\n\n                this.refresh(true);\n            }\n\n            this._width = width;\n            this._height = height;\n\n        }\n        return this;\n    },\n\n    /**\n     * 清除单独的一个层\n     * @param {number} zlevel\n     */\n    clearLayer: function (zlevel) {\n        var layer = this._layers[zlevel];\n        if (layer) {\n            layer.clear();\n        }\n    },\n\n    /**\n     * 释放\n     */\n    dispose: function () {\n        this.root.innerHTML = '';\n\n        this.root =\n        this.storage =\n\n        this._domRoot =\n        this._layers = null;\n    },\n\n    /**\n     * Get canvas which has all thing rendered\n     * @param {Object} opts\n     * @param {string} [opts.backgroundColor]\n     * @param {number} [opts.pixelRatio]\n     */\n    getRenderedCanvas: function (opts) {\n        opts = opts || {};\n        if (this._singleCanvas && !this._compositeManually) {\n            return this._layers[CANVAS_ZLEVEL].dom;\n        }\n\n        var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr);\n        imageLayer.initContext();\n        imageLayer.clear(false, opts.backgroundColor || this._backgroundColor);\n\n        if (opts.pixelRatio <= this.dpr) {\n            this.refresh();\n\n            var width = imageLayer.dom.width;\n            var height = imageLayer.dom.height;\n            var ctx = imageLayer.ctx;\n            this.eachLayer(function (layer) {\n                if (layer.__builtin__) {\n                    ctx.drawImage(layer.dom, 0, 0, width, height);\n                }\n                else if (layer.renderToCanvas) {\n                    imageLayer.ctx.save();\n                    layer.renderToCanvas(imageLayer.ctx);\n                    imageLayer.ctx.restore();\n                }\n            });\n        }\n        else {\n            // PENDING, echarts-gl and incremental rendering.\n            var scope = {};\n            var displayList = this.storage.getDisplayList(true);\n            for (var i = 0; i < displayList.length; i++) {\n                var el = displayList[i];\n                this._doPaintEl(el, imageLayer, true, scope);\n            }\n        }\n\n        return imageLayer.dom;\n    },\n    /**\n     * 获取绘图区域宽度\n     */\n    getWidth: function () {\n        return this._width;\n    },\n\n    /**\n     * 获取绘图区域高度\n     */\n    getHeight: function () {\n        return this._height;\n    },\n\n    _getSize: function (whIdx) {\n        var opts = this._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\n        if (opts[wh] != null && opts[wh] !== 'auto') {\n            return parseFloat(opts[wh]);\n        }\n\n        var root = this.root;\n        // IE8 does not support getComputedStyle, but it use VML.\n        var stl = document.defaultView.getComputedStyle(root);\n\n        return (\n            (root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh]))\n            - (parseInt10(stl[plt]) || 0)\n            - (parseInt10(stl[prb]) || 0)\n        ) | 0;\n    },\n\n    pathToImage: function (path, dpr) {\n        dpr = dpr || this.dpr;\n\n        var canvas = document.createElement('canvas');\n        var ctx = canvas.getContext('2d');\n        var rect = path.getBoundingRect();\n        var style = path.style;\n        var shadowBlurSize = style.shadowBlur * dpr;\n        var shadowOffsetX = style.shadowOffsetX * dpr;\n        var shadowOffsetY = style.shadowOffsetY * dpr;\n        var lineWidth = style.hasStroke() ? style.lineWidth : 0;\n\n        var leftMargin = Math.max(lineWidth / 2, -shadowOffsetX + shadowBlurSize);\n        var rightMargin = Math.max(lineWidth / 2, shadowOffsetX + shadowBlurSize);\n        var topMargin = Math.max(lineWidth / 2, -shadowOffsetY + shadowBlurSize);\n        var bottomMargin = Math.max(lineWidth / 2, shadowOffsetY + shadowBlurSize);\n        var width = rect.width + leftMargin + rightMargin;\n        var height = rect.height + topMargin + bottomMargin;\n\n        canvas.width = width * dpr;\n        canvas.height = height * dpr;\n\n        ctx.scale(dpr, dpr);\n        ctx.clearRect(0, 0, width, height);\n        ctx.dpr = dpr;\n\n        var pathTransform = {\n            position: path.position,\n            rotation: path.rotation,\n            scale: path.scale\n        };\n        path.position = [leftMargin - rect.x, topMargin - rect.y];\n        path.rotation = 0;\n        path.scale = [1, 1];\n        path.updateTransform();\n        if (path) {\n            path.brush(ctx);\n        }\n\n        var ImageShape = Image;\n        var imgShape = new ImageShape({\n            style: {\n                x: 0,\n                y: 0,\n                image: canvas\n            }\n        });\n\n        if (pathTransform.position != null) {\n            imgShape.position = path.position = pathTransform.position;\n        }\n\n        if (pathTransform.rotation != null) {\n            imgShape.rotation = path.rotation = pathTransform.rotation;\n        }\n\n        if (pathTransform.scale != null) {\n            imgShape.scale = path.scale = pathTransform.scale;\n        }\n\n        return imgShape;\n    }\n};\n\nexport default Painter;","/**\n * 动画主类, 调度和管理所有动画控制器\n *\n * @module zrender/animation/Animation\n * @author pissang(https://github.com/pissang)\n */\n// TODO Additive animation\n// http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/\n// https://developer.apple.com/videos/wwdc2014/#236\n\nimport * as util from '../core/util';\nimport {Dispatcher} from '../core/event';\nimport requestAnimationFrame from './requestAnimationFrame';\nimport Animator from './Animator';\n\n/**\n * @typedef {Object} IZRenderStage\n * @property {Function} update\n */\n\n/**\n * @alias module:zrender/animation/Animation\n * @constructor\n * @param {Object} [options]\n * @param {Function} [options.onframe]\n * @param {IZRenderStage} [options.stage]\n * @example\n *     var animation = new Animation();\n *     var obj = {\n *         x: 100,\n *         y: 100\n *     };\n *     animation.animate(node.position)\n *         .when(1000, {\n *             x: 500,\n *             y: 500\n *         })\n *         .when(2000, {\n *             x: 100,\n *             y: 100\n *         })\n *         .start('spline');\n */\nvar Animation = function (options) {\n\n    options = options || {};\n\n    this.stage = options.stage || {};\n\n    this.onframe = options.onframe || function () {};\n\n    // private properties\n    this._clips = [];\n\n    this._running = false;\n\n    this._time;\n\n    this._pausedTime;\n\n    this._pauseStart;\n\n    this._paused = false;\n\n    Dispatcher.call(this);\n};\n\nAnimation.prototype = {\n\n    constructor: Animation,\n    /**\n     * 添加 clip\n     * @param {module:zrender/animation/Clip} clip\n     */\n    addClip: function (clip) {\n        this._clips.push(clip);\n    },\n    /**\n     * 添加 animator\n     * @param {module:zrender/animation/Animator} animator\n     */\n    addAnimator: function (animator) {\n        animator.animation = this;\n        var clips = animator.getClips();\n        for (var i = 0; i < clips.length; i++) {\n            this.addClip(clips[i]);\n        }\n    },\n    /**\n     * 删除动画片段\n     * @param {module:zrender/animation/Clip} clip\n     */\n    removeClip: function (clip) {\n        var idx = util.indexOf(this._clips, clip);\n        if (idx >= 0) {\n            this._clips.splice(idx, 1);\n        }\n    },\n\n    /**\n     * 删除动画片段\n     * @param {module:zrender/animation/Animator} animator\n     */\n    removeAnimator: function (animator) {\n        var clips = animator.getClips();\n        for (var i = 0; i < clips.length; i++) {\n            this.removeClip(clips[i]);\n        }\n        animator.animation = null;\n    },\n\n    _update: function () {\n        var time = new Date().getTime() - this._pausedTime;\n        var delta = time - this._time;\n        var clips = this._clips;\n        var len = clips.length;\n\n        var deferredEvents = [];\n        var deferredClips = [];\n        for (var i = 0; i < len; i++) {\n            var clip = clips[i];\n            var e = clip.step(time, delta);\n            // Throw out the events need to be called after\n            // stage.update, like destroy\n            if (e) {\n                deferredEvents.push(e);\n                deferredClips.push(clip);\n            }\n        }\n\n        // Remove the finished clip\n        for (var i = 0; i < len;) {\n            if (clips[i]._needsRemove) {\n                clips[i] = clips[len - 1];\n                clips.pop();\n                len--;\n            }\n            else {\n                i++;\n            }\n        }\n\n        len = deferredEvents.length;\n        for (var i = 0; i < len; i++) {\n            deferredClips[i].fire(deferredEvents[i]);\n        }\n\n        this._time = time;\n\n        this.onframe(delta);\n\n        // 'frame' should be triggered before stage, because upper application\n        // depends on the sequence (e.g., echarts-stream and finish\n        // event judge)\n        this.trigger('frame', delta);\n\n        if (this.stage.update) {\n            this.stage.update();\n        }\n    },\n\n    _startLoop: function () {\n        var self = this;\n\n        this._running = true;\n\n        function step() {\n            if (self._running) {\n\n                requestAnimationFrame(step);\n\n                !self._paused && self._update();\n            }\n        }\n\n        requestAnimationFrame(step);\n    },\n\n    /**\n     * Start animation.\n     */\n    start: function () {\n\n        this._time = new Date().getTime();\n        this._pausedTime = 0;\n\n        this._startLoop();\n    },\n\n    /**\n     * Stop animation.\n     */\n    stop: function () {\n        this._running = false;\n    },\n\n    /**\n     * Pause animation.\n     */\n    pause: function () {\n        if (!this._paused) {\n            this._pauseStart = new Date().getTime();\n            this._paused = true;\n        }\n    },\n\n    /**\n     * Resume animation.\n     */\n    resume: function () {\n        if (this._paused) {\n            this._pausedTime += (new Date().getTime()) - this._pauseStart;\n            this._paused = false;\n        }\n    },\n\n    /**\n     * Clear animation.\n     */\n    clear: function () {\n        this._clips = [];\n    },\n\n    /**\n     * Whether animation finished.\n     */\n    isFinished: function () {\n        return !this._clips.length;\n    },\n\n    /**\n     * Creat animator for a target, whose props can be animated.\n     *\n     * @param  {Object} target\n     * @param  {Object} options\n     * @param  {boolean} [options.loop=false] Whether loop animation.\n     * @param  {Function} [options.getter=null] Get value from target.\n     * @param  {Function} [options.setter=null] Set value to target.\n     * @return {module:zrender/animation/Animation~Animator}\n     */\n    // TODO Gap\n    animate: function (target, options) {\n        options = options || {};\n\n        var animator = new Animator(\n            target,\n            options.loop,\n            options.getter,\n            options.setter\n        );\n\n        this.addAnimator(animator);\n\n        return animator;\n    }\n};\n\nutil.mixin(Animation, Dispatcher);\n\nexport default Animation;","\nimport {\n    addEventListener,\n    removeEventListener,\n    normalizeEvent\n} from '../core/event';\nimport * as zrUtil from '../core/util';\nimport Eventful from '../mixin/Eventful';\nimport env from '../core/env';\n\nvar TOUCH_CLICK_DELAY = 300;\n\nvar mouseHandlerNames = [\n    'click', 'dblclick', 'mousewheel', 'mouseout',\n    'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n];\n\nvar touchHandlerNames = [\n    'touchstart', 'touchend', 'touchmove'\n];\n\nvar pointerEventNames = {\n    pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1\n};\n\nvar pointerHandlerNames = zrUtil.map(mouseHandlerNames, function (name) {\n    var nm = name.replace('mouse', 'pointer');\n    return pointerEventNames[nm] ? nm : name;\n});\n\nfunction eventNameFix(name) {\n    return (name === 'mousewheel' && env.browser.firefox) ? 'DOMMouseScroll' : name;\n}\n\n// function onMSGestureChange(proxy, event) {\n//     if (event.translationX || event.translationY) {\n//         // mousemove is carried by MSGesture to reduce the sensitivity.\n//         proxy.handler.dispatchToElement(event.target, 'mousemove', event);\n//     }\n//     if (event.scale !== 1) {\n//         event.pinchX = event.offsetX;\n//         event.pinchY = event.offsetY;\n//         event.pinchScale = event.scale;\n//         proxy.handler.dispatchToElement(event.target, 'pinch', event);\n//     }\n// }\n\n/**\n * Prevent mouse event from being dispatched after Touch Events action\n * @see <https://github.com/deltakosh/handjs/blob/master/src/hand.base.js>\n * 1. Mobile browsers dispatch mouse events 300ms after touchend.\n * 2. Chrome for Android dispatch mousedown for long-touch about 650ms\n * Result: Blocking Mouse Events for 700ms.\n */\nfunction setTouchTimer(instance) {\n    instance._touching = true;\n    clearTimeout(instance._touchTimer);\n    instance._touchTimer = setTimeout(function () {\n        instance._touching = false;\n    }, 700);\n}\n\n\nvar domHandlers = {\n    /**\n     * Mouse move handler\n     * @inner\n     * @param {Event} event\n     */\n    mousemove: function (event) {\n        event = normalizeEvent(this.dom, event);\n\n        this.trigger('mousemove', event);\n    },\n\n    /**\n     * Mouse out handler\n     * @inner\n     * @param {Event} event\n     */\n    mouseout: function (event) {\n        event = normalizeEvent(this.dom, event);\n\n        var element = event.toElement || event.relatedTarget;\n        if (element !== this.dom) {\n            while (element && element.nodeType !== 9) {\n                // 忽略包含在root中的dom引起的mouseOut\n                if (element === this.dom) {\n                    return;\n                }\n\n                element = element.parentNode;\n            }\n        }\n\n        this.trigger('mouseout', event);\n    },\n\n    /**\n     * Touch开始响应函数\n     * @inner\n     * @param {Event} event\n     */\n    touchstart: function (event) {\n        // Default mouse behaviour should not be disabled here.\n        // For example, page may needs to be slided.\n        event = normalizeEvent(this.dom, event);\n\n        // Mark touch, which is useful in distinguish touch and\n        // mouse event in upper applicatoin.\n        event.zrByTouch = true;\n\n        this._lastTouchMoment = new Date();\n\n        this.handler.processGesture(this, event, 'start');\n\n        // In touch device, trigger `mousemove`(`mouseover`) should\n        // be triggered, and must before `mousedown` triggered.\n        domHandlers.mousemove.call(this, event);\n\n        domHandlers.mousedown.call(this, event);\n\n        setTouchTimer(this);\n    },\n\n    /**\n     * Touch移动响应函数\n     * @inner\n     * @param {Event} event\n     */\n    touchmove: function (event) {\n\n        event = normalizeEvent(this.dom, event);\n\n        // Mark touch, which is useful in distinguish touch and\n        // mouse event in upper applicatoin.\n        event.zrByTouch = true;\n\n        this.handler.processGesture(this, event, 'change');\n\n        // Mouse move should always be triggered no matter whether\n        // there is gestrue event, because mouse move and pinch may\n        // be used at the same time.\n        domHandlers.mousemove.call(this, event);\n\n        setTouchTimer(this);\n    },\n\n    /**\n     * Touch结束响应函数\n     * @inner\n     * @param {Event} event\n     */\n    touchend: function (event) {\n\n        event = normalizeEvent(this.dom, event);\n\n        // Mark touch, which is useful in distinguish touch and\n        // mouse event in upper applicatoin.\n        event.zrByTouch = true;\n\n        this.handler.processGesture(this, event, 'end');\n\n        domHandlers.mouseup.call(this, event);\n\n        // Do not trigger `mouseout` here, in spite of `mousemove`(`mouseover`) is\n        // triggered in `touchstart`. This seems to be illogical, but by this mechanism,\n        // we can conveniently implement \"hover style\" in both PC and touch device just\n        // by listening to `mouseover` to add \"hover style\" and listening to `mouseout`\n        // to remove \"hover style\" on an element, without any additional code for\n        // compatibility. (`mouseout` will not be triggered in `touchend`, so \"hover\n        // style\" will remain for user view)\n\n        // click event should always be triggered no matter whether\n        // there is gestrue event. System click can not be prevented.\n        if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) {\n            domHandlers.click.call(this, event);\n        }\n\n        setTouchTimer(this);\n    },\n\n    pointerdown: function (event) {\n        domHandlers.mousedown.call(this, event);\n\n        // if (useMSGuesture(this, event)) {\n        //     this._msGesture.addPointer(event.pointerId);\n        // }\n    },\n\n    pointermove: function (event) {\n        // FIXME\n        // pointermove is so sensitive that it always triggered when\n        // tap(click) on touch screen, which affect some judgement in\n        // upper application. So, we dont support mousemove on MS touch\n        // device yet.\n        if (!isPointerFromTouch(event)) {\n            domHandlers.mousemove.call(this, event);\n        }\n    },\n\n    pointerup: function (event) {\n        domHandlers.mouseup.call(this, event);\n    },\n\n    pointerout: function (event) {\n        // pointerout will be triggered when tap on touch screen\n        // (IE11+/Edge on MS Surface) after click event triggered,\n        // which is inconsistent with the mousout behavior we defined\n        // in touchend. So we unify them.\n        // (check domHandlers.touchend for detailed explanation)\n        if (!isPointerFromTouch(event)) {\n            domHandlers.mouseout.call(this, event);\n        }\n    }\n};\n\nfunction isPointerFromTouch(event) {\n    var pointerType = event.pointerType;\n    return pointerType === 'pen' || pointerType === 'touch';\n}\n\n// function useMSGuesture(handlerProxy, event) {\n//     return isPointerFromTouch(event) && !!handlerProxy._msGesture;\n// }\n\n// Common handlers\nzrUtil.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {\n    domHandlers[name] = function (event) {\n        event = normalizeEvent(this.dom, event);\n        this.trigger(name, event);\n    };\n});\n\n/**\n * 为控制类实例初始化dom 事件处理函数\n *\n * @inner\n * @param {module:zrender/Handler} instance 控制类实例\n */\nfunction initDomHandler(instance) {\n    zrUtil.each(touchHandlerNames, function (name) {\n        instance._handlers[name] = zrUtil.bind(domHandlers[name], instance);\n    });\n\n    zrUtil.each(pointerHandlerNames, function (name) {\n        instance._handlers[name] = zrUtil.bind(domHandlers[name], instance);\n    });\n\n    zrUtil.each(mouseHandlerNames, function (name) {\n        instance._handlers[name] = makeMouseHandler(domHandlers[name], instance);\n    });\n\n    function makeMouseHandler(fn, instance) {\n        return function () {\n            if (instance._touching) {\n                return;\n            }\n            return fn.apply(instance, arguments);\n        };\n    }\n}\n\n\nfunction HandlerDomProxy(dom) {\n    Eventful.call(this);\n\n    this.dom = dom;\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._touching = false;\n\n    /**\n     * @private\n     * @type {number}\n     */\n    this._touchTimer;\n\n    this._handlers = {};\n\n    initDomHandler(this);\n\n    if (env.pointerEventsSupported) { // Only IE11+/Edge\n        // 1. On devices that both enable touch and mouse (e.g., MS Surface and lenovo X240),\n        // IE11+/Edge do not trigger touch event, but trigger pointer event and mouse event\n        // at the same time.\n        // 2. On MS Surface, it probablely only trigger mousedown but no mouseup when tap on\n        // screen, which do not occurs in pointer event.\n        // So we use pointer event to both detect touch gesture and mouse behavior.\n        mountHandlers(pointerHandlerNames, this);\n\n        // FIXME\n        // Note: MS Gesture require CSS touch-action set. But touch-action is not reliable,\n        // which does not prevent defuault behavior occasionally (which may cause view port\n        // zoomed in but use can not zoom it back). And event.preventDefault() does not work.\n        // So we have to not to use MSGesture and not to support touchmove and pinch on MS\n        // touch screen. And we only support click behavior on MS touch screen now.\n\n        // MS Gesture Event is only supported on IE11+/Edge and on Windows 8+.\n        // We dont support touch on IE on win7.\n        // See <https://msdn.microsoft.com/en-us/library/dn433243(v=vs.85).aspx>\n        // if (typeof MSGesture === 'function') {\n        //     (this._msGesture = new MSGesture()).target = dom; // jshint ignore:line\n        //     dom.addEventListener('MSGestureChange', onMSGestureChange);\n        // }\n    }\n    else {\n        if (env.touchEventsSupported) {\n            mountHandlers(touchHandlerNames, this);\n            // Handler of 'mouseout' event is needed in touch mode, which will be mounted below.\n            // addEventListener(root, 'mouseout', this._mouseoutHandler);\n        }\n\n        // 1. Considering some devices that both enable touch and mouse event (like on MS Surface\n        // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise\n        // mouse event can not be handle in those devices.\n        // 2. On MS Surface, Chrome will trigger both touch event and mouse event. How to prevent\n        // mouseevent after touch event triggered, see `setTouchTimer`.\n        mountHandlers(mouseHandlerNames, this);\n    }\n\n    function mountHandlers(handlerNames, instance) {\n        zrUtil.each(handlerNames, function (name) {\n            addEventListener(dom, eventNameFix(name), instance._handlers[name]);\n        }, instance);\n    }\n}\n\nvar handlerDomProxyProto = HandlerDomProxy.prototype;\nhandlerDomProxyProto.dispose = function () {\n    var handlerNames = mouseHandlerNames.concat(touchHandlerNames);\n\n    for (var i = 0; i < handlerNames.length; i++) {\n        var name = handlerNames[i];\n        removeEventListener(this.dom, eventNameFix(name), this._handlers[name]);\n    }\n};\n\nhandlerDomProxyProto.setCursor = function (cursorStyle) {\n    this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');\n};\n\nzrUtil.mixin(HandlerDomProxy, Eventful);\n\nexport default HandlerDomProxy;","/*!\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*/\n\nimport guid from './core/guid';\nimport env from './core/env';\nimport * as zrUtil from './core/util';\nimport Handler from './Handler';\nimport Storage from './Storage';\nimport Painter from './Painter';\nimport Animation from './animation/Animation';\nimport HandlerProxy from './dom/HandlerProxy';\n\nvar useVML = !env.canvasSupported;\n\nvar painterCtors = {\n    canvas: Painter\n};\n\nvar instances = {};    // ZRender实例map索引\n\n/**\n * @type {string}\n */\nexport var version = '4.1.0';\n\n/**\n * Initializing a zrender instance\n * @param {HTMLElement} dom\n * @param {Object} [opts]\n * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'\n * @param {number} [opts.devicePixelRatio]\n * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)\n * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)\n * @return {module:zrender/ZRender}\n */\nexport function init(dom, opts) {\n    var zr = new ZRender(guid(), dom, opts);\n    instances[zr.id] = zr;\n    return zr;\n}\n\n/**\n * Dispose zrender instance\n * @param {module:zrender/ZRender} zr\n */\nexport function dispose(zr) {\n    if (zr) {\n        zr.dispose();\n    }\n    else {\n        for (var key in instances) {\n            if (instances.hasOwnProperty(key)) {\n                instances[key].dispose();\n            }\n        }\n        instances = {};\n    }\n\n    return this;\n}\n\n/**\n * Get zrender instance by id\n * @param {string} id zrender instance id\n * @return {module:zrender/ZRender}\n */\nexport function getInstance(id) {\n    return instances[id];\n}\n\nexport function registerPainter(name, Ctor) {\n    painterCtors[name] = Ctor;\n}\n\nfunction delInstance(id) {\n    delete instances[id];\n}\n\n/**\n * @module zrender/ZRender\n */\n/**\n * @constructor\n * @alias module:zrender/ZRender\n * @param {string} id\n * @param {HTMLElement} dom\n * @param {Object} opts\n * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'\n * @param {number} [opts.devicePixelRatio]\n * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)\n * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)\n */\nvar ZRender = function (id, dom, opts) {\n\n    opts = opts || {};\n\n    /**\n     * @type {HTMLDomElement}\n     */\n    this.dom = dom;\n\n    /**\n     * @type {string}\n     */\n    this.id = id;\n\n    var self = this;\n    var storage = new Storage();\n\n    var rendererType = opts.renderer;\n    // TODO WebGL\n    if (useVML) {\n        if (!painterCtors.vml) {\n            throw new Error('You need to require \\'zrender/vml/vml\\' to support IE8');\n        }\n        rendererType = 'vml';\n    }\n    else if (!rendererType || !painterCtors[rendererType]) {\n        rendererType = 'canvas';\n    }\n    var painter = new painterCtors[rendererType](dom, storage, opts, id);\n\n    this.storage = storage;\n    this.painter = painter;\n\n    var handerProxy = (!env.node && !env.worker) ? new HandlerProxy(painter.getViewportRoot()) : null;\n    this.handler = new Handler(storage, painter, handerProxy, painter.root);\n\n    /**\n     * @type {module:zrender/animation/Animation}\n     */\n    this.animation = new Animation({\n        stage: {\n            update: zrUtil.bind(this.flush, this)\n        }\n    });\n    this.animation.start();\n\n    /**\n     * @type {boolean}\n     * @private\n     */\n    this._needsRefresh;\n\n    // 修改 storage.delFromStorage, 每次删除元素之前删除动画\n    // FIXME 有点ugly\n    var oldDelFromStorage = storage.delFromStorage;\n    var oldAddToStorage = storage.addToStorage;\n\n    storage.delFromStorage = function (el) {\n        oldDelFromStorage.call(storage, el);\n\n        el && el.removeSelfFromZr(self);\n    };\n\n    storage.addToStorage = function (el) {\n        oldAddToStorage.call(storage, el);\n\n        el.addSelfToZr(self);\n    };\n};\n\nZRender.prototype = {\n\n    constructor: ZRender,\n    /**\n     * 获取实例唯一标识\n     * @return {string}\n     */\n    getId: function () {\n        return this.id;\n    },\n\n    /**\n     * 添加元素\n     * @param  {module:zrender/Element} el\n     */\n    add: function (el) {\n        this.storage.addRoot(el);\n        this._needsRefresh = true;\n    },\n\n    /**\n     * 删除元素\n     * @param  {module:zrender/Element} el\n     */\n    remove: function (el) {\n        this.storage.delRoot(el);\n        this._needsRefresh = true;\n    },\n\n    /**\n     * Change configuration of layer\n     * @param {string} zLevel\n     * @param {Object} config\n     * @param {string} [config.clearColor=0] Clear color\n     * @param {string} [config.motionBlur=false] If enable motion blur\n     * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer\n    */\n    configLayer: function (zLevel, config) {\n        if (this.painter.configLayer) {\n            this.painter.configLayer(zLevel, config);\n        }\n        this._needsRefresh = true;\n    },\n\n    /**\n     * Set background color\n     * @param {string} backgroundColor\n     */\n    setBackgroundColor: function (backgroundColor) {\n        if (this.painter.setBackgroundColor) {\n            this.painter.setBackgroundColor(backgroundColor);\n        }\n        this._needsRefresh = true;\n    },\n\n    /**\n     * Repaint the canvas immediately\n     */\n    refreshImmediately: function () {\n        // var start = new Date();\n\n        // Clear needsRefresh ahead to avoid something wrong happens in refresh\n        // Or it will cause zrender refreshes again and again.\n        this._needsRefresh = this._needsRefreshHover = false;\n        this.painter.refresh();\n        // Avoid trigger zr.refresh in Element#beforeUpdate hook\n        this._needsRefresh = this._needsRefreshHover = false;\n\n        // var end = new Date();\n        // var log = document.getElementById('log');\n        // if (log) {\n        //     log.innerHTML = log.innerHTML + '<br>' + (end - start);\n        // }\n    },\n\n    /**\n     * Mark and repaint the canvas in the next frame of browser\n     */\n    refresh: function () {\n        this._needsRefresh = true;\n    },\n\n    /**\n     * Perform all refresh\n     */\n    flush: function () {\n        var triggerRendered;\n\n        if (this._needsRefresh) {\n            triggerRendered = true;\n            this.refreshImmediately();\n        }\n        if (this._needsRefreshHover) {\n            triggerRendered = true;\n            this.refreshHoverImmediately();\n        }\n\n        triggerRendered && this.trigger('rendered');\n    },\n\n    /**\n     * Add element to hover layer\n     * @param  {module:zrender/Element} el\n     * @param {Object} style\n     */\n    addHover: function (el, style) {\n        if (this.painter.addHover) {\n            var elMirror = this.painter.addHover(el, style);\n            this.refreshHover();\n            return elMirror;\n        }\n    },\n\n    /**\n     * Add element from hover layer\n     * @param  {module:zrender/Element} el\n     */\n    removeHover: function (el) {\n        if (this.painter.removeHover) {\n            this.painter.removeHover(el);\n            this.refreshHover();\n        }\n    },\n\n    /**\n     * Clear all hover elements in hover layer\n     * @param  {module:zrender/Element} el\n     */\n    clearHover: function () {\n        if (this.painter.clearHover) {\n            this.painter.clearHover();\n            this.refreshHover();\n        }\n    },\n\n    /**\n     * Refresh hover in next frame\n     */\n    refreshHover: function () {\n        this._needsRefreshHover = true;\n    },\n\n    /**\n     * Refresh hover immediately\n     */\n    refreshHoverImmediately: function () {\n        this._needsRefreshHover = false;\n        this.painter.refreshHover && this.painter.refreshHover();\n    },\n\n    /**\n     * Resize the canvas.\n     * Should be invoked when container size is changed\n     * @param {Object} [opts]\n     * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)\n     * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)\n     */\n    resize: function (opts) {\n        opts = opts || {};\n        this.painter.resize(opts.width, opts.height);\n        this.handler.resize();\n    },\n\n    /**\n     * Stop and clear all animation immediately\n     */\n    clearAnimation: function () {\n        this.animation.clear();\n    },\n\n    /**\n     * Get container width\n     */\n    getWidth: function () {\n        return this.painter.getWidth();\n    },\n\n    /**\n     * Get container height\n     */\n    getHeight: function () {\n        return this.painter.getHeight();\n    },\n\n    /**\n     * Export the canvas as Base64 URL\n     * @param {string} type\n     * @param {string} [backgroundColor='#fff']\n     * @return {string} Base64 URL\n     */\n    // toDataURL: function(type, backgroundColor) {\n    //     return this.painter.getRenderedCanvas({\n    //         backgroundColor: backgroundColor\n    //     }).toDataURL(type);\n    // },\n\n    /**\n     * Converting a path to image.\n     * It has much better performance of drawing image rather than drawing a vector path.\n     * @param {module:zrender/graphic/Path} e\n     * @param {number} width\n     * @param {number} height\n     */\n    pathToImage: function (e, dpr) {\n        return this.painter.pathToImage(e, dpr);\n    },\n\n    /**\n     * Set default cursor\n     * @param {string} [cursorStyle='default'] 例如 crosshair\n     */\n    setCursorStyle: function (cursorStyle) {\n        this.handler.setCursorStyle(cursorStyle);\n    },\n\n    /**\n     * Find hovered element\n     * @param {number} x\n     * @param {number} y\n     * @return {Object} {target, topTarget}\n     */\n    findHover: function (x, y) {\n        return this.handler.findHover(x, y);\n    },\n\n    /**\n     * Bind event\n     *\n     * @param {string} eventName Event name\n     * @param {Function} eventHandler Handler function\n     * @param {Object} [context] Context object\n     */\n    on: function (eventName, eventHandler, context) {\n        this.handler.on(eventName, eventHandler, context);\n    },\n\n    /**\n     * Unbind event\n     * @param {string} eventName Event name\n     * @param {Function} [eventHandler] Handler function\n     */\n    off: function (eventName, eventHandler) {\n        this.handler.off(eventName, eventHandler);\n    },\n\n    /**\n     * Trigger event manually\n     *\n     * @param {string} eventName Event name\n     * @param {event=} event Event object\n     */\n    trigger: function (eventName, event) {\n        this.handler.trigger(eventName, event);\n    },\n\n\n    /**\n     * Clear all objects and the canvas.\n     */\n    clear: function () {\n        this.storage.delRoot();\n        this.painter.clear();\n    },\n\n    /**\n     * Dispose self.\n     */\n    dispose: function () {\n        this.animation.stop();\n\n        this.clear();\n        this.storage.dispose();\n        this.painter.dispose();\n        this.handler.dispose();\n\n        this.animation =\n        this.storage =\n        this.painter =\n        this.handler = null;\n\n        delInstance(this.id);\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\n\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\nvar isArray = zrUtil.isArray;\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';\n\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\n        ? value\n        : value == null\n        ? []\n        : [value];\n}\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 * @param {Object} opt\n * @param {string} key\n * @param {Array.<string>} subOpts\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\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)\n                && opt[key].hasOwnProperty(subOptName)\n            ) {\n                opt.emphasis[key][subOptName] = opt[key][subOptName];\n            }\n        }\n    }\n}\n\nexport var TEXT_STYLE_OPTIONS = [\n    'fontStyle', 'fontWeight', 'fontSize', 'fontFamily',\n    'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth',\n    'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline',\n    'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY',\n    'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY',\n    'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding'\n];\n\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/**\n * The method do not ensure performance.\n * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\n * This helper method retieves value from data.\n * @param {string|number|Date|Array|Object} dataItem\n * @return {number|string|Date|Array.<number|string|Date>}\n */\nexport function getDataItemValue(dataItem) {\n    return (isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date))\n        ? dataItem.value : dataItem;\n}\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 * @param {string|number|Date|Array|Object} dataItem\n */\nexport function isDataItemOption(dataItem) {\n    return isObject(dataItem)\n        && !(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 exists for merge.\n *\n * @public\n * @param {Array.<Object>|Array.<module:echarts/model/Component>} exists\n * @param {Object|Array.<Object>} newCptOptions\n * @return {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],\n *                          index of which is the same as exists.\n */\nexport function mappingToExists(exists, newCptOptions) {\n    // Mapping by the order by original option (but not order of\n    // new option) in merge mode. Because we should ensure\n    // some specified index (like xAxisIndex) is consistent with\n    // original option, which is easy to understand, espatially in\n    // media query. And in most case, merge option is used to\n    // update partial option but not be expected to change order.\n    newCptOptions = (newCptOptions || []).slice();\n\n    var result = zrUtil.map(exists || [], function (obj, index) {\n        return {exist: obj};\n    });\n\n    // Mapping by id or name if specified.\n    each(newCptOptions, function (cptOption, index) {\n        if (!isObject(cptOption)) {\n            return;\n        }\n\n        // id has highest priority.\n        for (var i = 0; i < result.length; i++) {\n            if (!result[i].option // Consider name: two map to one.\n                && cptOption.id != null\n                && result[i].exist.id === cptOption.id + ''\n            ) {\n                result[i].option = cptOption;\n                newCptOptions[index] = null;\n                return;\n            }\n        }\n\n        for (var i = 0; i < result.length; i++) {\n            var exist = result[i].exist;\n            if (!result[i].option // Consider name: two map to one.\n                // Can not match when both ids exist but different.\n                && (exist.id == null || cptOption.id == null)\n                && cptOption.name != null\n                && !isIdInner(cptOption)\n                && !isIdInner(exist)\n                && exist.name === cptOption.name + ''\n            ) {\n                result[i].option = cptOption;\n                newCptOptions[index] = null;\n                return;\n            }\n        }\n    });\n\n    // Otherwise mapping by index.\n    each(newCptOptions, function (cptOption, index) {\n        if (!isObject(cptOption)) {\n            return;\n        }\n\n        var i = 0;\n        for (; i < result.length; i++) {\n            var exist = result[i].exist;\n            if (!result[i].option\n                // Existing model that already has id should be able to\n                // mapped to (because after mapping performed model may\n                // be assigned with a id, whish should not affect next\n                // mapping), except those has inner id.\n                && !isIdInner(exist)\n                // Caution:\n                // Do not overwrite id. But name can be overwritten,\n                // because axis use name as 'show label text'.\n                // 'exist' always has id and name and we dont\n                // need to check it.\n                && cptOption.id == null\n            ) {\n                result[i].option = cptOption;\n                break;\n            }\n        }\n\n        if (i >= result.length) {\n            result.push({option: cptOption});\n        }\n    });\n\n    return result;\n}\n\n/**\n * Make id and name for mapping result (result of mappingToExists)\n * into `keyInfo` field.\n *\n * @public\n * @param {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],\n *                          which order is the same as exists.\n * @return {Array.<Object>} The input.\n */\nexport function 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\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\n    // name can be duplicated among components, which is convenient\n    // to specify multi components (like series) by one name.\n\n    // Ensure that each id is distinct.\n    var idMap = zrUtil.createHashMap();\n\n    each(mapResult, function (item, index) {\n        var existCpt = item.exist;\n        existCpt && idMap.set(existCpt.id, item);\n    });\n\n    each(mapResult, function (item, index) {\n        var opt = item.option;\n\n        zrUtil.assert(\n            !opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item,\n            'id duplicates: ' + (opt && opt.id)\n        );\n\n        opt && opt.id != null && idMap.set(opt.id, item);\n        !item.keyInfo && (item.keyInfo = {});\n    });\n\n    // Make name and id.\n    each(mapResult, function (item, index) {\n        var existCpt = item.exist;\n        var opt = item.option;\n        var keyInfo = item.keyInfo;\n\n        if (!isObject(opt)) {\n            return;\n        }\n\n        // name can be overwitten. 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\n            ? opt.name + ''\n            : existCpt\n            ? existCpt.name\n            // Avoid diffferent series has the same name,\n            // because name may be used like in color pallet.\n            : DUMMY_COMPONENT_NAME_PREFIX + index;\n\n        if (existCpt) {\n            keyInfo.id = existCpt.id;\n        }\n        else if (opt.id != null) {\n            keyInfo.id = opt.id + '';\n        }\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            }\n            while (idMap.get(keyInfo.id));\n        }\n\n        idMap.set(keyInfo.id, item);\n    });\n}\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/**\n * @public\n * @param {Object} cptOption\n * @return {boolean}\n */\nexport function isIdInner(cptOption) {\n    return isObject(cptOption)\n        && cptOption.id\n        && (cptOption.id + '').indexOf('\\0_ec_\\0') === 0;\n}\n\n/**\n * A helper for removing duplicate items between batchA and batchB,\n * and in themselves, and categorize by series.\n *\n * @param {Array.<Object>} batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @param {Array.<Object>} batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @return {Array.<Array.<Object>, Array.<Object>>} result: [resultBatchA, resultBatchB]\n */\nexport function compressBatches(batchA, batchB) {\n    var mapA = {};\n    var mapB = {};\n\n    makeMap(batchA || [], mapA);\n    makeMap(batchB || [], mapB, mapA);\n\n    return [mapToArray(mapA), mapToArray(mapB)];\n\n    function makeMap(sourceBatch, map, otherMap) {\n        for (var i = 0, len = sourceBatch.length; i < len; i++) {\n            var seriesId = sourceBatch[i].seriesId;\n            var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);\n            var otherDataIndices = otherMap && otherMap[seriesId];\n\n            for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {\n                var dataIndex = dataIndices[j];\n\n                if (otherDataIndices && otherDataIndices[dataIndex]) {\n                    otherDataIndices[dataIndex] = null;\n                }\n                else {\n                    (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;\n                }\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                }\n                else {\n                    var dataIndices = mapToArray(map[i], true);\n                    dataIndices.length && result.push({seriesId: i, dataIndex: dataIndices});\n                }\n            }\n        }\n        return result;\n    }\n}\n\n/**\n * @param {module:echarts/data/List} data\n * @param {Object} payload Contains dataIndex (means rawIndex) / dataIndexInside / name\n *                         each of which can be Array or primary type.\n * @return {number|Array.<number>} dataIndex If not found, return undefined/null.\n */\nexport function queryDataIndex(data, payload) {\n    if (payload.dataIndexInside != null) {\n        return payload.dataIndexInside;\n    }\n    else if (payload.dataIndex != null) {\n        return zrUtil.isArray(payload.dataIndex)\n            ? zrUtil.map(payload.dataIndex, function (value) {\n                return data.indexOfRawIndex(value);\n            })\n            : data.indexOfRawIndex(payload.dataIndex);\n    }\n    else if (payload.name != null) {\n        return zrUtil.isArray(payload.name)\n            ? zrUtil.map(payload.name, function (value) {\n                return data.indexOfName(value);\n            })\n            : data.indexOfName(payload.name);\n    }\n}\n\n/**\n * Enable property storage to any host object.\n * Notice: Serialization is not supported.\n *\n * For example:\n * var inner = zrUitl.makeInner();\n *\n * function some1(hostObj) {\n *      inner(hostObj).someProperty = 1212;\n *      ...\n * }\n * function some2() {\n *      var fields = inner(this);\n *      fields.someProperty1 = 1212;\n *      fields.someProperty2 = 'xx';\n *      ...\n * }\n *\n * @return {Function}\n */\nexport function makeInner() {\n    // Consider different scope by es module import.\n    var key = '__\\0ec_inner_' + innerUniqueIndex++ + '_' + Math.random().toFixed(5);\n    return function (hostObj) {\n        return hostObj[key] || (hostObj[key] = {});\n    };\n}\nvar innerUniqueIndex = 0;\n\n/**\n * @param {module:echarts/model/Global} ecModel\n * @param {string|Object} finder\n *        If string, e.g., 'geo', means {geoIndex: 0}.\n *        If Object, could contain some of these properties below:\n *        {\n *            seriesIndex, seriesId, seriesName,\n *            geoIndex, geoId, geoName,\n *            bmapIndex, bmapId, bmapName,\n *            xAxisIndex, xAxisId, xAxisName,\n *            yAxisIndex, yAxisId, yAxisName,\n *            gridIndex, gridId, gridName,\n *            ... (can be extended)\n *        }\n *        Each properties can be number|string|Array.<number>|Array.<string>\n *        For example, a finder could be\n *        {\n *            seriesIndex: 3,\n *            geoId: ['aa', 'cc'],\n *            gridName: ['xx', 'rr']\n *        }\n *        xxxIndex can be set as 'all' (means all xxx) or 'none' (means not specify)\n *        If nothing or null/undefined specified, return nothing.\n * @param {Object} [opt]\n * @param {string} [opt.defaultMainType]\n * @param {Array.<string>} [opt.includeMainTypes]\n * @return {Object} result like:\n *        {\n *            seriesModels: [seriesModel1, seriesModel2],\n *            seriesModel: seriesModel1, // The first model\n *            geoModels: [geoModel1, geoModel2],\n *            geoModel: geoModel1, // The first model\n *            ...\n *        }\n */\nexport function parseFinder(ecModel, finder, opt) {\n    if (zrUtil.isString(finder)) {\n        var obj = {};\n        obj[finder + 'Index'] = 0;\n        finder = obj;\n    }\n\n    var defaultMainType = opt && opt.defaultMainType;\n    if (defaultMainType\n        && !has(finder, defaultMainType + 'Index')\n        && !has(finder, defaultMainType + 'Id')\n        && !has(finder, defaultMainType + 'Name')\n    ) {\n        finder[defaultMainType + 'Index'] = 0;\n    }\n\n    var result = {};\n\n    each(finder, function (value, key) {\n        var value = finder[key];\n\n        // Exclude 'dataIndex' and other illgal keys.\n        if (key === 'dataIndex' || key === 'dataIndexInside') {\n            result[key] = value;\n            return;\n        }\n\n        var parsedKey = key.match(/^(\\w+)(Index|Id|Name)$/) || [];\n        var mainType = parsedKey[1];\n        var queryType = (parsedKey[2] || '').toLowerCase();\n\n        if (!mainType\n            || !queryType\n            || value == null\n            || (queryType === 'index' && value === 'none')\n            || (opt && opt.includeMainTypes && zrUtil.indexOf(opt.includeMainTypes, mainType) < 0)\n        ) {\n            return;\n        }\n\n        var queryParam = {mainType: mainType};\n        if (queryType !== 'index' || value !== 'all') {\n            queryParam[queryType] = value;\n        }\n\n        var models = ecModel.queryComponents(queryParam);\n        result[mainType + 'Models'] = models;\n        result[mainType + 'Model'] = models[0];\n    });\n\n    return result;\n}\n\nfunction has(obj, prop) {\n    return obj && obj.hasOwnProperty(prop);\n}\n\nexport function setAttribute(dom, key, value) {\n    dom.setAttribute\n        ? dom.setAttribute(key, value)\n        : (dom[key] = value);\n}\n\nexport function getAttribute(dom, key) {\n    return dom.getAttribute\n        ? dom.getAttribute(key)\n        : dom[key];\n}\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    }\n    else {\n        return renderModeOption || 'html';\n    }\n}\n\n/**\n * Group a list by key.\n *\n * @param {Array} array\n * @param {Function} getKey\n *        param {*} Array item\n *        return {string} key\n * @return {Object} Result\n *        {Array}: keys,\n *        {module:zrender/core/util/HashMap} buckets: {key -> Array}\n */\nexport function groupData(array, getKey) {\n    var buckets = zrUtil.createHashMap();\n    var keys = [];\n\n    zrUtil.each(array, function (item) {\n        var key = getKey(item);\n        (buckets.get(key)\n            || (keys.push(key), buckets.set(key, []))\n        ).push(item);\n    });\n\n    return {keys: keys, buckets: buckets};\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar TYPE_DELIMITER = '.';\nvar IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';\n\n/**\n * Notice, parseClassType('') should returns {main: '', sub: ''}\n * @public\n */\nexport function parseClassType(componentType) {\n    var ret = {main: '', sub: ''};\n    if (componentType) {\n        componentType = componentType.split(TYPE_DELIMITER);\n        ret.main = componentType[0] || '';\n        ret.sub = componentType[1] || '';\n    }\n    return ret;\n}\n\n/**\n * @public\n */\nfunction checkClassType(componentType) {\n    zrUtil.assert(\n        /^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType),\n        'componentType \"' + componentType + '\" illegal'\n    );\n}\n\n/**\n * @public\n */\nexport function enableClassExtend(RootClass, mandatoryMethods) {\n\n    RootClass.$constructor = RootClass;\n    RootClass.extend = function (proto) {\n\n        if (__DEV__) {\n            zrUtil.each(mandatoryMethods, function (method) {\n                if (!proto[method]) {\n                    console.warn(\n                        'Method `' + method + '` should be implemented'\n                        + (proto.type ? ' in ' + proto.type : '') + '.'\n                    );\n                }\n            });\n        }\n\n        var superClass = this;\n        var ExtendedClass = function () {\n            if (!proto.$constructor) {\n                superClass.apply(this, arguments);\n            }\n            else {\n                proto.$constructor.apply(this, arguments);\n            }\n        };\n\n        zrUtil.extend(ExtendedClass.prototype, proto);\n\n        ExtendedClass.extend = this.extend;\n        ExtendedClass.superCall = superCall;\n        ExtendedClass.superApply = superApply;\n        zrUtil.inherits(ExtendedClass, this);\n        ExtendedClass.superClass = superClass;\n\n        return ExtendedClass;\n    };\n}\n\nvar classBase = 0;\n\n/**\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 */\nexport function enableClassCheck(Clz) {\n    var classAttr = ['__\\0is_clz', classBase++, Math.random().toFixed(3)].join('_');\n    Clz.prototype[classAttr] = true;\n\n    if (__DEV__) {\n        zrUtil.assert(!Clz.isInstance, 'The method \"is\" can not be defined.');\n    }\n\n    Clz.isInstance = function (obj) {\n        return !!(obj && obj[classAttr]);\n    };\n}\n\n// superCall should have class info, which can not be fetch 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, do not overrides method f,\n// then when method of class C is called, dead loop occured.\nfunction superCall(context, methodName) {\n    var args = zrUtil.slice(arguments, 2);\n    return this.superClass.prototype[methodName].apply(context, args);\n}\n\nfunction superApply(context, methodName, args) {\n    return this.superClass.prototype[methodName].apply(context, args);\n}\n\n/**\n * @param {Object} entity\n * @param {Object} options\n * @param {boolean} [options.registerWhenExtend]\n * @public\n */\nexport function enableClassManagement(entity, options) {\n    options = options || {};\n\n    /**\n     * Component model classes\n     * key: componentType,\n     * value:\n     *     componentClass, when componentType is 'xxx'\n     *     or Object.<subKey, componentClass>, when componentType is 'xxx.yy'\n     * @type {Object}\n     */\n    var storage = {};\n\n    entity.registerClass = function (Clazz, componentType) {\n        if (componentType) {\n            checkClassType(componentType);\n            componentType = parseClassType(componentType);\n\n            if (!componentType.sub) {\n                if (__DEV__) {\n                    if (storage[componentType.main]) {\n                        console.warn(componentType.main + ' exists.');\n                    }\n                }\n                storage[componentType.main] = Clazz;\n            }\n            else if (componentType.sub !== IS_CONTAINER) {\n                var container = makeContainer(componentType);\n                container[componentType.sub] = Clazz;\n            }\n        }\n        return Clazz;\n    };\n\n    entity.getClass = function (componentMainType, subType, throwWhenNotFound) {\n        var Clazz = storage[componentMainType];\n\n        if (Clazz && Clazz[IS_CONTAINER]) {\n            Clazz = subType ? Clazz[subType] : null;\n        }\n\n        if (throwWhenNotFound && !Clazz) {\n            throw new Error(\n                !subType\n                    ? componentMainType + '.' + 'type should be specified.'\n                    : 'Component ' + componentMainType + '.' + (subType || '') + ' not exists. Load it first.'\n            );\n        }\n\n        return Clazz;\n    };\n\n    entity.getClassesByMainType = function (componentType) {\n        componentType = parseClassType(componentType);\n\n        var result = [];\n        var obj = storage[componentType.main];\n\n        if (obj && obj[IS_CONTAINER]) {\n            zrUtil.each(obj, function (o, type) {\n                type !== IS_CONTAINER && result.push(o);\n            });\n        }\n        else {\n            result.push(obj);\n        }\n\n        return result;\n    };\n\n    entity.hasClass = function (componentType) {\n        // Just consider componentType.main.\n        componentType = parseClassType(componentType);\n        return !!storage[componentType.main];\n    };\n\n    /**\n     * @return {Array.<string>} Like ['aa', 'bb'], but can not be ['aa.xx']\n     */\n    entity.getAllClassMainTypes = function () {\n        var types = [];\n        zrUtil.each(storage, function (obj, type) {\n            types.push(type);\n        });\n        return types;\n    };\n\n    /**\n     * If a main type is container and has sub types\n     * @param  {string}  mainType\n     * @return {boolean}\n     */\n    entity.hasSubTypes = function (componentType) {\n        componentType = parseClassType(componentType);\n        var obj = storage[componentType.main];\n        return obj && obj[IS_CONTAINER];\n    };\n\n    entity.parseClassType = parseClassType;\n\n    function makeContainer(componentType) {\n        var container = storage[componentType.main];\n        if (!container || !container[IS_CONTAINER]) {\n            container = storage[componentType.main] = {};\n            container[IS_CONTAINER] = true;\n        }\n        return container;\n    }\n\n    if (options.registerWhenExtend) {\n        var originalExtend = entity.extend;\n        if (originalExtend) {\n            entity.extend = function (proto) {\n                var ExtendedClass = originalExtend.call(this, proto);\n                return entity.registerClass(ExtendedClass, proto.type);\n            };\n        }\n    }\n\n    return entity;\n}\n\n/**\n * @param {string|Array.<string>} properties\n */\nexport 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    //     var value = obj[prop];\n\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// TODO Parse shadow style\n// TODO Only shallow path support\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (properties) {\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    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)\n                || (includes && zrUtil.indexOf(includes, propName) < 0)\n            ) {\n                continue;\n            }\n            var val = model.getShallow(propName);\n            if (val != null) {\n                style[properties[i][0]] = val;\n            }\n        }\n        return style;\n    };\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport makeStyleMapper from './makeStyleMapper';\n\nvar getLineStyle = makeStyleMapper(\n    [\n        ['lineWidth', 'width'],\n        ['stroke', 'color'],\n        ['opacity'],\n        ['shadowBlur'],\n        ['shadowOffsetX'],\n        ['shadowOffsetY'],\n        ['shadowColor']\n    ]\n);\n\nexport default {\n    getLineStyle: function (excludes) {\n        var style = getLineStyle(this, excludes);\n        // Always set lineDash whether dashed, otherwise we can not \n        // erase the previous style when assigning to el.style.\n        style.lineDash = this.getLineDash(style.lineWidth);\n        return style;\n    },\n\n    getLineDash: function (lineWidth) {\n        if (lineWidth == null) {\n            lineWidth = 1;\n        }\n        var lineType = this.get('type');\n        var dotSize = Math.max(lineWidth, 2);\n        var dashSize = lineWidth * 4;\n        return (lineType === 'solid' || lineType == null) \n            // Use `false` but not `null` for the solid line here, because `null` might be \n            // ignored when assigning to `el.style`. e.g., when setting `lineStyle.type` as \n            // `'dashed'` and `emphasis.lineStyle.type` as `'solid'` in graph series, the \n            // `lineDash` gotten form the latter one is not able to erase that from the former \n            // one if using `null` here according to the emhpsis strategy in `util/graphic.js`.\n            ? false\n            : lineType === 'dashed' \n            ? [dashSize, dashSize] \n            : [dotSize, dotSize];\n    }\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport makeStyleMapper from './makeStyleMapper';\n\nvar getAreaStyle = makeStyleMapper(\n    [\n        ['fill', 'color'],\n        ['shadowBlur'],\n        ['shadowOffsetX'],\n        ['shadowOffsetY'],\n        ['opacity'],\n        ['shadowColor']\n    ]\n);\n\nexport default {\n    getAreaStyle: function (excludes, includes) {\n        return getAreaStyle(this, excludes, includes);\n    }\n};","/**\n * 曲线辅助模块\n * @module zrender/core/curve\n * @author pissang(https://www.github.com/pissang)\n */\n\nimport {\n    create as v2Create,\n    distSquare as v2DistSquare\n} from './vector';\n\nvar mathPow = Math.pow;\nvar mathSqrt = Math.sqrt;\n\nvar EPSILON = 1e-8;\nvar EPSILON_NUMERIC = 1e-4;\n\nvar THREE_SQRT = mathSqrt(3);\nvar ONE_THIRD = 1 / 3;\n\n// 临时变量\nvar _v0 = v2Create();\nvar _v1 = v2Create();\nvar _v2 = v2Create();\n\nfunction isAroundZero(val) {\n    return val > -EPSILON && val < EPSILON;\n}\nfunction isNotAroundZero(val) {\n    return val > EPSILON || val < -EPSILON;\n}\n/**\n * 计算三次贝塞尔值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @return {number}\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}\n\n/**\n * 计算三次贝塞尔导数值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @return {number}\n */\nexport function cubicDerivativeAt(p0, p1, p2, p3, t) {\n    var onet = 1 - t;\n    return 3 * (\n        ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet\n        + (p3 - p2) * t * t\n    );\n}\n\n/**\n * 计算三次贝塞尔方程根，使用盛金公式\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} val\n * @param  {Array.<number>} roots\n * @return {number} 有效根数目\n */\nexport function cubicRootAt(p0, p1, p2, p3, val, roots) {\n    // Evaluate roots of cubic functions\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\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\n    var n = 0;\n\n    if (isAroundZero(A) && isAroundZero(B)) {\n        if (isAroundZero(b)) {\n            roots[0] = 0;\n        }\n        else {\n            var t1 = -c / b;  //t1, t2, t3, b is not zero\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n        }\n    }\n    else {\n        var disc = B * B - 4 * A * C;\n\n        if (isAroundZero(disc)) {\n            var K = B / A;\n            var t1 = -b / a + K;  // t1, a is not zero\n            var t2 = -K / 2;  // t2, t3\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\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}\n\n/**\n * 计算三次贝塞尔方程极限值的位置\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {Array.<number>} extrema\n * @return {number} 有效数目\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\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}\n\n/**\n * 细分三次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @param  {Array.<number>} out\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\n    var p012 = (p12 - p01) * t + p01;\n    var p123 = (p23 - p12) * t + p12;\n\n    var p0123 = (p123 - p012) * t + p012;\n    // Seg0\n    out[0] = p0;\n    out[1] = p01;\n    out[2] = p012;\n    out[3] = p0123;\n    // Seg1\n    out[4] = p0123;\n    out[5] = p123;\n    out[6] = p23;\n    out[7] = p3;\n}\n\n/**\n * 投射点到三次贝塞尔曲线上，返回投射距离。\n * 投射点有可能会有一个或者多个，这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {number} x\n * @param {number} y\n * @param {Array.<number>} [out] 投射点\n * @return {number}\n */\nexport function cubicProjectPoint(\n    x0, y0, x1, y1, x2, y2, x3, y3,\n    x, y, out\n) {\n    // http://pomax.github.io/bezierinfo/#projections\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\n    _v0[0] = x;\n    _v0[1] = y;\n\n    // 先粗略估计一下可能的最小距离的 t 值\n    // PENDING\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\n    // At most 32 iteration\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        // t - interval\n        _v1[0] = cubicAt(x0, x1, x2, x3, prev);\n        _v1[1] = cubicAt(y0, y1, y2, y3, prev);\n\n        d1 = v2DistSquare(_v1, _v0);\n\n        if (prev >= 0 && d1 < d) {\n            t = prev;\n            d = d1;\n        }\n        else {\n            // t + interval\n            _v2[0] = cubicAt(x0, x1, x2, x3, next);\n            _v2[1] = cubicAt(y0, y1, y2, y3, next);\n            d2 = v2DistSquare(_v2, _v0);\n\n            if (next <= 1 && d2 < d) {\n                t = next;\n                d = d2;\n            }\n            else {\n                interval *= 0.5;\n            }\n        }\n    }\n    // t\n    if (out) {\n        out[0] = cubicAt(x0, x1, x2, x3, t);\n        out[1] = cubicAt(y0, y1, y2, y3, t);\n    }\n    // console.log(interval, i);\n    return mathSqrt(d);\n}\n\n/**\n * 计算二次方贝塞尔值\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @return {number}\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}\n\n/**\n * 计算二次方贝塞尔导数值\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @return {number}\n */\nexport function quadraticDerivativeAt(p0, p1, p2, t) {\n    return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));\n}\n\n/**\n * 计算二次方贝塞尔方程根\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @param  {Array.<number>} roots\n * @return {number} 有效根数目\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\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}\n\n/**\n * 计算二次贝塞尔方程极限值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @return {number}\n */\nexport function quadraticExtremum(p0, p1, p2) {\n    var divider = p0 + p2 - 2 * p1;\n    if (divider === 0) {\n        // p1 is center of p0 and p2\n        return 0.5;\n    }\n    else {\n        return (p0 - p1) / divider;\n    }\n}\n\n/**\n * 细分二次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @param  {Array.<number>} out\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\n    // Seg0\n    out[0] = p0;\n    out[1] = p01;\n    out[2] = p012;\n\n    // Seg1\n    out[3] = p012;\n    out[4] = p12;\n    out[5] = p2;\n}\n\n/**\n * 投射点到二次贝塞尔曲线上，返回投射距离。\n * 投射点有可能会有一个或者多个，这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x\n * @param {number} y\n * @param {Array.<number>} out 投射点\n * @return {number}\n */\nexport function quadraticProjectPoint(\n    x0, y0, x1, y1, x2, y2,\n    x, y, out\n) {\n    // http://pomax.github.io/bezierinfo/#projections\n    var t;\n    var interval = 0.005;\n    var d = Infinity;\n\n    _v0[0] = x;\n    _v0[1] = y;\n\n    // 先粗略估计一下可能的最小距离的 t 值\n    // PENDING\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\n    // At most 32 iteration\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        // t - interval\n        _v1[0] = quadraticAt(x0, x1, x2, prev);\n        _v1[1] = quadraticAt(y0, y1, y2, prev);\n\n        var d1 = v2DistSquare(_v1, _v0);\n\n        if (prev >= 0 && d1 < d) {\n            t = prev;\n            d = d1;\n        }\n        else {\n            // t + interval\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    // t\n    if (out) {\n        out[0] = quadraticAt(x0, x1, x2, t);\n        out[1] = quadraticAt(y0, y1, y2, t);\n    }\n    // console.log(interval, i);\n    return mathSqrt(d);\n}\n","/**\n * @author Yi Shen(https://github.com/pissang)\n */\n\nimport * as vec2 from './vector';\nimport * as curve from './curve';\n\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI2 = Math.PI * 2;\n\nvar start = vec2.create();\nvar end = vec2.create();\nvar extremity = vec2.create();\n\n/**\n * 从顶点数组中计算出最小包围盒，写入`min`和`max`中\n * @module zrender/core/bbox\n * @param {Array<Object>} points 顶点数组\n * @param {number} min\n * @param {number} max\n */\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    var i;\n\n    for (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\n    min[0] = left;\n    min[1] = top;\n    max[0] = right;\n    max[1] = bottom;\n}\n\n/**\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {Array.<number>} min\n * @param {Array.<number>} max\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}\n\nvar xDim = [];\nvar yDim = [];\n/**\n * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒，写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\nexport function fromCubic(\n    x0, y0, x1, y1, x2, y2, x3, y3, min, max\n) {\n    var cubicExtrema = curve.cubicExtrema;\n    var cubicAt = curve.cubicAt;\n    var i;\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\n    for (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 (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\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\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}\n\n/**\n * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒，写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\nexport function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {\n    var quadraticExtremum = curve.quadraticExtremum;\n    var quadraticAt = curve.quadraticAt;\n    // Find extremities, where derivative in x dim or y dim is zero\n    var tx =\n        mathMax(\n            mathMin(quadraticExtremum(x0, x1, x2), 1), 0\n        );\n    var ty =\n        mathMax(\n            mathMin(quadraticExtremum(y0, y1, y2), 1), 0\n        );\n\n    var x = quadraticAt(x0, x1, x2, tx);\n    var y = quadraticAt(y0, y1, y2, ty);\n\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}\n\n/**\n * 从圆弧中计算出最小包围盒，写入`min`和`max`中\n * @method\n * @memberOf module:zrender/core/bbox\n * @param {number} x\n * @param {number} y\n * @param {number} rx\n * @param {number} ry\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {number} anticlockwise\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\nexport function fromArc(\n    x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max\n) {\n    var vec2Min = vec2.min;\n    var vec2Max = vec2.max;\n\n    var diff = Math.abs(startAngle - endAngle);\n\n\n    if (diff % PI2 < 1e-4 && diff > 1e-4) {\n        // Is a circle\n        min[0] = x - rx;\n        min[1] = y - ry;\n        max[0] = x + rx;\n        max[1] = y + ry;\n        return;\n    }\n\n    start[0] = mathCos(startAngle) * rx + x;\n    start[1] = mathSin(startAngle) * ry + y;\n\n    end[0] = mathCos(endAngle) * rx + x;\n    end[1] = mathSin(endAngle) * ry + y;\n\n    vec2Min(min, start, end);\n    vec2Max(max, start, end);\n\n    // Thresh to [0, Math.PI * 2]\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\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\n    // var number = 0;\n    // var step = (anticlockwise ? -Math.PI : Math.PI) / 2;\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\n            vec2Min(min, extremity, min);\n            vec2Max(max, extremity, max);\n        }\n    }\n}\n","/**\n * Path 代理，可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中\n * 可以用于 isInsidePath 判断以及获取boundingRect\n *\n * @module zrender/core/PathProxy\n * @author Yi Shen (http://www.github.com/pissang)\n */\n\n// TODO getTotalLength, getPointAtLength\n\nimport * as curve from './curve';\nimport * as vec2 from './vector';\nimport * as bbox from './bbox';\nimport BoundingRect from './BoundingRect';\nimport {devicePixelRatio as dpr} from '../config';\n\nvar CMD = {\n    M: 1,\n    L: 2,\n    C: 3,\n    Q: 4,\n    A: 5,\n    Z: 6,\n    // Rect\n    R: 7\n};\n\n// var CMD_MEM_SIZE = {\n//     M: 3,\n//     L: 3,\n//     C: 7,\n//     Q: 5,\n//     A: 9,\n//     R: 5,\n//     Z: 1\n// };\n\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 mathSqrt = Math.sqrt;\nvar mathAbs = Math.abs;\n\nvar hasTypedArray = typeof Float32Array !== 'undefined';\n\n/**\n * @alias module:zrender/core/PathProxy\n * @constructor\n */\nvar PathProxy = function (notSaveData) {\n\n    this._saveData = !(notSaveData || false);\n\n    if (this._saveData) {\n        /**\n         * Path data. Stored as flat array\n         * @type {Array.<Object>}\n         */\n        this.data = [];\n    }\n\n    this._ctx = null;\n};\n\n/**\n * 快速计算Path包围盒（并不是最小包围盒）\n * @return {Object}\n */\nPathProxy.prototype = {\n\n    constructor: PathProxy,\n\n    _xi: 0,\n    _yi: 0,\n\n    _x0: 0,\n    _y0: 0,\n    // Unit x, Unit y. Provide for avoiding drawing that too short line segment\n    _ux: 0,\n    _uy: 0,\n\n    _len: 0,\n\n    _lineDash: null,\n\n    _dashOffset: 0,\n\n    _dashIdx: 0,\n\n    _dashSum: 0,\n\n    /**\n     * @readOnly\n     */\n    setScale: function (sx, sy, segmentIgnoreThreshold) {\n        // Compat. Previously there is no segmentIgnoreThreshold.\n        segmentIgnoreThreshold = segmentIgnoreThreshold || 0;\n        this._ux = mathAbs(segmentIgnoreThreshold / dpr / sx) || 0;\n        this._uy = mathAbs(segmentIgnoreThreshold / dpr / sy) || 0;\n    },\n\n    getContext: function () {\n        return this._ctx;\n    },\n\n    /**\n     * @param  {CanvasRenderingContext2D} ctx\n     * @return {module:zrender/core/PathProxy}\n     */\n    beginPath: function (ctx) {\n\n        this._ctx = ctx;\n\n        ctx && ctx.beginPath();\n\n        ctx && (this.dpr = ctx.dpr);\n\n        // Reset\n        if (this._saveData) {\n            this._len = 0;\n        }\n\n        if (this._lineDash) {\n            this._lineDash = null;\n\n            this._dashOffset = 0;\n        }\n\n        return this;\n    },\n\n    /**\n     * @param  {number} x\n     * @param  {number} y\n     * @return {module:zrender/core/PathProxy}\n     */\n    moveTo: function (x, y) {\n        this.addData(CMD.M, x, y);\n        this._ctx && this._ctx.moveTo(x, y);\n\n        // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用\n        // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。\n        // 有可能在 beginPath 之后直接调用 lineTo，这时候 x0, y0 需要\n        // 在 lineTo 方法中记录，这里先不考虑这种情况，dashed line 也只在 IE10- 中不支持\n        this._x0 = x;\n        this._y0 = y;\n\n        this._xi = x;\n        this._yi = y;\n\n        return this;\n    },\n\n    /**\n     * @param  {number} x\n     * @param  {number} y\n     * @return {module:zrender/core/PathProxy}\n     */\n    lineTo: function (x, y) {\n        var exceedUnit = mathAbs(x - this._xi) > this._ux\n            || mathAbs(y - this._yi) > this._uy\n            // Force draw the first segment\n            || this._len < 5;\n\n        this.addData(CMD.L, x, y);\n\n        if (this._ctx && exceedUnit) {\n            this._needsDash() ? this._dashedLineTo(x, y)\n                : this._ctx.lineTo(x, y);\n        }\n        if (exceedUnit) {\n            this._xi = x;\n            this._yi = y;\n        }\n\n        return this;\n    },\n\n    /**\n     * @param  {number} x1\n     * @param  {number} y1\n     * @param  {number} x2\n     * @param  {number} y2\n     * @param  {number} x3\n     * @param  {number} y3\n     * @return {module:zrender/core/PathProxy}\n     */\n    bezierCurveTo: function (x1, y1, x2, y2, x3, y3) {\n        this.addData(CMD.C, x1, y1, x2, y2, x3, y3);\n        if (this._ctx) {\n            this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3)\n                : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n        }\n        this._xi = x3;\n        this._yi = y3;\n        return this;\n    },\n\n    /**\n     * @param  {number} x1\n     * @param  {number} y1\n     * @param  {number} x2\n     * @param  {number} y2\n     * @return {module:zrender/core/PathProxy}\n     */\n    quadraticCurveTo: function (x1, y1, x2, y2) {\n        this.addData(CMD.Q, x1, y1, x2, y2);\n        if (this._ctx) {\n            this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2)\n                : this._ctx.quadraticCurveTo(x1, y1, x2, y2);\n        }\n        this._xi = x2;\n        this._yi = y2;\n        return this;\n    },\n\n    /**\n     * @param  {number} cx\n     * @param  {number} cy\n     * @param  {number} r\n     * @param  {number} startAngle\n     * @param  {number} endAngle\n     * @param  {boolean} anticlockwise\n     * @return {module:zrender/core/PathProxy}\n     */\n    arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n        this.addData(\n            CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1\n        );\n        this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n\n        this._xi = mathCos(endAngle) * r + cx;\n        this._yi = mathSin(endAngle) * r + cy;\n        return this;\n    },\n\n    // TODO\n    arcTo: function (x1, y1, x2, y2, radius) {\n        if (this._ctx) {\n            this._ctx.arcTo(x1, y1, x2, y2, radius);\n        }\n        return this;\n    },\n\n    // TODO\n    rect: function (x, y, w, h) {\n        this._ctx && this._ctx.rect(x, y, w, h);\n        this.addData(CMD.R, x, y, w, h);\n        return this;\n    },\n\n    /**\n     * @return {module:zrender/core/PathProxy}\n     */\n    closePath: function () {\n        this.addData(CMD.Z);\n\n        var ctx = this._ctx;\n        var x0 = this._x0;\n        var y0 = this._y0;\n        if (ctx) {\n            this._needsDash() && this._dashedLineTo(x0, y0);\n            ctx.closePath();\n        }\n\n        this._xi = x0;\n        this._yi = y0;\n        return this;\n    },\n\n    /**\n     * Context 从外部传入，因为有可能是 rebuildPath 完之后再 fill。\n     * stroke 同样\n     * @param {CanvasRenderingContext2D} ctx\n     * @return {module:zrender/core/PathProxy}\n     */\n    fill: function (ctx) {\n        ctx && ctx.fill();\n        this.toStatic();\n    },\n\n    /**\n     * @param {CanvasRenderingContext2D} ctx\n     * @return {module:zrender/core/PathProxy}\n     */\n    stroke: function (ctx) {\n        ctx && ctx.stroke();\n        this.toStatic();\n    },\n\n    /**\n     * 必须在其它绘制命令前调用\n     * Must be invoked before all other path drawing methods\n     * @return {module:zrender/core/PathProxy}\n     */\n    setLineDash: function (lineDash) {\n        if (lineDash instanceof Array) {\n            this._lineDash = lineDash;\n\n            this._dashIdx = 0;\n\n            var lineDashSum = 0;\n            for (var i = 0; i < lineDash.length; i++) {\n                lineDashSum += lineDash[i];\n            }\n            this._dashSum = lineDashSum;\n        }\n        return this;\n    },\n\n    /**\n     * 必须在其它绘制命令前调用\n     * Must be invoked before all other path drawing methods\n     * @return {module:zrender/core/PathProxy}\n     */\n    setLineDashOffset: function (offset) {\n        this._dashOffset = offset;\n        return this;\n    },\n\n    /**\n     *\n     * @return {boolean}\n     */\n    len: function () {\n        return this._len;\n    },\n\n    /**\n     * 直接设置 Path 数据\n     */\n    setData: function (data) {\n\n        var len = data.length;\n\n        if (!(this.data && this.data.length === len) && hasTypedArray) {\n            this.data = new Float32Array(len);\n        }\n\n        for (var i = 0; i < len; i++) {\n            this.data[i] = data[i];\n        }\n\n        this._len = len;\n    },\n\n    /**\n     * 添加子路径\n     * @param {module:zrender/core/PathProxy|Array.<module:zrender/core/PathProxy>} path\n     */\n    appendPath: function (path) {\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        if (hasTypedArray && (this.data instanceof Float32Array)) {\n            this.data = new Float32Array(offset + appendSize);\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\n    /**\n     * 填充 Path 数据。\n     * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。\n     */\n    addData: function (cmd) {\n        if (!this._saveData) {\n            return;\n        }\n\n        var data = this.data;\n        if (this._len + arguments.length > data.length) {\n            // 因为之前的数组已经转换成静态的 Float32Array\n            // 所以不够用时需要扩展一个新的动态数组\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        this._prevCmd = cmd;\n    },\n\n    _expandData: function () {\n        // Only if data is Float32Array\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\n    /**\n     * If needs js implemented dashed line\n     * @return {boolean}\n     * @private\n     */\n    _needsDash: function () {\n        return this._lineDash;\n    },\n\n    _dashedLineTo: function (x1, y1) {\n        var dashSum = this._dashSum;\n        var offset = this._dashOffset;\n        var lineDash = this._lineDash;\n        var ctx = this._ctx;\n\n        var x0 = this._xi;\n        var y0 = this._yi;\n        var dx = x1 - x0;\n        var dy = y1 - y0;\n        var dist = mathSqrt(dx * dx + dy * dy);\n        var x = x0;\n        var y = y0;\n        var dash;\n        var nDash = lineDash.length;\n        var idx;\n        dx /= dist;\n        dy /= dist;\n\n        if (offset < 0) {\n            // Convert to positive offset\n            offset = dashSum + offset;\n        }\n        offset %= dashSum;\n        x -= offset * dx;\n        y -= offset * dy;\n\n        while ((dx > 0 && x <= x1) || (dx < 0 && x >= x1)\n        || (dx === 0 && ((dy > 0 && y <= y1) || (dy < 0 && y >= y1)))) {\n            idx = this._dashIdx;\n            dash = lineDash[idx];\n            x += dx * dash;\n            y += dy * dash;\n            this._dashIdx = (idx + 1) % nDash;\n            // Skip positive offset\n            if ((dx > 0 && x < x0) || (dx < 0 && x > x0) || (dy > 0 && y < y0) || (dy < 0 && y > y0)) {\n                continue;\n            }\n            ctx[idx % 2 ? 'moveTo' : 'lineTo'](\n                dx >= 0 ? mathMin(x, x1) : mathMax(x, x1),\n                dy >= 0 ? mathMin(y, y1) : mathMax(y, y1)\n            );\n        }\n        // Offset for next lineTo\n        dx = x - x1;\n        dy = y - y1;\n        this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n    },\n\n    // Not accurate dashed line to\n    _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) {\n        var dashSum = this._dashSum;\n        var offset = this._dashOffset;\n        var lineDash = this._lineDash;\n        var ctx = this._ctx;\n\n        var x0 = this._xi;\n        var y0 = this._yi;\n        var t;\n        var dx;\n        var dy;\n        var cubicAt = curve.cubicAt;\n        var bezierLen = 0;\n        var idx = this._dashIdx;\n        var nDash = lineDash.length;\n\n        var x;\n        var y;\n\n        var tmpLen = 0;\n\n        if (offset < 0) {\n            // Convert to positive offset\n            offset = dashSum + offset;\n        }\n        offset %= dashSum;\n        // Bezier approx length\n        for (t = 0; t < 1; t += 0.1) {\n            dx = cubicAt(x0, x1, x2, x3, t + 0.1)\n                - cubicAt(x0, x1, x2, x3, t);\n            dy = cubicAt(y0, y1, y2, y3, t + 0.1)\n                - cubicAt(y0, y1, y2, y3, t);\n            bezierLen += mathSqrt(dx * dx + dy * dy);\n        }\n\n        // Find idx after add offset\n        for (; idx < nDash; idx++) {\n            tmpLen += lineDash[idx];\n            if (tmpLen > offset) {\n                break;\n            }\n        }\n        t = (tmpLen - offset) / bezierLen;\n\n        while (t <= 1) {\n\n            x = cubicAt(x0, x1, x2, x3, t);\n            y = cubicAt(y0, y1, y2, y3, t);\n\n            // Use line to approximate dashed bezier\n            // Bad result if dash is long\n            idx % 2 ? ctx.moveTo(x, y)\n                : ctx.lineTo(x, y);\n\n            t += lineDash[idx] / bezierLen;\n\n            idx = (idx + 1) % nDash;\n        }\n\n        // Finish the last segment and calculate the new offset\n        (idx % 2 !== 0) && ctx.lineTo(x3, y3);\n        dx = x3 - x;\n        dy = y3 - y;\n        this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n    },\n\n    _dashedQuadraticTo: function (x1, y1, x2, y2) {\n        // Convert quadratic to cubic using degree elevation\n        var x3 = x2;\n        var y3 = y2;\n        x2 = (x2 + 2 * x1) / 3;\n        y2 = (y2 + 2 * y1) / 3;\n        x1 = (this._xi + 2 * x1) / 3;\n        y1 = (this._yi + 2 * y1) / 3;\n\n        this._dashedBezierTo(x1, y1, x2, y2, x3, y3);\n    },\n\n    /**\n     * 转成静态的 Float32Array 减少堆内存占用\n     * Convert dynamic array to static Float32Array\n     */\n    toStatic: function () {\n        var data = this.data;\n        if (data instanceof Array) {\n            data.length = this._len;\n            if (hasTypedArray) {\n                this.data = new Float32Array(data);\n            }\n        }\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    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\n        var data = this.data;\n        var xi = 0;\n        var yi = 0;\n        var x0 = 0;\n        var y0 = 0;\n\n        for (var i = 0; i < data.length;) {\n            var cmd = data[i++];\n\n            if (i === 1) {\n                // 如果第一个命令是 L, C, Q\n                // 则 previous point 同绘制命令的第一个 point\n                //\n                // 第一个命令为 Arc 的情况下会在后面特殊处理\n                xi = data[i];\n                yi = data[i + 1];\n\n                x0 = xi;\n                y0 = yi;\n            }\n\n            switch (cmd) {\n                case CMD.M:\n                    // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n                    // 在 closePath 的时候使用\n                    x0 = data[i++];\n                    y0 = data[i++];\n                    xi = x0;\n                    yi = y0;\n                    min2[0] = x0;\n                    min2[1] = y0;\n                    max2[0] = x0;\n                    max2[1] = y0;\n                    break;\n                case CMD.L:\n                    bbox.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                    bbox.fromCubic(\n                        xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1],\n                        min2, max2\n                    );\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD.Q:\n                    bbox.fromQuadratic(\n                        xi, yi, data[i++], data[i++], data[i], data[i + 1],\n                        min2, max2\n                    );\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD.A:\n                    // TODO Arc 判断的开销比较大\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                    // TODO Arc 旋转\n                    i += 1;\n                    var anticlockwise = 1 - data[i++];\n\n                    if (i === 1) {\n                        // 直接使用 arc 命令\n                        // 第一个命令起点还未定义\n                        x0 = mathCos(startAngle) * rx + cx;\n                        y0 = mathSin(startAngle) * ry + cy;\n                    }\n\n                    bbox.fromArc(\n                        cx, cy, rx, ry, startAngle, endAngle,\n                        anticlockwise, min2, max2\n                    );\n\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                    // Use fromLine\n                    bbox.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\n            // Union\n            vec2.min(min, min, min2);\n            vec2.max(max, max, max2);\n        }\n\n        // No data\n        if (i === 0) {\n            min[0] = min[1] = max[0] = max[1] = 0;\n        }\n\n        return new BoundingRect(\n            min[0], min[1], max[0] - min[0], max[1] - min[1]\n        );\n    },\n\n    /**\n     * Rebuild path from current data\n     * Rebuild path will not consider javascript implemented line dash.\n     * @param {CanvasRenderingContext2D} ctx\n     */\n    rebuildPath: function (ctx) {\n        var d = this.data;\n        var x0, y0;\n        var xi, yi;\n        var x, y;\n        var ux = this._ux;\n        var uy = this._uy;\n        var len = this._len;\n        for (var i = 0; i < len;) {\n            var cmd = d[i++];\n\n            if (i === 1) {\n                // 如果第一个命令是 L, C, Q\n                // 则 previous point 同绘制命令的第一个 point\n                //\n                // 第一个命令为 Arc 的情况下会在后面特殊处理\n                xi = d[i];\n                yi = d[i + 1];\n\n                x0 = xi;\n                y0 = yi;\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                    // Not draw too small seg between\n                    if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len - 1) {\n                        ctx.lineTo(x, y);\n                        xi = x;\n                        yi = y;\n                    }\n                    break;\n                case CMD.C:\n                    ctx.bezierCurveTo(\n                        d[i++], d[i++], d[i++], d[i++], d[i++], d[i++]\n                    );\n                    xi = d[i - 2];\n                    yi = d[i - 1];\n                    break;\n                case CMD.Q:\n                    ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]);\n                    xi = d[i - 2];\n                    yi = d[i - 1];\n                    break;\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 theta = d[i++];\n                    var dTheta = d[i++];\n                    var psi = d[i++];\n                    var fs = d[i++];\n                    var r = (rx > ry) ? rx : ry;\n                    var scaleX = (rx > ry) ? 1 : rx / ry;\n                    var scaleY = (rx > ry) ? ry / rx : 1;\n                    var isEllipse = Math.abs(rx - ry) > 1e-3;\n                    var endAngle = theta + dTheta;\n                    if (isEllipse) {\n                        ctx.translate(cx, cy);\n                        ctx.rotate(psi);\n                        ctx.scale(scaleX, scaleY);\n                        ctx.arc(0, 0, r, theta, endAngle, 1 - fs);\n                        ctx.scale(1 / scaleX, 1 / scaleY);\n                        ctx.rotate(-psi);\n                        ctx.translate(-cx, -cy);\n                    }\n                    else {\n                        ctx.arc(cx, cy, r, theta, endAngle, 1 - fs);\n                    }\n\n                    if (i === 1) {\n                        // 直接使用 arc 命令\n                        // 第一个命令起点还未定义\n                        x0 = mathCos(theta) * rx + cx;\n                        y0 = mathSin(theta) * 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                    ctx.rect(d[i++], d[i++], d[i++], d[i++]);\n                    break;\n                case CMD.Z:\n                    ctx.closePath();\n                    xi = x0;\n                    yi = y0;\n            }\n        }\n    }\n};\n\nPathProxy.CMD = CMD;\n\nexport default PathProxy;","\n/**\n * 线段包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\nexport 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    // Quick reject\n    if (\n        (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    ) {\n        return false;\n    }\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}","\nimport * as curve from '../core/curve';\n\n/**\n * 三次贝塞尔曲线描边包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  x2\n * @param  {number}  y2\n * @param  {number}  x3\n * @param  {number}  y3\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\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    // Quick reject\n    if (\n        (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    ) {\n        return false;\n    }\n    var d = curve.cubicProjectPoint(\n        x0, y0, x1, y1, x2, y2, x3, y3,\n        x, y, null\n    );\n    return d <= _l / 2;\n}","import {quadraticProjectPoint} from '../core/curve';\n\n/**\n * 二次贝塞尔曲线描边包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  x2\n * @param  {number}  y2\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\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    // Quick reject\n    if (\n        (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    ) {\n        return false;\n    }\n    var d = quadraticProjectPoint(\n        x0, y0, x1, y1, x2, y2,\n        x, y, null\n    );\n    return d <= _l / 2;\n}\n","\nvar PI2 = Math.PI * 2;\n\nexport function normalizeRadian(angle) {\n    angle %= PI2;\n    if (angle < 0) {\n        angle += PI2;\n    }\n    return angle;\n}","\nimport {normalizeRadian} from './util';\n\nvar PI2 = Math.PI * 2;\n\n/**\n * 圆弧描边包含判断\n * @param  {number}  cx\n * @param  {number}  cy\n * @param  {number}  r\n * @param  {number}  startAngle\n * @param  {number}  endAngle\n * @param  {boolean}  anticlockwise\n * @param  {number} lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {Boolean}\n */\nexport function containStroke(\n    cx, cy, r, startAngle, endAngle, anticlockwise,\n    lineWidth, x, y\n) {\n\n    if (lineWidth === 0) {\n        return false;\n    }\n    var _l = lineWidth;\n\n    x -= cx;\n    y -= cy;\n    var d = Math.sqrt(x * x + y * y);\n\n    if ((d - _l > r) || (d + _l < r)) {\n        return false;\n    }\n    if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {\n        // Is a circle\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\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}","\nexport default function windingLine(x0, y0, x1, y1, x, y) {\n    if ((y > y0 && y > y1) || (y < y0 && y < y1)) {\n        return 0;\n    }\n    // Ignore horizontal line\n    if (y1 === y0) {\n        return 0;\n    }\n    var dir = y1 < y0 ? 1 : -1;\n    var t = (y - y0) / (y1 - y0);\n\n    // Avoid winding error when intersection point is the connect point of two line of polygon\n    if (t === 1 || t === 0) {\n        dir = y1 < y0 ? 0.5 : -0.5;\n    }\n\n    var x_ = t * (x1 - x0) + x0;\n\n    // If (x, y) on the line, considered as \"contain\".\n    return x_ === x ? Infinity : x_ > x ? dir : 0;\n}","import PathProxy from '../core/PathProxy';\nimport * as line from './line';\nimport * as cubic from './cubic';\nimport * as quadratic from './quadratic';\nimport * as arc from './arc';\nimport {normalizeRadian} from './util';\nimport * as curve from '../core/curve';\nimport windingLine from './windingLine';\n\nvar CMD = PathProxy.CMD;\nvar PI2 = Math.PI * 2;\n\nvar EPSILON = 1e-4;\n\nfunction isAroundEqual(a, b) {\n    return Math.abs(a - b) < EPSILON;\n}\n\n// 临时数组\nvar roots = [-1, -1, -1];\nvar extrema = [-1, -1];\n\nfunction swapExtrema() {\n    var tmp = extrema[0];\n    extrema[0] = extrema[1];\n    extrema[1] = tmp;\n}\n\nfunction windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {\n    // Quick reject\n    if (\n        (y > y0 && y > y1 && y > y2 && y > y3)\n        || (y < y0 && y < y1 && y < y2 && y < y3)\n    ) {\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_;\n        var y1_;\n        for (var i = 0; i < nRoots; i++) {\n            var t = roots[i];\n\n            // Avoid winding error when intersection point is the connect point of two line of polygon\n            var unit = (t === 0 || t === 1) ? 0.5 : 1;\n\n            var x_ = curve.cubicAt(x0, x1, x2, x3, t);\n            if (x_ < x) { // Quick reject\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                // 分成三段单调函数\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                // 分成两段单调函数\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}\n\nfunction windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {\n    // Quick reject\n    if (\n        (y > y0 && y > y1 && y > y2)\n        || (y < y0 && y < y1 && y < y2)\n    ) {\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                // Remove one endpoint.\n                var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1;\n\n                var x_ = curve.quadraticAt(x0, x1, x2, roots[i]);\n                if (x_ < x) {   // Quick reject\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            // Remove one endpoint.\n            var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1;\n\n            var x_ = curve.quadraticAt(x0, x1, x2, roots[0]);\n            if (x_ < x) {   // Quick reject\n                return 0;\n            }\n            return y2 < y0 ? unit : -unit;\n        }\n    }\n}\n\n// TODO\n// Arc 旋转\nfunction windingArc(\n    cx, cy, r, startAngle, endAngle, anticlockwise, x, y\n) {\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\n    var diff = Math.abs(startAngle - endAngle);\n    if (diff < 1e-4) {\n        return 0;\n    }\n    if (diff % PI2 < 1e-4) {\n        // Is a circle\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\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\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 (\n                (angle >= startAngle && angle <= endAngle)\n                || (angle + PI2 >= startAngle && angle + PI2 <= endAngle)\n            ) {\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}\n\nfunction containPath(data, lineWidth, isStroke, x, y) {\n    var w = 0;\n    var xi = 0;\n    var yi = 0;\n    var x0 = 0;\n    var y0 = 0;\n\n    for (var i = 0; i < data.length;) {\n        var cmd = data[i++];\n        // Begin a new subpath\n        if (cmd === CMD.M && i > 1) {\n            // Close previous subpath\n            if (!isStroke) {\n                w += windingLine(xi, yi, x0, y0, x, y);\n            }\n            // 如果被任何一个 subpath 包含\n            // if (w !== 0) {\n            //     return true;\n            // }\n        }\n\n        if (i === 1) {\n            // 如果第一个命令是 L, C, Q\n            // 则 previous point 同绘制命令的第一个 point\n            //\n            // 第一个命令为 Arc 的情况下会在后面特殊处理\n            xi = data[i];\n            yi = data[i + 1];\n\n            x0 = xi;\n            y0 = yi;\n        }\n\n        switch (cmd) {\n            case CMD.M:\n                // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n                // 在 closePath 的时候使用\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                    // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN\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,\n                        data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1],\n                        lineWidth, x, y\n                    )) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingCubic(\n                        xi, yi,\n                        data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1],\n                        x, y\n                    ) || 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,\n                        data[i++], data[i++], data[i], data[i + 1],\n                        lineWidth, x, y\n                    )) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingQuadratic(\n                        xi, yi,\n                        data[i++], data[i++], data[i], data[i + 1],\n                        x, y\n                    ) || 0;\n                }\n                xi = data[i++];\n                yi = data[i++];\n                break;\n            case CMD.A:\n                // TODO Arc 判断的开销比较大\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 旋转\n                i += 1;\n                var anticlockwise = 1 - data[i++];\n                var x1 = Math.cos(theta) * rx + cx;\n                var y1 = Math.sin(theta) * ry + cy;\n                // 不是直接使用 arc 命令\n                if (i > 1) {\n                    w += windingLine(xi, yi, x1, y1, x, y);\n                }\n                else {\n                    // 第一个命令起点还未定义\n                    x0 = x1;\n                    y0 = y1;\n                }\n                // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放\n                var _x = (x - cx) * ry / rx + cx;\n                if (isStroke) {\n                    if (arc.containStroke(\n                        cx, cy, ry, theta, theta + dTheta, anticlockwise,\n                        lineWidth, _x, y\n                    )) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingArc(\n                        cx, cy, ry, theta, theta + dTheta, anticlockwise,\n                        _x, y\n                    );\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                var x1 = x0 + width;\n                var 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                    ) {\n                        return true;\n                    }\n                }\n                else {\n                    // FIXME Clockwise ?\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(\n                        xi, yi, x0, y0, lineWidth, x, y\n                    )) {\n                        return true;\n                    }\n                }\n                else {\n                    // Close a subpath\n                    w += windingLine(xi, yi, x0, y0, x, y);\n                    // 如果被任何一个 subpath 包含\n                    // FIXME subpaths may overlap\n                    // if (w !== 0) {\n                    //     return true;\n                    // }\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}\n\nexport function contain(pathData, x, y) {\n    return containPath(pathData, 0, false, x, y);\n}\n\nexport function containStroke(pathData, lineWidth, x, y) {\n    return containPath(pathData, lineWidth, true, x, y);\n}","import Displayable from './Displayable';\nimport * as zrUtil from '../core/util';\nimport PathProxy from '../core/PathProxy';\nimport * as pathContain from '../contain/path';\nimport Pattern from './Pattern';\n\nvar getCanvasPattern = Pattern.prototype.getCanvasPattern;\n\nvar abs = Math.abs;\n\nvar pathProxyForDraw = new PathProxy(true);\n/**\n * @alias module:zrender/graphic/Path\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\nfunction Path(opts) {\n    Displayable.call(this, opts);\n\n    /**\n     * @type {module:zrender/core/PathProxy}\n     * @readOnly\n     */\n    this.path = null;\n}\n\nPath.prototype = {\n\n    constructor: Path,\n\n    type: 'path',\n\n    __dirtyPath: true,\n\n    strokeContainThreshold: 5,\n\n    // This item default to be false. But in map series in echarts,\n    // in order to improve performance, it should be set to true,\n    // so the shorty segment won't draw.\n    segmentIgnoreThreshold: 0,\n\n    /**\n     * See `module:zrender/src/graphic/helper/subPixelOptimize`.\n     * @type {boolean}\n     */\n    subPixelOptimize: false,\n\n    brush: function (ctx, prevEl) {\n        var style = this.style;\n        var path = this.path || pathProxyForDraw;\n        var hasStroke = style.hasStroke();\n        var hasFill = style.hasFill();\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\n        style.bind(ctx, this, prevEl);\n        this.setTransform(ctx);\n\n        if (this.__dirty) {\n            var rect;\n            // Update gradient because bounding rect may changed\n            if (hasFillGradient) {\n                rect = rect || this.getBoundingRect();\n                this._fillGradient = style.getGradient(ctx, fill, rect);\n            }\n            if (hasStrokeGradient) {\n                rect = rect || this.getBoundingRect();\n                this._strokeGradient = style.getGradient(ctx, stroke, rect);\n            }\n        }\n        // Use the gradient or pattern\n        if (hasFillGradient) {\n            // PENDING If may have affect the state\n            ctx.fillStyle = this._fillGradient;\n        }\n        else if (hasFillPattern) {\n            ctx.fillStyle = getCanvasPattern.call(fill, ctx);\n        }\n        if (hasStrokeGradient) {\n            ctx.strokeStyle = this._strokeGradient;\n        }\n        else if (hasStrokePattern) {\n            ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);\n        }\n\n        var lineDash = style.lineDash;\n        var lineDashOffset = style.lineDashOffset;\n\n        var ctxLineDash = !!ctx.setLineDash;\n\n        // Update path sx, sy\n        var scale = this.getGlobalScale();\n        path.setScale(scale[0], scale[1], this.segmentIgnoreThreshold);\n\n        // Proxy context\n        // Rebuild path in following 2 cases\n        // 1. Path is dirty\n        // 2. Path needs javascript implemented lineDash stroking.\n        //    In this case, lineDash information will not be saved in PathProxy\n        if (this.__dirtyPath\n            || (lineDash && !ctxLineDash && hasStroke)\n        ) {\n            path.beginPath(ctx);\n\n            // Setting line dash before build path\n            if (lineDash && !ctxLineDash) {\n                path.setLineDash(lineDash);\n                path.setLineDashOffset(lineDashOffset);\n            }\n\n            this.buildPath(path, this.shape, false);\n\n            // Clear path dirty flag\n            if (this.path) {\n                this.__dirtyPath = false;\n            }\n        }\n        else {\n            // Replay path building\n            ctx.beginPath();\n            this.path.rebuildPath(ctx);\n        }\n\n        if (hasFill) {\n            if (style.fillOpacity != null) {\n                var originalGlobalAlpha = ctx.globalAlpha;\n                ctx.globalAlpha = style.fillOpacity * style.opacity;\n                path.fill(ctx);\n                ctx.globalAlpha = originalGlobalAlpha;\n            }\n            else {\n                path.fill(ctx);\n            }\n        }\n\n        if (lineDash && ctxLineDash) {\n            ctx.setLineDash(lineDash);\n            ctx.lineDashOffset = lineDashOffset;\n        }\n\n        if (hasStroke) {\n            if (style.strokeOpacity != null) {\n                var originalGlobalAlpha = ctx.globalAlpha;\n                ctx.globalAlpha = style.strokeOpacity * style.opacity;\n                path.stroke(ctx);\n                ctx.globalAlpha = originalGlobalAlpha;\n            }\n            else {\n                path.stroke(ctx);\n            }\n        }\n\n        if (lineDash && ctxLineDash) {\n            // PENDING\n            // Remove lineDash\n            ctx.setLineDash([]);\n        }\n\n        // Draw rect text\n        if (style.text != null) {\n            // Only restore transform when needs draw text.\n            this.restoreTransform(ctx);\n            this.drawRectText(ctx, this.getBoundingRect());\n        }\n    },\n\n    // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath\n    // Like in circle\n    buildPath: function (ctx, shapeCfg, inBundle) {},\n\n    createPathProxy: function () {\n        this.path = new PathProxy();\n    },\n\n    getBoundingRect: function () {\n        var rect = this._rect;\n        var style = this.style;\n        var needsUpdateRect = !rect;\n        if (needsUpdateRect) {\n            var path = this.path;\n            if (!path) {\n                // Create path on demand.\n                path = this.path = new PathProxy();\n            }\n            if (this.__dirtyPath) {\n                path.beginPath();\n                this.buildPath(path, this.shape, false);\n            }\n            rect = path.getBoundingRect();\n        }\n        this._rect = rect;\n\n        if (style.hasStroke()) {\n            // Needs update rect with stroke lineWidth when\n            // 1. Element changes scale or lineWidth\n            // 2. Shape is changed\n            var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());\n            if (this.__dirty || needsUpdateRect) {\n                rectWithStroke.copy(rect);\n                // FIXME Must after updateTransform\n                var w = style.lineWidth;\n                // PENDING, Min line width is needed when line is horizontal or vertical\n                var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n\n                // Only add extra hover lineWidth when there are no fill\n                if (!style.hasFill()) {\n                    w = Math.max(w, this.strokeContainThreshold || 4);\n                }\n                // Consider line width\n                // Line scale can't be 0;\n                if (lineScale > 1e-10) {\n                    rectWithStroke.width += w / lineScale;\n                    rectWithStroke.height += w / lineScale;\n                    rectWithStroke.x -= w / lineScale / 2;\n                    rectWithStroke.y -= w / lineScale / 2;\n                }\n            }\n\n            // Return rect with stroke\n            return rectWithStroke;\n        }\n\n        return rect;\n    },\n\n    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\n        if (rect.contain(x, y)) {\n            var pathData = this.path.data;\n            if (style.hasStroke()) {\n                var lineWidth = style.lineWidth;\n                var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n                // Line scale can't be 0;\n                if (lineScale > 1e-10) {\n                    // Only add extra hover lineWidth when there are no fill\n                    if (!style.hasFill()) {\n                        lineWidth = Math.max(lineWidth, this.strokeContainThreshold);\n                    }\n                    if (pathContain.containStroke(\n                        pathData, lineWidth / lineScale, x, y\n                    )) {\n                        return true;\n                    }\n                }\n            }\n            if (style.hasFill()) {\n                return pathContain.contain(pathData, x, y);\n            }\n        }\n        return false;\n    },\n\n    /**\n     * @param  {boolean} dirtyPath\n     */\n    dirty: function (dirtyPath) {\n        if (dirtyPath == null) {\n            dirtyPath = true;\n        }\n        // Only mark dirty, not mark clean\n        if (dirtyPath) {\n            this.__dirtyPath = dirtyPath;\n            this._rect = null;\n        }\n\n        this.__dirty = this.__dirtyText = true;\n\n        this.__zr && this.__zr.refresh();\n\n        // Used as a clipping path\n        if (this.__clipTarget) {\n            this.__clipTarget.dirty();\n        }\n    },\n\n    /**\n     * Alias for animate('shape')\n     * @param {boolean} loop\n     */\n    animateShape: function (loop) {\n        return this.animate('shape', loop);\n    },\n\n    // Overwrite attrKV\n    attrKV: function (key, value) {\n        // FIXME\n        if (key === 'shape') {\n            this.setShape(value);\n            this.__dirtyPath = true;\n            this._rect = null;\n        }\n        else {\n            Displayable.prototype.attrKV.call(this, key, value);\n        }\n    },\n\n    /**\n     * @param {Object|string} key\n     * @param {*} value\n     */\n    setShape: function (key, value) {\n        var shape = this.shape;\n        // Path from string may not have shape\n        if (shape) {\n            if (zrUtil.isObject(key)) {\n                for (var name in key) {\n                    if (key.hasOwnProperty(name)) {\n                        shape[name] = key[name];\n                    }\n                }\n            }\n            else {\n                shape[key] = value;\n            }\n            this.dirty(true);\n        }\n        return this;\n    },\n\n    getLineScale: function () {\n        var m = this.transform;\n        // Get the line scale.\n        // Determinant of `m` means how much the area is enlarged by the\n        // transformation. So its square root can be used as a scale factor\n        // for width.\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};\n\n/**\n * 扩展一个 Path element, 比如星形，圆等。\n * Extend a path element\n * @param {Object} props\n * @param {string} props.type Path type\n * @param {Function} props.init Initialize\n * @param {Function} props.buildPath Overwrite buildPath method\n * @param {Object} [props.style] Extended default style config\n * @param {Object} [props.shape] Extended default shape config\n */\nPath.extend = function (defaults) {\n    var Sub = function (opts) {\n        Path.call(this, opts);\n\n        if (defaults.style) {\n            // Extend default style\n            this.style.extendFrom(defaults.style, false);\n        }\n\n        // Extend default shape\n        var defaultShape = defaults.shape;\n        if (defaultShape) {\n            this.shape = this.shape || {};\n            var thisShape = this.shape;\n            for (var name in defaultShape) {\n                if (\n                    !thisShape.hasOwnProperty(name)\n                    && defaultShape.hasOwnProperty(name)\n                ) {\n                    thisShape[name] = defaultShape[name];\n                }\n            }\n        }\n\n        defaults.init && defaults.init.call(this, opts);\n    };\n\n    zrUtil.inherits(Sub, Path);\n\n    // FIXME 不能 extend position, rotation 等引用对象\n    for (var name in defaults) {\n        // Extending prototype values and methods\n        if (name !== 'style' && name !== 'shape') {\n            Sub.prototype[name] = defaults[name];\n        }\n    }\n\n    return Sub;\n};\n\nzrUtil.inherits(Path, Displayable);\n\nexport default Path;","import PathProxy from '../core/PathProxy';\nimport {applyTransform as v2ApplyTransform} from '../core/vector';\n\nvar CMD = PathProxy.CMD;\n\nvar points = [[], [], []];\nvar mathSqrt = Math.sqrt;\nvar mathAtan2 = Math.atan2;\n\nexport default function (path, m) {\n    var data = path.data;\n    var cmd;\n    var nPoint;\n    var i;\n    var j;\n    var k;\n    var p;\n\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\n    for (i = 0, j = 0; i < data.length;) {\n        cmd = data[i++];\n        j = i;\n        nPoint = 0;\n\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                // cx\n                data[i] *= sx;\n                data[i++] += x;\n                // cy\n                data[i] *= sy;\n                data[i++] += y;\n                // Scale rx and ry\n                // FIXME Assume psi is 0 here\n                data[i++] *= sx;\n                data[i++] *= sy;\n\n                // Start angle\n                data[i++] += angle;\n                // end angle\n                data[i++] += angle;\n                // FIXME psi\n                i += 2;\n                j = i;\n                break;\n            case R:\n                // x0, y0\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                // x1, y1\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\n        for (k = 0; k < nPoint; k++) {\n            var p = points[k];\n            p[0] = data[i++];\n            p[1] = data[i++];\n\n            v2ApplyTransform(p, p, m);\n            // Write back\n            data[j++] = p[0];\n            data[j++] = p[1];\n        }\n    }\n}\n","import Path from '../graphic/Path';\nimport PathProxy from '../core/PathProxy';\nimport transformPath from './transformPath';\n\n// command chars\n// var cc = [\n//     'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',\n//     'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'\n// ];\n\nvar mathSqrt = Math.sqrt;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI = Math.PI;\n\nvar vMag = function (v) {\n    return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n};\nvar vRatio = function (u, v) {\n    return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));\n};\nvar vAngle = function (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\n    var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);\n\n    if (lambda > 1) {\n        rx *= mathSqrt(lambda);\n        ry *= mathSqrt(lambda);\n    }\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))\n            ) || 0;\n\n    var cxp = f * rx * yp / ry;\n    var cyp = f * -ry * xp / rx;\n\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\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\n    if (vRatio(u, v) <= -1) {\n        dTheta = PI;\n    }\n    if (vRatio(u, v) >= 1) {\n        dTheta = 0;\n    }\n    if (fs === 0 && dTheta > 0) {\n        dTheta = dTheta - 2 * PI;\n    }\n    if (fs === 1 && dTheta < 0) {\n        dTheta = dTheta + 2 * PI;\n    }\n\n    path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);\n}\n\n\nvar commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig;\n// Consider case:\n// (1) delimiter can be comma or space, where continuous commas\n// or spaces should be seen as one comma.\n// (2) value can be like:\n// '2e-4', 'l.5.9' (ignore 0), 'M-10-10', 'l-2.43e-1,34.9983',\n// 'l-.5E1,54', '121-23-44-11' (no delimiter)\nvar numberReg = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;\n// var valueSplitReg = /[\\s,]+/;\n\nfunction createPathProxyFromString(data) {\n    if (!data) {\n        return new PathProxy();\n    }\n\n    // var data = data.replace(/-/g, ' -')\n    //     .replace(/  /g, ' ')\n    //     .replace(/ /g, ',')\n    //     .replace(/,,/g, ',');\n\n    // var n;\n    // create pipes so that we can split the data\n    // for (n = 0; n < cc.length; n++) {\n    //     cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);\n    // }\n\n    // data = data.replace(/-/g, ',-');\n\n    // create array\n    // var arr = cs.split('|');\n    // init context point\n    var cpx = 0;\n    var cpy = 0;\n    var subpathX = cpx;\n    var subpathY = cpy;\n    var prevCmd;\n\n    var path = new PathProxy();\n    var CMD = PathProxy.CMD;\n\n    // commandReg.lastIndex = 0;\n    // var cmdResult;\n    // while ((cmdResult = commandReg.exec(data)) != null) {\n    //     var cmdStr = cmdResult[1];\n    //     var cmdContent = cmdResult[2];\n\n    var cmdList = data.match(commandReg);\n    for (var l = 0; l < cmdList.length; l++) {\n        var cmdText = cmdList[l];\n        var cmdStr = cmdText.charAt(0);\n\n        var cmd;\n\n        // String#split is faster a little bit than String#replace or RegExp#exec.\n        // var p = cmdContent.split(valueSplitReg);\n        // var pLen = 0;\n        // for (var i = 0; i < p.length; i++) {\n        //     // '' and other invalid str => NaN\n        //     var val = parseFloat(p[i]);\n        //     !isNaN(val) && (p[pLen++] = val);\n        // }\n\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\n        var off = 0;\n        while (off < pLen) {\n            var ctlPtx;\n            var ctlPty;\n\n            var rx;\n            var ry;\n            var psi;\n            var fa;\n            var fs;\n\n            var x1 = cpx;\n            var y1 = cpy;\n\n            // convert l, H, h, V, and v to L\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(\n                        cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]\n                    );\n                    cpx = p[off - 2];\n                    cpy = p[off - 1];\n                    break;\n                case 'c':\n                    cmd = CMD.C;\n                    path.addData(\n                        cmd,\n                        p[off++] + cpx, p[off++] + cpy,\n                        p[off++] + cpx, p[off++] + cpy,\n                        p[off++] + cpx, p[off++] + cpy\n                    );\n                    cpx += p[off - 2];\n                    cpy += p[off - 1];\n                    break;\n                case 'S':\n                    ctlPtx = cpx;\n                    ctlPty = cpy;\n                    var len = path.len();\n                    var 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                    var len = path.len();\n                    var 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                    var len = path.len();\n                    var 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                    var len = path.len();\n                    var 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\n                    x1 = cpx, y1 = cpy;\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.A;\n                    processArc(\n                        x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path\n                    );\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\n                    x1 = cpx, y1 = cpy;\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.A;\n                    processArc(\n                        x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path\n                    );\n                    break;\n            }\n        }\n\n        if (cmdStr === 'z' || cmdStr === 'Z') {\n            cmd = CMD.Z;\n            path.addData(cmd);\n            // z may be in the middle of the path.\n            cpx = subpathX;\n            cpy = subpathY;\n        }\n\n        prevCmd = cmd;\n    }\n\n    path.toStatic();\n\n    return path;\n}\n\n// TODO Optimize double memory cost problem\nfunction createPathOptions(str, opts) {\n    var pathProxy = createPathProxyFromString(str);\n    opts = opts || {};\n    opts.buildPath = function (path) {\n        if (path.setData) {\n            path.setData(pathProxy.data);\n            // Svg and vml renderer don't have context\n            var ctx = path.getContext();\n            if (ctx) {\n                path.rebuildPath(ctx);\n            }\n        }\n        else {\n            var ctx = path;\n            pathProxy.rebuildPath(ctx);\n        }\n    };\n\n    opts.applyTransform = function (m) {\n        transformPath(pathProxy, m);\n        this.dirty(true);\n    };\n\n    return opts;\n}\n\n/**\n * Create a Path object from path string data\n * http://www.w3.org/TR/SVG/paths.html#PathData\n * @param  {Object} opts Other options\n */\nexport function createFromString(str, opts) {\n    return new Path(createPathOptions(str, opts));\n}\n\n/**\n * Create a Path class from path string data\n * @param  {string} str\n * @param  {Object} opts Other options\n */\nexport function extendFromString(str, opts) {\n    return Path.extend(createPathOptions(str, opts));\n}\n\n/**\n * Merge multiple paths\n */\n// TODO Apply transform\n// TODO stroke dash\n// TODO Optimize double memory cost problem\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        if (!pathEl.path) {\n            pathEl.createPathProxy();\n        }\n        if (pathEl.__dirtyPath) {\n            pathEl.buildPath(pathEl.path, pathEl.shape, true);\n        }\n        pathList.push(pathEl.path);\n    }\n\n    var pathBundle = new Path(opts);\n    // Need path proxy.\n    pathBundle.createPathProxy();\n    pathBundle.buildPath = function (path) {\n        path.appendPath(pathList);\n        // Svg and vml renderer don't have context\n        var ctx = path.getContext();\n        if (ctx) {\n            path.rebuildPath(ctx);\n        }\n    };\n\n    return pathBundle;\n}","import Displayable from './Displayable';\nimport * as zrUtil from '../core/util';\nimport * as textContain from '../contain/text';\nimport * as textHelper from './helper/text';\nimport {ContextCachedBy} from './constant';\n\n/**\n * @alias zrender/graphic/Text\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\nvar Text = function (opts) { // jshint ignore:line\n    Displayable.call(this, opts);\n};\n\nText.prototype = {\n\n    constructor: Text,\n\n    type: 'text',\n\n    brush: function (ctx, prevEl) {\n        var style = this.style;\n\n        // Optimize, avoid normalize every time.\n        this.__dirty && textHelper.normalizeTextStyle(style, true);\n\n        // Use props with prefix 'text'.\n        style.fill = style.stroke = style.shadowBlur = style.shadowColor =\n            style.shadowOffsetX = style.shadowOffsetY = null;\n\n        var text = style.text;\n        // Convert to string\n        text != null && (text += '');\n\n        // Do not apply style.bind in Text node. Because the real bind job\n        // is in textHelper.renderText, and performance of text render should\n        // be considered.\n        // style.bind(ctx, this, prevEl);\n\n        if (!textHelper.needDrawText(text, style)) {\n            // The current el.style is not applied\n            // and should not be used as cache.\n            ctx.__attrCachedBy = ContextCachedBy.NONE;\n            return;\n        }\n\n        this.setTransform(ctx);\n\n        textHelper.renderText(this, ctx, text, style, null, prevEl);\n\n        this.restoreTransform(ctx);\n    },\n\n    getBoundingRect: function () {\n        var style = this.style;\n\n        // Optimize, avoid normalize every time.\n        this.__dirty && textHelper.normalizeTextStyle(style, true);\n\n        if (!this._rect) {\n            var text = style.text;\n            text != null ? (text += '') : (text = '');\n\n            var rect = textContain.getBoundingRect(\n                style.text + '',\n                style.font,\n                style.textAlign,\n                style.textVerticalAlign,\n                style.textPadding,\n                style.textLineHeight,\n                style.rich\n            );\n\n            rect.x += style.x || 0;\n            rect.y += style.y || 0;\n\n            if (textHelper.getStroke(style.textStroke, style.textStrokeWidth)) {\n                var w = style.textStrokeWidth;\n                rect.x -= w / 2;\n                rect.y -= w / 2;\n                rect.width += w;\n                rect.height += w;\n            }\n\n            this._rect = rect;\n        }\n\n        return this._rect;\n    }\n};\n\nzrUtil.inherits(Text, Displayable);\n\nexport default Text;","/**\n * 圆形\n * @module zrender/shape/Circle\n */\n\nimport Path from '../Path';\n\nexport default Path.extend({\n\n    type: 'circle',\n\n    shape: {\n        cx: 0,\n        cy: 0,\n        r: 0\n    },\n\n\n    buildPath: function (ctx, shape, inBundle) {\n        // Better stroking in ShapeBundle\n        // Always do it may have performence issue ( fill may be 2x more cost)\n        if (inBundle) {\n            ctx.moveTo(shape.cx + shape.r, shape.cy);\n        }\n        // else {\n        //     if (ctx.allocate && !ctx.data.length) {\n        //         ctx.allocate(ctx.CMD_MEM_SIZE.A);\n        //     }\n        // }\n        // Better stroking in ShapeBundle\n        // ctx.moveTo(shape.cx + shape.r, shape.cy);\n        ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true);\n    }\n});","import env from '../../core/env';\n\n// Fix weird bug in some version of IE11 (like 11.0.9600.178**),\n// where exception \"unexpected call to method or property access\"\n// might be thrown when calling ctx.fill or ctx.stroke after a path\n// whose area size is zero is drawn and ctx.clip() is called and\n// shadowBlur is set. See #4572, #3112, #5777.\n// (e.g.,\n//  ctx.moveTo(10, 10);\n//  ctx.lineTo(20, 10);\n//  ctx.closePath();\n//  ctx.clip();\n//  ctx.shadowBlur = 10;\n//  ...\n//  ctx.fill();\n// )\n\nvar shadowTemp = [\n    ['shadowBlur', 0],\n    ['shadowColor', '#000'],\n    ['shadowOffsetX', 0],\n    ['shadowOffsetY', 0]\n];\n\nexport default function (orignalBrush) {\n\n    // version string can be: '11.0'\n    return (env.browser.ie && env.browser.version >= 11)\n\n        ? function () {\n            var clipPaths = this.__clipPaths;\n            var style = this.style;\n            var modified;\n\n            if (clipPaths) {\n                for (var i = 0; i < clipPaths.length; i++) {\n                    var clipPath = clipPaths[i];\n                    var shape = clipPath && clipPath.shape;\n                    var type = clipPath && clipPath.type;\n\n                    if (shape && (\n                        (type === 'sector' && shape.startAngle === shape.endAngle)\n                        || (type === 'rect' && (!shape.width || !shape.height))\n                    )) {\n                        for (var j = 0; j < shadowTemp.length; j++) {\n                            // It is save to put shadowTemp static, because shadowTemp\n                            // will be all modified each item brush called.\n                            shadowTemp[j][2] = style[shadowTemp[j][0]];\n                            style[shadowTemp[j][0]] = shadowTemp[j][1];\n                        }\n                        modified = true;\n                        break;\n                    }\n                }\n            }\n\n            orignalBrush.apply(this, arguments);\n\n            if (modified) {\n                for (var j = 0; j < shadowTemp.length; j++) {\n                    style[shadowTemp[j][0]] = shadowTemp[j][2];\n                }\n            }\n        }\n\n        : orignalBrush;\n}\n","/**\n * 扇形\n * @module zrender/graphic/shape/Sector\n */\n\nimport Path from '../Path';\nimport fixClipWithShadow from '../helper/fixClipWithShadow';\n\nexport default Path.extend({\n\n    type: 'sector',\n\n    shape: {\n\n        cx: 0,\n\n        cy: 0,\n\n        r0: 0,\n\n        r: 0,\n\n        startAngle: 0,\n\n        endAngle: Math.PI * 2,\n\n        clockwise: true\n    },\n\n    brush: fixClipWithShadow(Path.prototype.brush),\n\n    buildPath: function (ctx, shape) {\n\n        var x = shape.cx;\n        var y = shape.cy;\n        var r0 = Math.max(shape.r0 || 0, 0);\n        var r = Math.max(shape.r, 0);\n        var startAngle = shape.startAngle;\n        var endAngle = shape.endAngle;\n        var clockwise = shape.clockwise;\n\n        var unitX = Math.cos(startAngle);\n        var unitY = Math.sin(startAngle);\n\n        ctx.moveTo(unitX * r0 + x, unitY * r0 + y);\n\n        ctx.lineTo(unitX * r + x, unitY * r + y);\n\n        ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n\n        ctx.lineTo(\n            Math.cos(endAngle) * r0 + x,\n            Math.sin(endAngle) * r0 + y\n        );\n\n        if (r0 !== 0) {\n            ctx.arc(x, y, r0, endAngle, startAngle, clockwise);\n        }\n\n        ctx.closePath();\n    }\n});","/**\n * 圆环\n * @module zrender/graphic/shape/Ring\n */\n\nimport Path from '../Path';\n\nexport default Path.extend({\n\n    type: 'ring',\n\n    shape: {\n        cx: 0,\n        cy: 0,\n        r: 0,\n        r0: 0\n    },\n\n    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});","/**\n * Catmull-Rom spline 插值折线\n * @module zrender/shape/util/smoothSpline\n * @author pissang (https://www.github.com/pissang)\n *         Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         errorrik (errorrik@gmail.com)\n */\n\nimport {distance as v2Distance} from '../../core/vector';\n\n/**\n * @inner\n */\nfunction interpolate(p0, p1, p2, p3, t, t2, t3) {\n    var v0 = (p2 - p0) * 0.5;\n    var v1 = (p3 - p1) * 0.5;\n    return (2 * (p1 - p2) + v0 + v1) * t3\n            + (-3 * (p1 - p2) - 2 * v0 - v1) * t2\n            + v0 * t + p1;\n}\n\n/**\n * @alias module:zrender/shape/util/smoothSpline\n * @param {Array} points 线段顶点数组\n * @param {boolean} isLoop\n * @return {Array}\n */\nexport default function (points, isLoop) {\n    var len = points.length;\n    var ret = [];\n\n    var distance = 0;\n    for (var i = 1; i < len; i++) {\n        distance += v2Distance(points[i - 1], points[i]);\n    }\n\n    var segs = distance / 2;\n    segs = segs < len ? len : segs;\n    for (var i = 0; i < segs; i++) {\n        var pos = i / (segs - 1) * (isLoop ? len : len - 1);\n        var idx = Math.floor(pos);\n\n        var w = pos - idx;\n\n        var p0;\n        var p1 = points[idx % len];\n        var p2;\n        var p3;\n        if (!isLoop) {\n            p0 = points[idx === 0 ? idx : idx - 1];\n            p2 = points[idx > len - 2 ? len - 1 : idx + 1];\n            p3 = points[idx > len - 3 ? len - 1 : idx + 2];\n        }\n        else {\n            p0 = points[(idx - 1 + len) % len];\n            p2 = points[(idx + 1) % len];\n            p3 = points[(idx + 2) % len];\n        }\n\n        var w2 = w * w;\n        var w3 = w * w2;\n\n        ret.push([\n            interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3),\n            interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3)\n        ]);\n    }\n    return ret;\n}","/**\n * 贝塞尔平滑曲线\n * @module zrender/shape/util/smoothBezier\n * @author pissang (https://www.github.com/pissang)\n *         Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         errorrik (errorrik@gmail.com)\n */\n\nimport {\n    min as v2Min,\n    max as v2Max,\n    scale as v2Scale,\n    distance as v2Distance,\n    add as v2Add,\n    clone as v2Clone,\n    sub as v2Sub\n} from '../../core/vector';\n\n/**\n * 贝塞尔平滑曲线\n * @alias module:zrender/shape/util/smoothBezier\n * @param {Array} points 线段顶点数组\n * @param {number} smooth 平滑等级, 0-1\n * @param {boolean} isLoop\n * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内\n *                           比如 [[0, 0], [100, 100]], 这个包围盒会与\n *                           整个折线的包围盒做一个并集用来约束控制点。\n * @param {Array} 计算出来的控制点数组\n */\nexport default function (points, smooth, isLoop, constraint) {\n    var cps = [];\n\n    var v = [];\n    var v1 = [];\n    var v2 = [];\n    var prevPoint;\n    var nextPoint;\n\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        // 与指定的包围盒做并集\n        v2Min(min, min, constraint[0]);\n        v2Max(max, max, constraint[1]);\n    }\n\n    for (var i = 0, len = points.length; i < len; i++) {\n        var point = points[i];\n\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\n        v2Sub(v, nextPoint, prevPoint);\n\n        // use degree to scale the handle length\n        v2Scale(v, v, smooth);\n\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\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\n    if (isLoop) {\n        cps.push(cps.shift());\n    }\n\n    return cps;\n}","\nimport smoothSpline from './smoothSpline';\nimport smoothBezier from './smoothBezier';\n\nexport function buildPath(ctx, shape, closePath) {\n    var points = shape.points;\n    var smooth = shape.smooth;\n    if (points && points.length >= 2) {\n        if (smooth && smooth !== 'spline') {\n            var controlPoints = smoothBezier(\n                points, smooth, closePath, shape.smoothConstraint\n            );\n\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(\n                    cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]\n                );\n            }\n        }\n        else {\n            if (smooth === 'spline') {\n                points = smoothSpline(points, closePath);\n            }\n\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\n        closePath && ctx.closePath();\n    }\n}\n","/**\n * 多边形\n * @module zrender/shape/Polygon\n */\n\nimport Path from '../Path';\nimport * as polyHelper from '../helper/poly';\n\nexport default Path.extend({\n\n    type: 'polygon',\n\n    shape: {\n        points: null,\n\n        smooth: false,\n\n        smoothConstraint: null\n    },\n\n    buildPath: function (ctx, shape) {\n        polyHelper.buildPath(ctx, shape, true);\n    }\n});","/**\n * @module zrender/graphic/shape/Polyline\n */\n\nimport Path from '../Path';\nimport * as polyHelper from '../helper/poly';\n\nexport default Path.extend({\n\n    type: 'polyline',\n\n    shape: {\n        points: null,\n\n        smooth: false,\n\n        smoothConstraint: null\n    },\n\n    style: {\n        stroke: '#000',\n\n        fill: null\n    },\n\n    buildPath: function (ctx, shape) {\n        polyHelper.buildPath(ctx, shape, false);\n    }\n});","/**\n * Sub-pixel optimize for canvas rendering, prevent from blur\n * when rendering a thin vertical/horizontal line.\n */\n\nvar round = Math.round;\n\n/**\n * Sub pixel optimize line for canvas\n *\n * @param {Object} outputShape The modification will be performed on `outputShape`.\n *                 `outputShape` and `inputShape` can be the same object.\n *                 `outputShape` object can be used repeatly, because all of\n *                 the `x1`, `x2`, `y1`, `y2` will be assigned in this method.\n * @param {Object} [inputShape]\n * @param {number} [inputShape.x1]\n * @param {number} [inputShape.y1]\n * @param {number} [inputShape.x2]\n * @param {number} [inputShape.y2]\n * @param {Object} [style]\n * @param {number} [style.lineWidth]\n */\nexport function subPixelOptimizeLine(outputShape, inputShape, style) {\n    var lineWidth = style && style.lineWidth;\n\n    if (!inputShape || !lineWidth) {\n        return;\n    }\n\n    var x1 = inputShape.x1;\n    var x2 = inputShape.x2;\n    var y1 = inputShape.y1;\n    var y2 = inputShape.y2;\n\n    if (round(x1 * 2) === round(x2 * 2)) {\n        outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true);\n    }\n    else {\n        outputShape.x1 = x1;\n        outputShape.x2 = x2;\n    }\n    if (round(y1 * 2) === round(y2 * 2)) {\n        outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true);\n    }\n    else {\n        outputShape.y1 = y1;\n        outputShape.y2 = y2;\n    }\n}\n\n/**\n * Sub pixel optimize rect for canvas\n *\n * @param {Object} outputShape The modification will be performed on `outputShape`.\n *                 `outputShape` and `inputShape` can be the same object.\n *                 `outputShape` object can be used repeatly, because all of\n *                 the `x`, `y`, `width`, `height` will be assigned in this method.\n * @param {Object} [inputShape]\n * @param {number} [inputShape.x]\n * @param {number} [inputShape.y]\n * @param {number} [inputShape.width]\n * @param {number} [inputShape.height]\n * @param {Object} [style]\n * @param {number} [style.lineWidth]\n */\nexport function subPixelOptimizeRect(outputShape, inputShape, style) {\n    var lineWidth = style && style.lineWidth;\n\n    if (!inputShape || !lineWidth) {\n        return;\n    }\n\n    var originX = inputShape.x;\n    var originY = inputShape.y;\n    var originWidth = inputShape.width;\n    var originHeight = inputShape.height;\n\n    outputShape.x = subPixelOptimize(originX, lineWidth, true);\n    outputShape.y = subPixelOptimize(originY, lineWidth, true);\n    outputShape.width = Math.max(\n        subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x,\n        originWidth === 0 ? 0 : 1\n    );\n    outputShape.height = Math.max(\n        subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y,\n        originHeight === 0 ? 0 : 1\n    );\n}\n\n/**\n * Sub pixel optimize for canvas\n *\n * @param {number} position Coordinate, such as x, y\n * @param {number} lineWidth Should be nonnegative integer.\n * @param {boolean=} positiveOrNegative Default false (negative).\n * @return {number} Optimized position.\n */\nexport function subPixelOptimize(position, lineWidth, positiveOrNegative) {\n    // Assure that (position + lineWidth / 2) is near integer edge,\n    // otherwise line will be fuzzy in canvas.\n    var doubledPosition = round(position * 2);\n    return (doubledPosition + round(lineWidth)) % 2 === 0\n        ? doubledPosition / 2\n        : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;\n}\n","/**\n * 矩形\n * @module zrender/graphic/shape/Rect\n */\n\nimport Path from '../Path';\nimport * as roundRectHelper from '../helper/roundRect';\nimport {subPixelOptimizeRect} from '../helper/subPixelOptimize';\n\n// Avoid create repeatly.\nvar subPixelOptimizeOutputShape = {};\n\nexport default Path.extend({\n\n    type: 'rect',\n\n    shape: {\n        // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4\n        // r缩写为1         相当于 [1, 1, 1, 1]\n        // r缩写为[1]       相当于 [1, 1, 1, 1]\n        // r缩写为[1, 2]    相当于 [1, 2, 1, 2]\n        // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2]\n        r: 0,\n\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n    },\n\n    buildPath: function (ctx, shape) {\n        var x;\n        var y;\n        var width;\n        var height;\n\n        if (this.subPixelOptimize) {\n            subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style);\n            x = subPixelOptimizeOutputShape.x;\n            y = subPixelOptimizeOutputShape.y;\n            width = subPixelOptimizeOutputShape.width;\n            height = subPixelOptimizeOutputShape.height;\n            subPixelOptimizeOutputShape.r = shape.r;\n            shape = subPixelOptimizeOutputShape;\n        }\n        else {\n            x = shape.x;\n            y = shape.y;\n            width = shape.width;\n            height = shape.height;\n        }\n\n        if (!shape.r) {\n            ctx.rect(x, y, width, height);\n        }\n        else {\n            roundRectHelper.buildPath(ctx, shape);\n        }\n        ctx.closePath();\n        return;\n    }\n});","/**\n * 直线\n * @module zrender/graphic/shape/Line\n */\n\nimport Path from '../Path';\nimport {subPixelOptimizeLine} from '../helper/subPixelOptimize';\n\n// Avoid create repeatly.\nvar subPixelOptimizeOutputShape = {};\n\nexport default Path.extend({\n\n    type: 'line',\n\n    shape: {\n        // Start point\n        x1: 0,\n        y1: 0,\n        // End point\n        x2: 0,\n        y2: 0,\n\n        percent: 1\n    },\n\n    style: {\n        stroke: '#000',\n        fill: null\n    },\n\n    buildPath: function (ctx, shape) {\n        var x1;\n        var y1;\n        var x2;\n        var y2;\n\n        if (this.subPixelOptimize) {\n            subPixelOptimizeLine(subPixelOptimizeOutputShape, shape, this.style);\n            x1 = subPixelOptimizeOutputShape.x1;\n            y1 = subPixelOptimizeOutputShape.y1;\n            x2 = subPixelOptimizeOutputShape.x2;\n            y2 = subPixelOptimizeOutputShape.y2;\n        }\n        else {\n            x1 = shape.x1;\n            y1 = shape.y1;\n            x2 = shape.x2;\n            y2 = shape.y2;\n        }\n\n        var percent = shape.percent;\n\n        if (percent === 0) {\n            return;\n        }\n\n        ctx.moveTo(x1, y1);\n\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\n    /**\n     * Get point at percent\n     * @param  {number} percent\n     * @return {Array.<number>}\n     */\n    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});","/**\n * 贝塞尔曲线\n * @module zrender/shape/BezierCurve\n */\n\nimport Path from '../Path';\nimport * as vec2 from '../../core/vector';\nimport {\n    quadraticSubdivide,\n    cubicSubdivide,\n    quadraticAt,\n    cubicAt,\n    quadraticDerivativeAt,\n    cubicDerivativeAt\n} from '../../core/curve';\n\nvar out = [];\n\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}\n\nexport default Path.extend({\n\n    type: 'bezier-curve',\n\n    shape: {\n        x1: 0,\n        y1: 0,\n        x2: 0,\n        y2: 0,\n        cpx1: 0,\n        cpy1: 0,\n        // cpx2: 0,\n        // cpy2: 0\n\n        // Curve show percent, for animating\n        percent: 1\n    },\n\n    style: {\n        stroke: '#000',\n        fill: null\n    },\n\n    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\n        ctx.moveTo(x1, y1);\n\n        if (cpx2 == null || cpy2 == null) {\n            if (percent < 1) {\n                quadraticSubdivide(\n                    x1, cpx1, x2, percent, out\n                );\n                cpx1 = out[1];\n                x2 = out[2];\n                quadraticSubdivide(\n                    y1, cpy1, y2, percent, out\n                );\n                cpy1 = out[1];\n                y2 = out[2];\n            }\n\n            ctx.quadraticCurveTo(\n                cpx1, cpy1,\n                x2, y2\n            );\n        }\n        else {\n            if (percent < 1) {\n                cubicSubdivide(\n                    x1, cpx1, cpx2, x2, percent, out\n                );\n                cpx1 = out[1];\n                cpx2 = out[2];\n                x2 = out[3];\n                cubicSubdivide(\n                    y1, cpy1, cpy2, y2, percent, out\n                );\n                cpy1 = out[1];\n                cpy2 = out[2];\n                y2 = out[3];\n            }\n            ctx.bezierCurveTo(\n                cpx1, cpy1,\n                cpx2, cpy2,\n                x2, y2\n            );\n        }\n    },\n\n    /**\n     * Get point at percent\n     * @param  {number} t\n     * @return {Array.<number>}\n     */\n    pointAt: function (t) {\n        return someVectorAt(this.shape, t, false);\n    },\n\n    /**\n     * Get tangent at percent\n     * @param  {number} t\n     * @return {Array.<number>}\n     */\n    tangentAt: function (t) {\n        var p = someVectorAt(this.shape, t, true);\n        return vec2.normalize(p, p);\n    }\n});","/**\n * 圆弧\n * @module zrender/graphic/shape/Arc\n */\n\nimport Path from '../Path';\n\nexport default Path.extend({\n\n    type: 'arc',\n\n    shape: {\n\n        cx: 0,\n\n        cy: 0,\n\n        r: 0,\n\n        startAngle: 0,\n\n        endAngle: Math.PI * 2,\n\n        clockwise: true\n    },\n\n    style: {\n\n        stroke: '#000',\n\n        fill: null\n    },\n\n    buildPath: function (ctx, shape) {\n\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\n        var unitX = Math.cos(startAngle);\n        var unitY = Math.sin(startAngle);\n\n        ctx.moveTo(unitX * r + x, unitY * r + y);\n        ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n    }\n});","// CompoundPath to improve performance\n\nimport Path from './Path';\n\nexport default Path.extend({\n\n    type: 'compound',\n\n    shape: {\n\n        paths: null\n    },\n\n    _updatePathDirty: function () {\n        var dirtyPath = this.__dirtyPath;\n        var paths = this.shape.paths;\n        for (var i = 0; i < paths.length; i++) {\n            // Mark as dirty if any subpath is dirty\n            dirtyPath = dirtyPath || paths[i].__dirtyPath;\n        }\n        this.__dirtyPath = dirtyPath;\n        this.__dirty = this.__dirty || dirtyPath;\n    },\n\n    beforeBrush: function () {\n        this._updatePathDirty();\n        var paths = this.shape.paths || [];\n        var scale = this.getGlobalScale();\n        // Update path scale\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\n    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\n    afterBrush: function () {\n        var paths = this.shape.paths || [];\n        for (var i = 0; i < paths.length; i++) {\n            paths[i].__dirtyPath = false;\n        }\n    },\n\n    getBoundingRect: function () {\n        this._updatePathDirty();\n        return Path.prototype.getBoundingRect.call(this);\n    }\n});","\n/**\n * @param {Array.<Object>} colorStops\n */\nvar Gradient = function (colorStops) {\n\n    this.colorStops = colorStops || [];\n\n};\n\nGradient.prototype = {\n\n    constructor: Gradient,\n\n    addColorStop: function (offset, color) {\n        this.colorStops.push({\n\n            offset: offset,\n\n            color: color\n        });\n    }\n\n};\n\nexport default Gradient;","import * as zrUtil from '../core/util';\nimport Gradient from './Gradient';\n\n/**\n * x, y, x2, y2 are all percent from 0 to 1\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @param {number} [x2=1]\n * @param {number} [y2=0]\n * @param {Array.<Object>} colorStops\n * @param {boolean} [globalCoord=false]\n */\nvar LinearGradient = function (x, y, x2, y2, colorStops, globalCoord) {\n    // Should do nothing more in this constructor. Because gradient can be\n    // declard by `color: {type: 'linear', colorStops: ...}`, where\n    // this constructor will not be called.\n\n    this.x = x == null ? 0 : x;\n\n    this.y = y == null ? 0 : y;\n\n    this.x2 = x2 == null ? 1 : x2;\n\n    this.y2 = y2 == null ? 0 : y2;\n\n    // Can be cloned\n    this.type = 'linear';\n\n    // If use global coord\n    this.global = globalCoord || false;\n\n    Gradient.call(this, colorStops);\n};\n\nLinearGradient.prototype = {\n\n    constructor: LinearGradient\n};\n\nzrUtil.inherits(LinearGradient, Gradient);\n\nexport default LinearGradient;","import * as zrUtil from '../core/util';\nimport Gradient from './Gradient';\n\n/**\n * x, y, r are all percent from 0 to 1\n * @param {number} [x=0.5]\n * @param {number} [y=0.5]\n * @param {number} [r=0.5]\n * @param {Array.<Object>} [colorStops]\n * @param {boolean} [globalCoord=false]\n */\nvar RadialGradient = function (x, y, r, colorStops, globalCoord) {\n    // Should do nothing more in this constructor. Because gradient can be\n    // declard by `color: {type: 'radial', colorStops: ...}`, where\n    // this constructor will not be called.\n\n    this.x = x == null ? 0.5 : x;\n\n    this.y = y == null ? 0.5 : y;\n\n    this.r = r == null ? 0.5 : r;\n\n    // Can be cloned\n    this.type = 'radial';\n\n    // If use global coord\n    this.global = globalCoord || false;\n\n    Gradient.call(this, colorStops);\n};\n\nRadialGradient.prototype = {\n\n    constructor: RadialGradient\n};\n\nzrUtil.inherits(RadialGradient, Gradient);\n\nexport default RadialGradient;","/**\n * Displayable for incremental rendering. It will be rendered in a separate layer\n * IncrementalDisplay have two main methods. `clearDisplayables` and `addDisplayables`\n * addDisplayables will render the added displayables incremetally.\n *\n * It use a not clearFlag to tell the painter don't clear the layer if it's the first element.\n */\nimport { inherits } from '../core/util';\nimport Displayble from './Displayable';\nimport BoundingRect from '../core/BoundingRect';\n\n// TODO Style override ?\nfunction IncrementalDisplayble(opts) {\n\n    Displayble.call(this, opts);\n\n    this._displayables = [];\n\n    this._temporaryDisplayables = [];\n\n    this._cursor = 0;\n\n    this.notClear = true;\n}\n\nIncrementalDisplayble.prototype.incremental = true;\n\nIncrementalDisplayble.prototype.clearDisplaybles = function () {\n    this._displayables = [];\n    this._temporaryDisplayables = [];\n    this._cursor = 0;\n    this.dirty();\n\n    this.notClear = false;\n};\n\nIncrementalDisplayble.prototype.addDisplayable = function (displayable, notPersistent) {\n    if (notPersistent) {\n        this._temporaryDisplayables.push(displayable);\n    }\n    else {\n        this._displayables.push(displayable);\n    }\n    this.dirty();\n};\n\nIncrementalDisplayble.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\nIncrementalDisplayble.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\nIncrementalDisplayble.prototype.update = function () {\n    this.updateTransform();\n    for (var i = this._cursor; i < this._displayables.length; i++) {\n        var displayable = this._displayables[i];\n        // PENDING\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        // PENDING\n        displayable.parent = this;\n        displayable.update();\n        displayable.parent = null;\n    }\n};\n\nIncrementalDisplayble.prototype.brush = function (ctx, prevEl) {\n    // Render persistant displayables.\n    for (var i = this._cursor; i < this._displayables.length; i++) {\n        var displayable = this._displayables[i];\n        displayable.beforeBrush && displayable.beforeBrush(ctx);\n        displayable.brush(ctx, i === this._cursor ? null : this._displayables[i - 1]);\n        displayable.afterBrush && displayable.afterBrush(ctx);\n    }\n    this._cursor = i;\n    // Render temporary displayables.\n    for (var i = 0; i < this._temporaryDisplayables.length; i++) {\n        var displayable = this._temporaryDisplayables[i];\n        displayable.beforeBrush && displayable.beforeBrush(ctx);\n        displayable.brush(ctx, i === 0 ? null : this._temporaryDisplayables[i - 1]);\n        displayable.afterBrush && displayable.afterBrush(ctx);\n    }\n\n    this._temporaryDisplayables = [];\n\n    this.notClear = true;\n};\n\nvar m = [];\nIncrementalDisplayble.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\nIncrementalDisplayble.prototype.contain = function (x, y) {\n    var localPos = this.transformCoordToLocal(x, y);\n    var rect = this.getBoundingRect();\n\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\ninherits(IncrementalDisplayble, Displayble);\n\nexport default IncrementalDisplayble;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as pathTool from 'zrender/src/tool/path';\nimport * as colorTool from 'zrender/src/tool/color';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as vector from 'zrender/src/core/vector';\nimport Path from 'zrender/src/graphic/Path';\nimport Transformable from 'zrender/src/mixin/Transformable';\nimport ZImage from 'zrender/src/graphic/Image';\nimport Group from 'zrender/src/container/Group';\nimport Text from 'zrender/src/graphic/Text';\nimport Circle from 'zrender/src/graphic/shape/Circle';\nimport Sector from 'zrender/src/graphic/shape/Sector';\nimport Ring from 'zrender/src/graphic/shape/Ring';\nimport Polygon from 'zrender/src/graphic/shape/Polygon';\nimport Polyline from 'zrender/src/graphic/shape/Polyline';\nimport Rect from 'zrender/src/graphic/shape/Rect';\nimport Line from 'zrender/src/graphic/shape/Line';\nimport BezierCurve from 'zrender/src/graphic/shape/BezierCurve';\nimport Arc from 'zrender/src/graphic/shape/Arc';\nimport CompoundPath from 'zrender/src/graphic/CompoundPath';\nimport LinearGradient from 'zrender/src/graphic/LinearGradient';\nimport RadialGradient from 'zrender/src/graphic/RadialGradient';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable';\nimport * as subPixelOptimizeUtil from 'zrender/src/graphic/helper/subPixelOptimize';\n\n\nvar mathMax = Math.max;\nvar mathMin = Math.min;\n\nvar EMPTY_OBJ = {};\n\nexport var Z2_EMPHASIS_LIFT = 1;\n\n// key: label model property nane, value: style property name.\nexport var CACHED_LABEL_STYLE_PROPERTIES = {\n    color: 'textFill',\n    textBorderColor: 'textStroke',\n    textBorderWidth: 'textStrokeWidth'\n};\n\nvar EMPHASIS = 'emphasis';\nvar NORMAL = 'normal';\n\n// Reserve 0 as default.\nvar _highlightNextDigit = 1;\nvar _highlightKeyMap = {};\n\n\n/**\n * Extend shape with parameters\n */\nexport function extendShape(opts) {\n    return Path.extend(opts);\n}\n\n/**\n * Extend path\n */\nexport function extendPath(pathData, opts) {\n    return pathTool.extendFromString(pathData, opts);\n}\n\n/**\n * Create a path element from path data string\n * @param {string} pathData\n * @param {Object} opts\n * @param {module:zrender/core/BoundingRect} rect\n * @param {string} [layout=cover] 'center' or '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/**\n * Create a image element from image url\n * @param {string} imageUrl image url\n * @param {Object} opts options\n * @param {module:zrender/core/BoundingRect} rect constrain rect\n * @param {string} [layout=cover] 'center' or 'cover'\n */\nexport function makeImage(imageUrl, rect, layout) {\n    var path = new ZImage({\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                path.setStyle(centerGraphic(rect, boundingRect));\n            }\n        }\n    });\n    return path;\n}\n\n/**\n * Get position of centered element in bounding box.\n *\n * @param  {Object} rect         element local bounding box\n * @param  {Object} boundingRect constraint bounding box\n * @return {Object} 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    }\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\n    return {\n        x: cx - width / 2,\n        y: cy - height / 2,\n        width: width,\n        height: height\n    };\n}\n\nexport var mergePath = pathTool.mergePath;\n\n/**\n * Resize a path to fit the rect\n * @param {module:zrender/graphic/Path} path\n * @param {Object} rect\n */\nexport function resizePath(path, rect) {\n    if (!path.applyTransform) {\n        return;\n    }\n\n    var pathRect = path.getBoundingRect();\n\n    var m = pathRect.calculateTransform(rect);\n\n    path.applyTransform(m);\n}\n\n/**\n * Sub pixel optimize line for canvas\n *\n * @param {Object} param\n * @param {Object} [param.shape]\n * @param {number} [param.shape.x1]\n * @param {number} [param.shape.y1]\n * @param {number} [param.shape.x2]\n * @param {number} [param.shape.y2]\n * @param {Object} [param.style]\n * @param {number} [param.style.lineWidth]\n * @return {Object} Modified param\n */\nexport function subPixelOptimizeLine(param) {\n    subPixelOptimizeUtil.subPixelOptimizeLine(param.shape, param.shape, param.style);\n    return param;\n}\n\n/**\n * Sub pixel optimize rect for canvas\n *\n * @param {Object} param\n * @param {Object} [param.shape]\n * @param {number} [param.shape.x]\n * @param {number} [param.shape.y]\n * @param {number} [param.shape.width]\n * @param {number} [param.shape.height]\n * @param {Object} [param.style]\n * @param {number} [param.style.lineWidth]\n * @return {Object} Modified param\n */\nexport function subPixelOptimizeRect(param) {\n    subPixelOptimizeUtil.subPixelOptimizeRect(param.shape, param.shape, param.style);\n    return param;\n}\n\n/**\n * Sub pixel optimize for canvas\n *\n * @param {number} position Coordinate, such as x, y\n * @param {number} lineWidth Should be nonnegative integer.\n * @param {boolean=} positiveOrNegative Default false (negative).\n * @return {number} Optimized position.\n */\nexport var subPixelOptimize = subPixelOptimizeUtil.subPixelOptimize;\n\n\nfunction hasFillOrStroke(fillOrStroke) {\n    return fillOrStroke != null && fillOrStroke !== 'none';\n}\n\n// Most lifted color are duplicated.\nvar liftedColorMap = zrUtil.createHashMap();\nvar liftedColorCount = 0;\n\nfunction liftColor(color) {\n    if (typeof color !== 'string') {\n        return color;\n    }\n    var liftedColor = liftedColorMap.get(color);\n    if (!liftedColor) {\n        liftedColor = colorTool.lift(color, -0.1);\n        if (liftedColorCount < 10000) {\n            liftedColorMap.set(color, liftedColor);\n            liftedColorCount++;\n        }\n    }\n    return liftedColor;\n}\n\nfunction cacheElementStl(el) {\n    if (!el.__hoverStlDirty) {\n        return;\n    }\n    el.__hoverStlDirty = false;\n\n    var hoverStyle = el.__hoverStl;\n    if (!hoverStyle) {\n        el.__cachedNormalStl = el.__cachedNormalZ2 = null;\n        return;\n    }\n\n    var normalStyle = el.__cachedNormalStl = {};\n    el.__cachedNormalZ2 = el.z2;\n    var elStyle = el.style;\n\n    for (var name in hoverStyle) {\n        // See comment in `singleEnterEmphasis`.\n        if (hoverStyle[name] != null) {\n            normalStyle[name] = elStyle[name];\n        }\n    }\n\n    // Always cache fill and stroke to normalStyle for lifting color.\n    normalStyle.fill = elStyle.fill;\n    normalStyle.stroke = elStyle.stroke;\n}\n\nfunction singleEnterEmphasis(el) {\n    var hoverStl = el.__hoverStl;\n\n    if (!hoverStl || el.__highlighted) {\n        return;\n    }\n\n    var useHoverLayer = el.useHoverLayer;\n    el.__highlighted = useHoverLayer ? 'layer' : 'plain';\n\n    var zr = el.__zr;\n    if (el.isGroup || (!zr && useHoverLayer)) {\n        return;\n    }\n\n    var elTarget = el;\n    var targetStyle = el.style;\n\n    if (useHoverLayer) {\n        elTarget = zr.addHover(el);\n        targetStyle = elTarget.style;\n    }\n\n    rollbackDefaultTextStyle(targetStyle);\n\n    if (!useHoverLayer) {\n        cacheElementStl(elTarget);\n    }\n\n    // styles can be:\n    // {\n    //    label: {\n    //        show: false,\n    //        position: 'outside',\n    //        fontSize: 18\n    //    },\n    //    emphasis: {\n    //        label: {\n    //            show: true\n    //        }\n    //    }\n    // },\n    // where properties of `emphasis` may not appear in `normal`. We previously use\n    // module:echarts/util/model#defaultEmphasis to merge `normal` to `emphasis`.\n    // But consider rich text and setOption in merge mode, it is impossible to cover\n    // all properties in merge. So we use merge mode when setting style here.\n    // But we choose the merge strategy that only properties that is not `null/undefined`.\n    // Because when making a textStyle (espacially rich text), it is not easy to distinguish\n    // `hasOwnProperty` and `null/undefined` in code, so we trade them as the same for simplicity.\n    // But this strategy brings a trouble that `null/undefined` can not be used to remove\n    // style any more in `emphasis`. Users can both set properties directly on normal and\n    // emphasis to avoid this issue, or we might support `'none'` for this case if required.\n    targetStyle.extendFrom(hoverStl);\n\n    setDefaultHoverFillStroke(targetStyle, hoverStl, 'fill');\n    setDefaultHoverFillStroke(targetStyle, hoverStl, 'stroke');\n\n    applyDefaultTextStyle(targetStyle);\n\n    if (!useHoverLayer) {\n        el.dirty(false);\n        el.z2 += Z2_EMPHASIS_LIFT;\n    }\n}\n\nfunction setDefaultHoverFillStroke(targetStyle, hoverStyle, prop) {\n    if (!hasFillOrStroke(hoverStyle[prop]) && hasFillOrStroke(targetStyle[prop])) {\n        targetStyle[prop] = liftColor(targetStyle[prop]);\n    }\n}\n\nfunction singleEnterNormal(el) {\n    var highlighted = el.__highlighted;\n\n    if (!highlighted) {\n        return;\n    }\n\n    el.__highlighted = false;\n\n    if (el.isGroup) {\n        return;\n    }\n\n    if (highlighted === 'layer') {\n        el.__zr && el.__zr.removeHover(el);\n    }\n    else {\n        var style = el.style;\n\n        var normalStl = el.__cachedNormalStl;\n        if (normalStl) {\n            rollbackDefaultTextStyle(style);\n            el.setStyle(normalStl);\n            applyDefaultTextStyle(style);\n        }\n        // `__cachedNormalZ2` will not be reset if calling `setElementHoverStyle`\n        // when `el` is on emphasis state. So here by comparing with 1, we try\n        // hard to make the bug case rare.\n        var normalZ2 = el.__cachedNormalZ2;\n        if (normalZ2 != null && el.z2 - normalZ2 === Z2_EMPHASIS_LIFT) {\n            el.z2 = normalZ2;\n        }\n    }\n}\n\nfunction traverseUpdate(el, updater, commonParam) {\n    // If root is group, also enter updater for `highDownOnUpdate`.\n    var fromState = NORMAL;\n    var toState = NORMAL;\n    var trigger;\n    // See the rule of `highDownOnUpdate` on `graphic.setAsHighDownDispatcher`.\n    el.__highlighted && (fromState = EMPHASIS, trigger = true);\n    updater(el, commonParam);\n    el.__highlighted && (toState = EMPHASIS, trigger = true);\n\n    el.isGroup && el.traverse(function (child) {\n        !child.isGroup && updater(child, commonParam);\n    });\n\n    trigger && el.__highDownOnUpdate && el.__highDownOnUpdate(fromState, toState);\n}\n\n/**\n * Set hover style (namely \"emphasis style\") of element, based on the current\n * style of the given `el`.\n * This method should be called after all of the normal styles have been adopted\n * to the `el`. See the reason on `setHoverStyle`.\n *\n * @param {module:zrender/Element} el Should not be `zrender/container/Group`.\n * @param {Object} [el.hoverStyle] Can be set on el or its descendants,\n *        e.g., `el.hoverStyle = ...; graphic.setHoverStyle(el); `.\n *        Often used when item group has a label element and it's hoverStyle is different.\n * @param {Object|boolean} [hoverStl] The specified hover style.\n *        If set as `false`, disable the hover style.\n *        Similarly, The `el.hoverStyle` can alse be set\n *        as `false` to disable the hover style.\n *        Otherwise, use the default hover style if not provided.\n */\nexport function setElementHoverStyle(el, hoverStl) {\n    // For performance consideration, it might be better to make the \"hover style\" only the\n    // difference properties from the \"normal style\", but not a entire copy of all styles.\n    hoverStl = el.__hoverStl = hoverStl !== false && (el.hoverStyle || hoverStl || {});\n    el.__hoverStlDirty = true;\n\n    // FIXME\n    // It is not completely right to save \"normal\"/\"emphasis\" flag on elements.\n    // It probably should be saved on `data` of series. Consider the cases:\n    // (1) A highlighted elements are moved out of the view port and re-enter\n    // again by dataZoom.\n    // (2) call `setOption` and replace elements totally when they are highlighted.\n    if (el.__highlighted) {\n        // Consider the case:\n        // The styles of a highlighted `el` is being updated. The new \"emphasis style\"\n        // should be adapted to the `el`. Notice here new \"normal styles\" should have\n        // been set outside and the cached \"normal style\" is out of date.\n        el.__cachedNormalStl = null;\n        // Do not clear `__cachedNormalZ2` here, because setting `z2` is not a constraint\n        // of this method. In most cases, `z2` is not set and hover style should be able\n        // to rollback. Of course, that would bring bug, but only in a rare case, see\n        // `doSingleLeaveHover` for details.\n        singleEnterNormal(el);\n\n        singleEnterEmphasis(el);\n    }\n}\n\nfunction onElementMouseOver(e) {\n    !shouldSilent(this, e)\n        // \"emphasis\" event highlight has higher priority than mouse highlight.\n        && !this.__highByOuter\n        && traverseUpdate(this, singleEnterEmphasis);\n}\n\nfunction onElementMouseOut(e) {\n    !shouldSilent(this, e)\n        // \"emphasis\" event highlight has higher priority than mouse highlight.\n        && !this.__highByOuter\n        && traverseUpdate(this, singleEnterNormal);\n}\n\nfunction onElementEmphasisEvent(highlightDigit) {\n    this.__highByOuter |= 1 << (highlightDigit || 0);\n    traverseUpdate(this, singleEnterEmphasis);\n}\n\nfunction onElementNormalEvent(highlightDigit) {\n    !(this.__highByOuter &= ~(1 << (highlightDigit || 0)))\n        && traverseUpdate(this, singleEnterNormal);\n}\n\nfunction shouldSilent(el, e) {\n    return el.__highDownSilentOnTouch && e.zrByTouch;\n}\n\n/**\n * Set hover style (namely \"emphasis style\") of element,\n * based on the current style of the given `el`.\n *\n * (1)\n * **CONSTRAINTS** for this method:\n * <A> This method MUST be called after all of the normal styles having been adopted\n * to the `el`.\n * <B> The input `hoverStyle` (that is, \"emphasis style\") MUST be the subset of the\n * \"normal style\" having been set to the el.\n * <C> `color` MUST be one of the \"normal styles\" (because color might be lifted as\n * a default hover style).\n *\n * The reason: this method treat the current style of the `el` as the \"normal style\"\n * and cache them when enter/update the \"emphasis style\". Consider the case: the `el`\n * is in \"emphasis\" state and `setOption`/`dispatchAction` trigger the style updating\n * logic, where the el should shift from the original emphasis style to the new\n * \"emphasis style\" and should be able to \"downplay\" back to the new \"normal style\".\n *\n * Indeed, it is error-prone to make a interface has so many constraints, but I have\n * not found a better solution yet to fit the backward compatibility, performance and\n * the current programming style.\n *\n * (2)\n * Call the method for a \"root\" element once. Do not call it for each descendants.\n * If the descendants elemenets of a group has itself hover style different from the\n * root group, we can simply mount the style on `el.hoverStyle` for them, but should\n * not call this method for them.\n *\n * (3) These input parameters can be set directly on `el`:\n *\n * @param {module:zrender/Element} el\n * @param {Object} [el.hoverStyle] See `graphic.setElementHoverStyle`.\n * @param {boolean} [el.highDownSilentOnTouch=false] See `graphic.setAsHighDownDispatcher`.\n * @param {Function} [el.highDownOnUpdate] See `graphic.setAsHighDownDispatcher`.\n * @param {Object|boolean} [hoverStyle] See `graphic.setElementHoverStyle`.\n */\nexport function setHoverStyle(el, hoverStyle) {\n    setAsHighDownDispatcher(el, true);\n    traverseUpdate(el, setElementHoverStyle, hoverStyle);\n}\n\n/**\n * @param {module:zrender/Element} el\n * @param {Function} [el.highDownOnUpdate] Called when state updated.\n *        Since `setHoverStyle` has the constraint that it must be called after\n *        all of the normal style updated, `highDownOnUpdate` is not needed to\n *        trigger if both `fromState` and `toState` is 'normal', and needed to\n *        trigger if both `fromState` and `toState` is 'emphasis', which enables\n *        to sync outside style settings to \"emphasis\" state.\n *        @this {string} This dispatcher `el`.\n *        @param {string} fromState Can be \"normal\" or \"emphasis\".\n *               `fromState` might equal to `toState`,\n *               for example, when this method is called when `el` is\n *               on \"emphasis\" state.\n *        @param {string} toState Can be \"normal\" or \"emphasis\".\n *\n *        FIXME\n *        CAUTION: Do not expose `highDownOnUpdate` outside echarts.\n *        Because it is not a complete solution. The update\n *        listener should not have been mount in element,\n *        and the normal/emphasis state should not have\n *        mantained on elements.\n *\n * @param {boolean} [el.highDownSilentOnTouch=false]\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 {boolean} [asDispatcher=true] If `false`, do not set as \"highDownDispatcher\".\n */\nexport function setAsHighDownDispatcher(el, asDispatcher) {\n    var disable = asDispatcher === false;\n    // Make `highDownSilentOnTouch` and `highDownOnUpdate` only work after\n    // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly.\n    el.__highDownSilentOnTouch = el.highDownSilentOnTouch;\n    el.__highDownOnUpdate = el.highDownOnUpdate;\n\n    // Simple optimize, since this method might be\n    // called for each elements of a group in some cases.\n    if (!disable || el.__highDownDispatcher) {\n        var method = disable ? 'off' : 'on';\n\n        // Duplicated function will be auto-ignored, see Eventful.js.\n        el[method]('mouseover', onElementMouseOver)[method]('mouseout', onElementMouseOut);\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        el.__highByOuter = el.__highByOuter || 0;\n\n        el.__highDownDispatcher = !disable;\n    }\n}\n\n/**\n * @param {module:zrender/src/Element} el\n * @return {boolean}\n */\nexport function isHighDownDispatcher(el) {\n    return !!(el && el.__highDownDispatcher);\n}\n\n/**\n * Support hightlight/downplay record on each elements.\n * For the case: hover highlight/downplay (legend, visualMap, ...) and\n * user triggerred hightlight/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}\n\n/**\n * See more info in `setTextStyleCommon`.\n * @param {Object|module:zrender/graphic/Style} normalStyle\n * @param {Object} emphasisStyle\n * @param {module:echarts/model/Model} normalModel\n * @param {module:echarts/model/Model} emphasisModel\n * @param {Object} opt Check `opt` of `setTextStyleCommon` to find other props.\n * @param {string|Function} [opt.defaultText]\n * @param {module:echarts/model/Model} [opt.labelFetcher] Fetch text by\n *      `opt.labelFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {module:echarts/model/Model} [opt.labelDataIndex] Fetch text by\n *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {module:echarts/model/Model} [opt.labelDimIndex] Fetch text by\n *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {Object} [normalSpecified]\n * @param {Object} [emphasisSpecified]\n */\nexport function setLabelStyle(\n    normalStyle, emphasisStyle,\n    normalModel, emphasisModel,\n    opt,\n    normalSpecified, emphasisSpecified\n) {\n    opt = opt || EMPTY_OBJ;\n    var labelFetcher = opt.labelFetcher;\n    var labelDataIndex = opt.labelDataIndex;\n    var labelDimIndex = opt.labelDimIndex;\n\n    // This scenario, `label.normal.show = true; label.emphasis.show = false`,\n    // is not supported util someone requests.\n\n    var showNormal = normalModel.getShallow('show');\n    var showEmphasis = emphasisModel.getShallow('show');\n\n    // Consider performance, only fetch label when necessary.\n    // If `normal.show` is `false` and `emphasis.show` is `true` and `emphasis.formatter` is not set,\n    // label should be displayed, where text is fetched by `normal.formatter` or `opt.defaultText`.\n    var baseText;\n    if (showNormal || showEmphasis) {\n        if (labelFetcher) {\n            baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex);\n        }\n        if (baseText == null) {\n            baseText = zrUtil.isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt) : opt.defaultText;\n        }\n    }\n    var normalStyleText = showNormal ? baseText : null;\n    var emphasisStyleText = showEmphasis\n        ? zrUtil.retrieve2(\n            labelFetcher\n                ? labelFetcher.getFormattedLabel(labelDataIndex, 'emphasis', null, labelDimIndex)\n                : null,\n            baseText\n        )\n        : null;\n\n    // Optimize: If style.text is null, text will not be drawn.\n    if (normalStyleText != null || emphasisStyleText != null) {\n        // Always set `textStyle` even if `normalStyle.text` is null, because default\n        // values have to be set on `normalStyle`.\n        // If we set default values on `emphasisStyle`, consider case:\n        // Firstly, `setOption(... label: {normal: {text: null}, emphasis: {show: true}} ...);`\n        // Secondly, `setOption(... label: {noraml: {show: true, text: 'abc', color: 'red'} ...);`\n        // Then the 'red' will not work on emphasis.\n        setTextStyle(normalStyle, normalModel, normalSpecified, opt);\n        setTextStyle(emphasisStyle, emphasisModel, emphasisSpecified, opt, true);\n    }\n\n    normalStyle.text = normalStyleText;\n    emphasisStyle.text = emphasisStyleText;\n}\n\n/**\n * Modify label style manually.\n * Only works after `setLabelStyle` and `setElementHoverStyle` called.\n *\n * @param {module:zrender/src/Element} el\n * @param {Object} [normalStyleProps] optional\n * @param {Object} [emphasisStyleProps] optional\n */\nexport function modifyLabelStyle(el, normalStyleProps, emphasisStyleProps) {\n    var elStyle = el.style;\n    if (normalStyleProps) {\n        rollbackDefaultTextStyle(elStyle);\n        el.setStyle(normalStyleProps);\n        applyDefaultTextStyle(elStyle);\n    }\n    elStyle = el.__hoverStl;\n    if (emphasisStyleProps && elStyle) {\n        rollbackDefaultTextStyle(elStyle);\n        zrUtil.extend(elStyle, emphasisStyleProps);\n        applyDefaultTextStyle(elStyle);\n    }\n}\n\n/**\n * Set basic textStyle properties.\n * See more info in `setTextStyleCommon`.\n * @param {Object|module:zrender/graphic/Style} textStyle\n * @param {module:echarts/model/Model} model\n * @param {Object} [specifiedTextStyle] Can be overrided by settings in model.\n * @param {Object} [opt] See `opt` of `setTextStyleCommon`.\n * @param {boolean} [isEmphasis]\n */\nexport function setTextStyle(\n    textStyle, textStyleModel, specifiedTextStyle, opt, isEmphasis\n) {\n    setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis);\n    specifiedTextStyle && zrUtil.extend(textStyle, specifiedTextStyle);\n    // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n\n    return textStyle;\n}\n\n/**\n * Set text option in the style.\n * See more info in `setTextStyleCommon`.\n * @deprecated\n * @param {Object} textStyle\n * @param {module:echarts/model/Model} labelModel\n * @param {string|boolean} defaultColor Default text color.\n *        If set as false, it will be processed as a emphasis style.\n */\nexport function setText(textStyle, labelModel, defaultColor) {\n    var opt = {isRectText: true};\n    var isEmphasis;\n\n    if (defaultColor === false) {\n        isEmphasis = true;\n    }\n    else {\n        // Support setting color as 'auto' to get visual color.\n        opt.autoColor = defaultColor;\n    }\n    setTextStyleCommon(textStyle, labelModel, opt, isEmphasis);\n    // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n}\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 *\n * The `textStyle` object can either be a plain object or an instance of\n * `zrender/src/graphic/Style`, and either be the style of normal or emphasis.\n * After this mothod called, the `textStyle` object can then be used in\n * `el.setStyle(textStyle)` or `el.hoverStyle = textStyle`.\n *\n * Default value will be adopted and `insideRollbackOpt` will be created.\n * See `applyDefaultTextStyle` `rollbackDefaultTextStyle` for more details.\n *\n * opt: {\n *      disableBox: boolean, Whether diable drawing box of block (outer most).\n *      isRectText: boolean,\n *      autoColor: string, specify a color when color is 'auto',\n *              for textFill, textStroke, textBackgroundColor, and textBorderColor.\n *              If autoColor specified, it is used as default textFill.\n *      useInsideStyle:\n *              `true`: Use inside style (textFill, textStroke, textStrokeWidth)\n *                  if `textFill` is not specified.\n *              `false`: Do not use inside style.\n *              `null/undefined`: use inside style if `isRectText` is true and\n *                  `textFill` is not specified and textPosition contains `'inside'`.\n *      forceRich: boolean\n * }\n */\nfunction setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis) {\n    // Consider there will be abnormal when merge hover style to normal style if given default value.\n    opt = opt || EMPTY_OBJ;\n\n    if (opt.isRectText) {\n        var textPosition = textStyleModel.getShallow('position')\n            || (isEmphasis ? null : 'inside');\n        // 'outside' is not a valid zr textPostion value, but used\n        // in bar series, and magric type should be considered.\n        textPosition === 'outside' && (textPosition = 'top');\n        textStyle.textPosition = textPosition;\n        textStyle.textOffset = textStyleModel.getShallow('offset');\n        var labelRotate = textStyleModel.getShallow('rotate');\n        labelRotate != null && (labelRotate *= Math.PI / 180);\n        textStyle.textRotation = labelRotate;\n        textStyle.textDistance = zrUtil.retrieve2(\n            textStyleModel.getShallow('distance'), isEmphasis ? null : 5\n        );\n    }\n\n    var ecModel = textStyleModel.ecModel;\n    var globalTextStyle = ecModel && ecModel.option.textStyle;\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    var richItemNames = getRichItemNames(textStyleModel);\n    var richResult;\n    if (richItemNames) {\n        richResult = {};\n        for (var name in richItemNames) {\n            if (richItemNames.hasOwnProperty(name)) {\n                // Cascade is supported in rich.\n                var richTextStyle = textStyleModel.getModel(['rich', name]);\n                // In rich, never `disableBox`.\n                // FIXME: 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                setTokenTextStyle(richResult[name] = {}, richTextStyle, globalTextStyle, opt, isEmphasis);\n            }\n        }\n    }\n    textStyle.rich = richResult;\n\n    setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, true);\n\n    if (opt.forceRich && !opt.textStyle) {\n        opt.textStyle = {};\n    }\n\n    return textStyle;\n}\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// }\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            for (var name in rich) {\n                if (rich.hasOwnProperty(name)) {\n                    richItemNameMap[name] = 1;\n                }\n            }\n        }\n        textStyleModel = textStyleModel.parentModel;\n    }\n    return richItemNameMap;\n}\n\nfunction setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, isBlock) {\n    // In merge mode, default value should not be given.\n    globalTextStyle = !isEmphasis && globalTextStyle || EMPTY_OBJ;\n\n    textStyle.textFill = getAutoColor(textStyleModel.getShallow('color'), opt)\n        || globalTextStyle.color;\n    textStyle.textStroke = getAutoColor(textStyleModel.getShallow('textBorderColor'), opt)\n        || globalTextStyle.textBorderColor;\n    textStyle.textStrokeWidth = zrUtil.retrieve2(\n        textStyleModel.getShallow('textBorderWidth'),\n        globalTextStyle.textBorderWidth\n    );\n\n    if (!isEmphasis) {\n        if (isBlock) {\n            textStyle.insideRollbackOpt = opt;\n            applyDefaultTextStyle(textStyle);\n        }\n\n        // Set default finally.\n        if (textStyle.textFill == null) {\n            textStyle.textFill = opt.autoColor;\n        }\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    textStyle.fontStyle = textStyleModel.getShallow('fontStyle') || globalTextStyle.fontStyle;\n    textStyle.fontWeight = textStyleModel.getShallow('fontWeight') || globalTextStyle.fontWeight;\n    textStyle.fontSize = textStyleModel.getShallow('fontSize') || globalTextStyle.fontSize;\n    textStyle.fontFamily = textStyleModel.getShallow('fontFamily') || globalTextStyle.fontFamily;\n\n    textStyle.textAlign = textStyleModel.getShallow('align');\n    textStyle.textVerticalAlign = textStyleModel.getShallow('verticalAlign')\n        || textStyleModel.getShallow('baseline');\n\n    textStyle.textLineHeight = textStyleModel.getShallow('lineHeight');\n    textStyle.textWidth = textStyleModel.getShallow('width');\n    textStyle.textHeight = textStyleModel.getShallow('height');\n    textStyle.textTag = textStyleModel.getShallow('tag');\n\n    if (!isBlock || !opt.disableBox) {\n        textStyle.textBackgroundColor = getAutoColor(textStyleModel.getShallow('backgroundColor'), opt);\n        textStyle.textPadding = textStyleModel.getShallow('padding');\n        textStyle.textBorderColor = getAutoColor(textStyleModel.getShallow('borderColor'), opt);\n        textStyle.textBorderWidth = textStyleModel.getShallow('borderWidth');\n        textStyle.textBorderRadius = textStyleModel.getShallow('borderRadius');\n\n        textStyle.textBoxShadowColor = textStyleModel.getShallow('shadowColor');\n        textStyle.textBoxShadowBlur = textStyleModel.getShallow('shadowBlur');\n        textStyle.textBoxShadowOffsetX = textStyleModel.getShallow('shadowOffsetX');\n        textStyle.textBoxShadowOffsetY = textStyleModel.getShallow('shadowOffsetY');\n    }\n\n    textStyle.textShadowColor = textStyleModel.getShallow('textShadowColor')\n        || globalTextStyle.textShadowColor;\n    textStyle.textShadowBlur = textStyleModel.getShallow('textShadowBlur')\n        || globalTextStyle.textShadowBlur;\n    textStyle.textShadowOffsetX = textStyleModel.getShallow('textShadowOffsetX')\n        || globalTextStyle.textShadowOffsetX;\n    textStyle.textShadowOffsetY = textStyleModel.getShallow('textShadowOffsetY')\n        || globalTextStyle.textShadowOffsetY;\n}\n\nfunction getAutoColor(color, opt) {\n    return color !== 'auto' ? color : (opt && opt.autoColor) ? opt.autoColor : null;\n}\n\n/**\n * Give some default value to the input `textStyle` object, based on the current settings\n * in this `textStyle` object.\n *\n * The Scenario:\n * when text position is `inside` and `textFill` is not specified, we show\n * text border by default for better view. But it should be considered that text position\n * might be changed when hovering or being emphasis, where the `insideRollback` is used to\n * restore the style.\n *\n * Usage (& NOTICE):\n * When a style object (eithor plain object or instance of `zrender/src/graphic/Style`) is\n * about to be modified on its text related properties, `rollbackDefaultTextStyle` should\n * be called before the modification and `applyDefaultTextStyle` should be called after that.\n * (For the case that all of the text related properties is reset, like `setTextStyleCommon`\n * does, `rollbackDefaultTextStyle` is not needed to be called).\n */\nfunction applyDefaultTextStyle(textStyle) {\n    var textPosition = textStyle.textPosition;\n    var opt = textStyle.insideRollbackOpt;\n    var insideRollback;\n\n    if (opt && textStyle.textFill == null) {\n        var autoColor = opt.autoColor;\n        var isRectText = opt.isRectText;\n        var useInsideStyle = opt.useInsideStyle;\n\n        var useInsideStyleCache = useInsideStyle !== false\n            && (useInsideStyle === true\n                || (isRectText\n                    && textPosition\n                    // textPosition can be [10, 30]\n                    && typeof textPosition === 'string'\n                    && textPosition.indexOf('inside') >= 0\n                )\n            );\n        var useAutoColorCache = !useInsideStyleCache && autoColor != null;\n\n        // All of the props declared in `CACHED_LABEL_STYLE_PROPERTIES` are to be cached.\n        if (useInsideStyleCache || useAutoColorCache) {\n            insideRollback = {\n                textFill: textStyle.textFill,\n                textStroke: textStyle.textStroke,\n                textStrokeWidth: textStyle.textStrokeWidth\n            };\n        }\n        if (useInsideStyleCache) {\n            textStyle.textFill = '#fff';\n            // Consider text with #fff overflow its container.\n            if (textStyle.textStroke == null) {\n                textStyle.textStroke = autoColor;\n                textStyle.textStrokeWidth == null && (textStyle.textStrokeWidth = 2);\n            }\n        }\n        if (useAutoColorCache) {\n            textStyle.textFill = autoColor;\n        }\n    }\n\n    // Always set `insideRollback`, so that the previous one can be cleared.\n    textStyle.insideRollback = insideRollback;\n}\n\n/**\n * Consider the case: in a scatter,\n * label: {\n *     normal: {position: 'inside'},\n *     emphasis: {position: 'top'}\n * }\n * In the normal state, the `textFill` will be set as '#fff' for pretty view (see\n * `applyDefaultTextStyle`), but when switching to emphasis state, the `textFill`\n * should be retured to 'autoColor', but not keep '#fff'.\n */\nfunction rollbackDefaultTextStyle(style) {\n    var insideRollback = style.insideRollback;\n    if (insideRollback) {\n        // Reset all of the props in `CACHED_LABEL_STYLE_PROPERTIES`.\n        style.textFill = insideRollback.textFill;\n        style.textStroke = insideRollback.textStroke;\n        style.textStrokeWidth = insideRollback.textStrokeWidth;\n        style.insideRollback = null;\n    }\n}\n\nexport function getFont(opt, ecModel) {\n    // ecModel or default text style model.\n    var gTextStyleModel = ecModel || ecModel.getModel('textStyle');\n    return zrUtil.trim([\n        // FIXME in node-canvas fontWeight is before fontStyle\n        opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '',\n        opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '',\n        (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px',\n        opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'\n    ].join(' '));\n}\n\nfunction animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {\n    if (typeof dataIndex === 'function') {\n        cb = dataIndex;\n        dataIndex = null;\n    }\n    // Do not check 'animation' property directly here. Consider this case:\n    // animation model is an `itemModel`, whose does not have `isAnimationEnabled`\n    // but its parent model (`seriesModel`) does.\n    var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();\n\n    if (animationEnabled) {\n        var postfix = isUpdate ? 'Update' : '';\n        var duration = animatableModel.getShallow('animationDuration' + postfix);\n        var animationEasing = animatableModel.getShallow('animationEasing' + postfix);\n        var animationDelay = animatableModel.getShallow('animationDelay' + postfix);\n        if (typeof animationDelay === 'function') {\n            animationDelay = animationDelay(\n                dataIndex,\n                animatableModel.getAnimationDelayParams\n                    ? animatableModel.getAnimationDelayParams(el, dataIndex)\n                    : null\n            );\n        }\n        if (typeof duration === 'function') {\n            duration = duration(dataIndex);\n        }\n\n        duration > 0\n            ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb, !!cb)\n            : (el.stopAnimation(), el.attr(props), cb && cb());\n    }\n    else {\n        el.stopAnimation();\n        el.attr(props);\n        cb && cb();\n    }\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 if do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n *\n * @param {module:zrender/Element} el\n * @param {Object} props\n * @param {module:echarts/model/Model} [animatableModel]\n * @param {number} [dataIndex]\n * @param {Function} [cb]\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 */\nexport function updateProps(el, props, animatableModel, dataIndex, cb) {\n    animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);\n}\n\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 if do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n *\n * @param {module:zrender/Element} el\n * @param {Object} props\n * @param {module:echarts/model/Model} [animatableModel]\n * @param {number} [dataIndex]\n * @param {Function} cb\n */\nexport function initProps(el, props, animatableModel, dataIndex, cb) {\n    animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);\n}\n\n/**\n * Get transform matrix of target (param target),\n * in coordinate of its ancestor (param ancestor)\n *\n * @param {module:zrender/mixin/Transformable} target\n * @param {module:zrender/mixin/Transformable} [ancestor]\n */\nexport function getTransform(target, ancestor) {\n    var mat = matrix.identity([]);\n\n    while (target && target !== ancestor) {\n        matrix.mul(mat, target.getLocalTransform(), mat);\n        target = target.parent;\n    }\n\n    return mat;\n}\n\n/**\n * Apply transform to an vertex.\n * @param {Array.<number>} target [x, y]\n * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:\n *      + Transform matrix: like [1, 0, 0, 1, 0, 0]\n *      + {position, rotation, scale}, the same as `zrender/Transformable`.\n * @param {boolean=} invert Whether use invert matrix.\n * @return {Array.<number>} [x, y]\n */\nexport function applyTransform(target, transform, invert) {\n    if (transform && !zrUtil.isArrayLike(transform)) {\n        transform = Transformable.getLocalTransform(transform);\n    }\n\n    if (invert) {\n        transform = matrix.invert([], transform);\n    }\n    return vector.applyTransform([], target, transform);\n}\n\n/**\n * @param {string} direction 'left' 'right' 'top' 'bottom'\n * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]\n * @param {boolean=} invert Whether use invert matrix.\n * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'\n */\nexport function transformDirection(direction, transform, invert) {\n\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)\n        ? 1 : Math.abs(2 * transform[4] / transform[0]);\n    var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)\n        ? 1 : Math.abs(2 * transform[4] / transform[2]);\n\n    var vertex = [\n        direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,\n        direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0\n    ];\n\n    vertex = applyTransform(vertex, transform, invert);\n\n    return Math.abs(vertex[0]) > Math.abs(vertex[1])\n        ? (vertex[0] > 0 ? 'right' : 'left')\n        : (vertex[1] > 0 ? 'bottom' : 'top');\n}\n\n/**\n * Apply group transition animation from g1 to g2.\n * If no animatableModel, no animation.\n */\nexport function groupTransition(g1, g2, animatableModel, cb) {\n    if (!g1 || !g2) {\n        return;\n    }\n\n    function getElMap(g) {\n        var elMap = {};\n        g.traverse(function (el) {\n            if (!el.isGroup && el.anid) {\n                elMap[el.anid] = el;\n            }\n        });\n        return elMap;\n    }\n    function getAnimatableProps(el) {\n        var obj = {\n            position: vector.clone(el.position),\n            rotation: el.rotation\n        };\n        if (el.shape) {\n            obj.shape = zrUtil.extend({}, el.shape);\n        }\n        return obj;\n    }\n    var elMap1 = getElMap(g1);\n\n    g2.traverse(function (el) {\n        if (!el.isGroup && 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, el.dataIndex);\n            }\n            // else {\n            //     if (el.previousProps) {\n            //         graphic.updateProps\n            //     }\n            // }\n        }\n    });\n}\n\n/**\n * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]\n * @param {Object} rect {x, y, width, height}\n * @return {Array.<Array.<number>>} A new clipped points.\n */\nexport function clipPointsByRect(points, rect) {\n    // FIXME: this way migth be incorrect when grpahic clipped by a corner.\n    // and when element have border.\n    return zrUtil.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/**\n * @param {Object} targetRect {x, y, width, height}\n * @param {Object} rect {x, y, width, height}\n * @return {Object} 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\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}\n\n/**\n * @param {string} iconStr Support 'image://' or 'path://' or direct svg path.\n * @param {Object} [opt] Properties of `module:zrender/Element`, except `style`.\n * @param {Object} [rect] {x, y, width, height}\n * @return {module:zrender/Element} Icon path or image element.\n */\nexport function createIcon(iconStr, opt, rect) {\n    opt = zrUtil.extend({rectHover: true}, opt);\n    var style = opt.style = {strokeNoScale: true};\n    rect = rect || {x: -1, y: -1, width: 2, height: 2};\n\n    if (iconStr) {\n        return iconStr.indexOf('image://') === 0\n            ? (\n                style.image = iconStr.slice(8),\n                zrUtil.defaults(style, rect),\n                new ZImage(opt)\n            )\n            : (\n                makePath(\n                    iconStr.replace('path://', ''),\n                    opt,\n                    rect,\n                    'center'\n                )\n            );\n    }\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 *\n * @param {number} a1x\n * @param {number} a1y\n * @param {number} a2x\n * @param {number} a2y\n * @param {Array.<Array.<number>>} points Points of the polygon.\n * @return {boolean}\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/**\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 *\n * @param {number} a1x\n * @param {number} a1y\n * @param {number} a2x\n * @param {number} a2y\n * @param {number} b1x\n * @param {number} b1y\n * @param {number} b2x\n * @param {number} b2y\n * @return {boolean}\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\n    // `vec_m` and `vec_n` are parallel iff\n    //     exising `k` such that `vec_m = k · 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\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\n    return true;\n}\n\n/**\n * Cross product of 2-dimension vector.\n */\nfunction crossProduct2d(x1, y1, x2, y2) {\n    return x1 * y2 - x2 * y1;\n}\n\nfunction nearZero(val) {\n    return val <= (1e-6) && val >= -(1e-6);\n}\n\nexport {\n    Group,\n    ZImage as Image,\n    Text,\n    Circle,\n    Sector,\n    Ring,\n    Polygon,\n    Polyline,\n    Rect,\n    Line,\n    BezierCurve,\n    Arc,\n    IncrementalDisplayable,\n    CompoundPath,\n    LinearGradient,\n    RadialGradient,\n    BoundingRect\n};\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as textContain from 'zrender/src/contain/text';\nimport * as graphicUtil from '../../util/graphic';\n\nvar PATH_COLOR = ['textStyle', 'color'];\n\nexport default {\n    /**\n     * Get color property or get color from option.textStyle.color\n     * @param {boolean} [isEmphasis]\n     * @return {string}\n     */\n    getTextColor: function (isEmphasis) {\n        var ecModel = this.ecModel;\n        return this.getShallow('color')\n            || (\n                (!isEmphasis && ecModel) ? ecModel.get(PATH_COLOR) : null\n            );\n    },\n\n    /**\n     * Create font string from fontStyle, fontWeight, fontSize, fontFamily\n     * @return {string}\n     */\n    getFont: function () {\n        return graphicUtil.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\n    getTextRect: function (text) {\n        return textContain.getBoundingRect(\n            text,\n            this.getFont(),\n            this.getShallow('align'),\n            this.getShallow('verticalAlign') || this.getShallow('baseline'),\n            this.getShallow('padding'),\n            this.getShallow('lineHeight'),\n            this.getShallow('rich'),\n            this.getShallow('truncateText')\n        );\n    }\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport makeStyleMapper from './makeStyleMapper';\n\nvar getItemStyle = makeStyleMapper(\n    [\n        ['fill', 'color'],\n        ['stroke', 'borderColor'],\n        ['lineWidth', 'borderWidth'],\n        ['opacity'],\n        ['shadowBlur'],\n        ['shadowOffsetX'],\n        ['shadowOffsetY'],\n        ['shadowColor'],\n        ['textPosition'],\n        ['textAlign']\n    ]\n);\n\nexport default {\n    getItemStyle: function (excludes, includes) {\n        var style = getItemStyle(this, excludes, includes);\n        var lineDash = this.getBorderLineDash();\n        lineDash && (style.lineDash = lineDash);\n        return style;\n    },\n\n    getBorderLineDash: function () {\n        var lineType = this.get('borderType');\n        return (lineType === 'solid' || lineType == null) ? null\n            : (lineType === 'dashed' ? [5, 5] : [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 * @module echarts/model/Model\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport {makeInner} from '../util/model';\nimport {enableClassExtend, enableClassCheck} from '../util/clazz';\n\nimport lineStyleMixin from './mixin/lineStyle';\nimport areaStyleMixin from './mixin/areaStyle';\nimport textStyleMixin from './mixin/textStyle';\nimport itemStyleMixin from './mixin/itemStyle';\n\nvar mixin = zrUtil.mixin;\nvar inner = makeInner();\n\n/**\n * @alias module:echarts/model/Model\n * @constructor\n * @param {Object} [option]\n * @param {module:echarts/model/Model} [parentModel]\n * @param {module:echarts/model/Global} [ecModel]\n */\nfunction Model(option, parentModel, ecModel) {\n    /**\n     * @type {module:echarts/model/Model}\n     * @readOnly\n     */\n    this.parentModel = parentModel;\n\n    /**\n     * @type {module:echarts/model/Global}\n     * @readOnly\n     */\n    this.ecModel = ecModel;\n\n    /**\n     * @type {Object}\n     * @protected\n     */\n    this.option = option;\n\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\nModel.prototype = {\n\n    constructor: Model,\n\n    /**\n     * Model 的初始化函数\n     * @param {Object} option\n     */\n    init: null,\n\n    /**\n     * 从新的 Option merge\n     */\n    mergeOption: function (option) {\n        zrUtil.merge(this.option, option, true);\n    },\n\n    /**\n     * @param {string|Array.<string>} path\n     * @param {boolean} [ignoreParent=false]\n     * @return {*}\n     */\n    get: function (path, ignoreParent) {\n        if (path == null) {\n            return this.option;\n        }\n\n        return doGet(\n            this.option,\n            this.parsePath(path),\n            !ignoreParent && getParent(this, path)\n        );\n    },\n\n    /**\n     * @param {string} key\n     * @param {boolean} [ignoreParent=false]\n     * @return {*}\n     */\n    getShallow: function (key, ignoreParent) {\n        var option = this.option;\n\n        var val = option == null ? option : option[key];\n        var parentModel = !ignoreParent && getParent(this, key);\n        if (val == null && parentModel) {\n            val = parentModel.getShallow(key);\n        }\n        return val;\n    },\n\n    /**\n     * @param {string|Array.<string>} [path]\n     * @param {module:echarts/model/Model} [parentModel]\n     * @return {module:echarts/model/Model}\n     */\n    getModel: function (path, parentModel) {\n        var obj = path == null\n            ? this.option\n            : doGet(this.option, path = this.parsePath(path));\n\n        var thisParentModel;\n        parentModel = parentModel || (\n            (thisParentModel = getParent(this, path))\n                && thisParentModel.getModel(path)\n        );\n\n        return new Model(obj, parentModel, this.ecModel);\n    },\n\n    /**\n     * If model has option\n     */\n    isEmpty: function () {\n        return this.option == null;\n    },\n\n    restoreData: function () {},\n\n    // Pending\n    clone: function () {\n        var Ctor = this.constructor;\n        return new Ctor(zrUtil.clone(this.option));\n    },\n\n    setReadOnly: function (properties) {\n        // clazzUtil.setReadOnly(this, properties);\n    },\n\n    // If path is null/undefined, return null/undefined.\n    parsePath: function (path) {\n        if (typeof path === 'string') {\n            path = path.split('.');\n        }\n        return path;\n    },\n\n    /**\n     * @param {Function} getParentMethod\n     *        param {Array.<string>|string} path\n     *        return {module:echarts/model/Model}\n     */\n    customizeGetParent: function (getParentMethod) {\n        inner(this).getParent = getParentMethod;\n    },\n\n    isAnimationEnabled: function () {\n        if (!env.node) {\n            if (this.option.animation != null) {\n                return !!this.option.animation;\n            }\n            else if (this.parentModel) {\n                return this.parentModel.isAnimationEnabled();\n            }\n        }\n    }\n\n};\n\nfunction doGet(obj, pathArr, parentModel) {\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.get(pathArr);\n    }\n    return obj;\n}\n\n// `path` can be null/undefined\nfunction getParent(model, path) {\n    var getParentMethod = inner(model).getParent;\n    return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;\n}\n\n// Enable Model.extend.\nenableClassExtend(Model);\nenableClassCheck(Model);\n\nmixin(Model, lineStyleMixin);\nmixin(Model, areaStyleMixin);\nmixin(Model, textStyleMixin);\nmixin(Model, itemStyleMixin);\n\nexport default Model;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {parseClassType} from './clazz';\n\nvar base = 0;\n\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++, Math.random().toFixed(5)].join('_');\n}\n\n/**\n * @inner\n */\nexport function enableSubTypeDefaulter(entity) {\n\n    var subTypeDefaulters = {};\n\n    entity.registerSubTypeDefaulter = function (componentType, defaulter) {\n        componentType = parseClassType(componentType);\n        subTypeDefaulters[componentType.main] = defaulter;\n    };\n\n    entity.determineSubType = function (componentType, option) {\n        var type = option.type;\n        if (!type) {\n            var componentTypeMain = parseClassType(componentType).main;\n            if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {\n                type = subTypeDefaulters[componentTypeMain](option);\n            }\n        }\n        return type;\n    };\n\n    return entity;\n}\n\n/**\n * Topological travel on Activity Network (Activity On Vertices).\n * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].\n *\n * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.\n *\n * If there is circle dependencey, Error will be thrown.\n *\n */\nexport function enableTopologicalTravel(entity, dependencyGetter) {\n\n    /**\n     * @public\n     * @param {Array.<string>} targetNameList Target Component type list.\n     *                                           Can be ['aa', 'bb', 'aa.xx']\n     * @param {Array.<string>} fullNameList By which we can build dependency graph.\n     * @param {Function} callback Params: componentType, dependencies.\n     * @param {Object} context Scope of callback.\n     */\n    entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {\n        if (!targetNameList.length) {\n            return;\n        }\n\n        var result = makeDepndencyGraph(fullNameList);\n        var graph = result.graph;\n        var stack = result.noEntryList;\n\n        var targetNameSet = {};\n        zrUtil.each(targetNameList, function (name) {\n            targetNameSet[name] = true;\n        });\n\n        while (stack.length) {\n            var currComponentType = stack.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(\n                currVertex.successor,\n                isInTargetNameSet ? removeEdgeAndAdd : removeEdge\n            );\n        }\n\n        zrUtil.each(targetNameSet, function () {\n            throw new Error('Circle dependency may exists');\n        });\n\n        function removeEdge(succComponentType) {\n            graph[succComponentType].entryCount--;\n            if (graph[succComponentType].entryCount === 0) {\n                stack.push(succComponentType);\n            }\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\n    /**\n     * DepndencyGraph: {Object}\n     * key: conponentType,\n     * value: {\n     *     successor: [conponentTypes...],\n     *     originalDeps: [conponentTypes...],\n     *     entryCount: {number}\n     * }\n     */\n    function makeDepndencyGraph(fullNameList) {\n        var graph = {};\n        var noEntryList = [];\n\n        zrUtil.each(fullNameList, function (name) {\n\n            var thisItem = createDependencyGraphItem(graph, name);\n            var originalDeps = thisItem.originalDeps = dependencyGetter(name);\n\n            var availableDeps = getAvailableDependencies(originalDeps, fullNameList);\n            thisItem.entryCount = availableDeps.length;\n            if (thisItem.entryCount === 0) {\n                noEntryList.push(name);\n            }\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\n        return {graph: graph, noEntryList: noEntryList};\n    }\n\n    function createDependencyGraphItem(graph, name) {\n        if (!graph[name]) {\n            graph[name] = {predecessor: [], successor: []};\n        }\n        return graph[name];\n    }\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}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/*\n* A third-party license is embeded 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*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar RADIAN_EPSILON = 1e-4;\n\nfunction _trim(str) {\n    return str.replace(/^\\s+/, '').replace(/\\s+$/, '');\n}\n\n/**\n * Linear mapping a value from domain to range\n * @memberOf module:echarts/util/number\n * @param  {(number|Array.<number>)} val\n * @param  {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1]\n * @param  {Array.<number>} range  Range extent range[0] can be bigger than range[1]\n * @param  {boolean} clamp\n * @return {(number|Array.<number>}\n */\nexport function linearMap(val, domain, range, clamp) {\n    var subDomain = domain[1] - domain[0];\n    var subRange = range[1] - range[0];\n\n    if (subDomain === 0) {\n        return subRange === 0\n            ? range[0]\n            : (range[0] + range[1]) / 2;\n    }\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 <= domain[0]) {\n                return range[0];\n            }\n            else if (val >= domain[1]) {\n                return range[1];\n            }\n        }\n        else {\n            if (val >= domain[0]) {\n                return range[0];\n            }\n            else if (val <= domain[1]) {\n                return range[1];\n            }\n        }\n    }\n    else {\n        if (val === domain[0]) {\n            return range[0];\n        }\n        if (val === domain[1]) {\n            return range[1];\n        }\n    }\n\n    return (val - domain[0]) / subDomain * subRange + range[0];\n}\n\n/**\n * Convert a percent string to absolute number.\n * Returns NaN if percent is not a valid string or number\n * @memberOf module:echarts/util/number\n * @param {string|number} percent\n * @param {number} all\n * @return {number}\n */\nexport function parsePercent(percent, all) {\n    switch (percent) {\n        case 'center':\n        case 'middle':\n            percent = '50%';\n            break;\n        case 'left':\n        case 'top':\n            percent = '0%';\n            break;\n        case 'right':\n        case 'bottom':\n            percent = '100%';\n            break;\n    }\n    if (typeof percent === 'string') {\n        if (_trim(percent).match(/%$/)) {\n            return parseFloat(percent) / 100 * all;\n        }\n\n        return parseFloat(percent);\n    }\n\n    return percent == null ? NaN : +percent;\n}\n\n/**\n * (1) Fix rounding error of float numbers.\n * (2) Support return string to avoid scientific notation like '3.5e-7'.\n *\n * @param {number} x\n * @param {number} [precision]\n * @param {boolean} [returnStr]\n * @return {number|string}\n */\nexport function round(x, precision, returnStr) {\n    if (precision == null) {\n        precision = 10;\n    }\n    // Avoid range error\n    precision = Math.min(Math.max(0, precision), 20);\n    x = (+x).toFixed(precision);\n    return returnStr ? x : +x;\n}\n\n/**\n * asc sort arr.\n * The input arr will be modified.\n *\n * @param {Array} arr\n * @return {Array} The input arr.\n */\nexport function asc(arr) {\n    arr.sort(function (a, b) {\n        return a - b;\n    });\n    return arr;\n}\n\n/**\n * Get precision\n * @param {number} val\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    //      var tmp = val.toString();\n    //      return tmp.length - 1 - tmp.indexOf('.');\n    // especially when precision is low\n    var e = 1;\n    var count = 0;\n    while (Math.round(val * e) / e !== val) {\n        e *= 10;\n        count++;\n    }\n    return count;\n}\n\n/**\n * @param {string|number} val\n * @return {number}\n */\nexport function getPrecisionSafe(val) {\n    var str = val.toString();\n\n    // Consider scientific notation: '3.4e-12' '3.4e+12'\n    var eIndex = str.indexOf('e');\n    if (eIndex > 0) {\n        var precision = +str.slice(eIndex + 1);\n        return precision < 0 ? -precision : 0;\n    }\n    else {\n        var dotIndex = str.indexOf('.');\n        return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;\n    }\n}\n\n/**\n * Minimal dicernible data precisioin according to a single pixel.\n *\n * @param {Array.<number>} dataExtent\n * @param {Array.<number>} pixelExtent\n * @return {number} precision\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(Math.abs(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/**\n * Get a data of given precision, assuring the sum of percentages\n * in valueList is 1.\n * The largest remainer method is used.\n * https://en.wikipedia.org/wiki/Largest_remainder_method\n *\n * @param {Array.<number>} valueList a list of all data\n * @param {number} idx index of the data to be processed in valueList\n * @param {number} precision integer number showing digits of precision\n * @return {number} percent ranging from 0 to 100\n */\nexport function getPercentWithPrecision(valueList, idx, precision) {\n    if (!valueList[idx]) {\n        return 0;\n    }\n\n    var sum = zrUtil.reduce(valueList, function (acc, val) {\n        return acc + (isNaN(val) ? 0 : val);\n    }, 0);\n    if (sum === 0) {\n        return 0;\n    }\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\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\n    var remainder = zrUtil.map(votesPerQuota, function (votes, idx) {\n        return votes - seats[idx];\n    });\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\n        // Add a vote to max remainder.\n        ++seats[maxId];\n        remainder[maxId] = 0;\n        ++currentSum;\n    }\n\n    return seats[idx] / digits;\n}\n\n// Number.MAX_SAFE_INTEGER, ie do not support.\nexport var MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * To 0 - 2 * PI, considering negative radian.\n * @param {number} radian\n * @return {number}\n */\nexport function remRadian(radian) {\n    var pi2 = Math.PI * 2;\n    return (radian % pi2 + pi2) % pi2;\n}\n\n/**\n * @param {type} radian\n * @return {boolean}\n */\nexport function isRadianAroundZero(val) {\n    return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;\n}\n\n/* eslint-disable */\nvar TIME_REG = /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d\\d)(?::(\\d\\d)(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; // jshint ignore:line\n/* eslint-enable */\n\n/**\n * @param {string|Date|number} value 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 loacal 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} date\n */\nexport function parseDate(value) {\n    if (value instanceof Date) {\n        return value;\n    }\n    else if (typeof value === 'string') {\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\n        if (!match) {\n            // return Invalid Date.\n            return new Date(NaN);\n        }\n\n        // Use local time when no timezone offset specifed.\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(\n                +match[1],\n                +(match[2] || 1) - 1,\n                +match[3] || 1,\n                +match[4] || 0,\n                +(match[5] || 0),\n                +match[6] || 0,\n                +match[7] || 0\n            );\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(\n                +match[1],\n                +(match[2] || 1) - 1,\n                +match[3] || 1,\n                hour,\n                +(match[5] || 0),\n                +match[6] || 0,\n                +match[7] || 0\n            ));\n        }\n    }\n    else if (value == null) {\n        return new Date(NaN);\n    }\n\n    return new Date(Math.round(value));\n}\n\n/**\n * Quantity of a number. e.g. 0.1, 1, 10, 100\n *\n * @param  {number} val\n * @return {number}\n */\nexport function quantity(val) {\n    return Math.pow(10, quantityExponent(val));\n}\n\nfunction quantityExponent(val) {\n    return Math.floor(Math.log(val) / Math.LN10);\n}\n\n/**\n * find a “nice” number approximately equal to x. Round the number if round = true,\n * take ceiling if round = false. The primary observation is that the “nicest”\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  {number} val Non-negative value.\n * @param  {boolean} round\n * @return {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        }\n        else if (f < 2.5) {\n            nf = 2;\n        }\n        else if (f < 4) {\n            nf = 3;\n        }\n        else if (f < 7) {\n            nf = 5;\n        }\n        else {\n            nf = 10;\n        }\n    }\n    else {\n        if (f < 1) {\n            nf = 1;\n        }\n        else if (f < 2) {\n            nf = 2;\n        }\n        else if (f < 3) {\n            nf = 3;\n        }\n        else if (f < 5) {\n            nf = 5;\n        }\n        else {\n            nf = 10;\n        }\n    }\n    val = nf * exp10;\n\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/**\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 {Array.<number>} 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/**\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 {Array.<Object>} list, where `close` mean open or close\n *        of the interval, and Infinity can be used.\n * @return {Array.<Object>} 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\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 = list[i].close;\n\n        for (var lg = 0; lg < 2; lg++) {\n            if (interval[lg] <= curr) {\n                interval[lg] = curr;\n                close[lg] = !lg ? 1 - currClose : 1;\n            }\n            curr = interval[lg];\n            currClose = close[lg];\n        }\n\n        if (interval[0] === interval[1] && close[0] * close[1] !== 1) {\n            list.splice(i, 1);\n        }\n        else {\n            i++;\n        }\n    }\n\n    return list;\n\n    function littleThan(a, b, lg) {\n        return a.interval[lg] < b.interval[lg]\n            || (\n                a.interval[lg] === b.interval[lg]\n                && (\n                    (a.close[lg] - b.close[lg] === (!lg ? 1 : -1))\n                    || (!lg && littleThan(a, b, 1))\n                )\n            );\n    }\n}\n\n/**\n * parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n * ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n * subtraction forces infinities to NaN\n *\n * @param {*} v\n * @return {boolean}\n */\nexport function isNumeric(v) {\n    return v - parseFloat(v) >= 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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as textContain from 'zrender/src/contain/text';\nimport * as numberUtil from './number';\n// import Text from 'zrender/src/graphic/Text';\n\n/**\n * 每三位默认加,格式化\n * @param {string|number} x\n * @return {string}\n */\nexport function addCommas(x) {\n    if (isNaN(x)) {\n        return '-';\n    }\n    x = (x + '').split('.');\n    return x[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g, '$1,')\n            + (x.length > 1 ? ('.' + x[1]) : '');\n}\n\n/**\n * @param {string} str\n * @param {boolean} [upperCaseFirst=false]\n * @return {string} str\n */\nexport function toCamelCase(str, upperCaseFirst) {\n    str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {\n        return group1.toUpperCase();\n    });\n\n    if (upperCaseFirst && str) {\n        str = str.charAt(0).toUpperCase() + str.slice(1);\n    }\n\n    return str;\n}\n\nexport var normalizeCssArray = zrUtil.normalizeCssArray;\n\n\nvar replaceReg = /([&<>\"'])/g;\nvar replaceMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n};\n\nexport function encodeHTML(source) {\n    return source == null\n        ? ''\n        : (source + '').replace(replaceReg, function (str, c) {\n            return replaceMap[c];\n        });\n}\n\nvar TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];\n\nvar wrapVar = function (varName, seriesIdx) {\n    return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';\n};\n\n/**\n * Template formatter\n * @param {string} tpl\n * @param {Array.<Object>|Object} paramsList\n * @param {boolean} [encode=false]\n * @return {string}\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\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(\n                wrapVar(TPL_VAR_ALIAS[k], seriesIdx),\n                encode ? encodeHTML(val) : val\n            );\n        }\n    }\n\n    return tpl;\n}\n\n/**\n * simple Template formatter\n *\n * @param {string} tpl\n * @param {Object} param\n * @param {boolean} [encode=false]\n * @return {string}\n */\nexport function formatTplSimple(tpl, param, encode) {\n    zrUtil.each(param, function (value, key) {\n        tpl = tpl.replace(\n            '{' + key + '}',\n            encode ? encodeHTML(value) : value\n        );\n    });\n    return tpl;\n}\n\n/**\n * @param {Object|string} [opt] If string, means color.\n * @param {string} [opt.color]\n * @param {string} [opt.extraCssText]\n * @param {string} [opt.type='item'] 'item' or 'subItem'\n * @param {string} [opt.renderMode='html'] render mode of tooltip, 'html' or 'richText'\n * @param {string} [opt.markerId='X'] id name for marker. If only one marker is in a rich text, this can be omitted.\n * @return {string}\n */\nexport function getTooltipMarker(opt, extraCssText) {\n    opt = zrUtil.isString(opt) ? {color: opt, extraCssText: extraCssText} : (opt || {});\n    var color = opt.color;\n    var type = opt.type;\n    var extraCssText = opt.extraCssText;\n    var renderMode = opt.renderMode || 'html';\n    var markerId = opt.markerId || 'X';\n\n    if (!color) {\n        return '';\n    }\n\n    if (renderMode === 'html') {\n        return type === 'subItem'\n        ? '<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;'\n            + 'border-radius:4px;width:4px;height:4px;background-color:'\n            + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>'\n        : '<span style=\"display:inline-block;margin-right:5px;'\n            + 'border-radius:10px;width:10px;height:10px;background-color:'\n            + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>';\n    }\n    else {\n        // Space for rich element marker\n        return {\n            renderMode: renderMode,\n            content: '{marker' + markerId + '|}  ',\n            style: {\n                color: color\n            }\n        };\n    }\n}\n\nfunction pad(str, len) {\n    str += '';\n    return '0000'.substr(0, len - str.length) + str;\n}\n\n\n/**\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 (tpl === 'week'\n        || tpl === 'month'\n        || tpl === 'quarter'\n        || tpl === 'half-year'\n        || tpl === 'year'\n    ) {\n        tpl = 'MM-dd\\nyyyy';\n    }\n\n    var date = numberUtil.parseDate(value);\n    var utc = isUTC ? 'UTC' : '';\n    var y = date['get' + utc + 'FullYear']();\n    var M = date['get' + utc + 'Month']() + 1;\n    var d = date['get' + utc + 'Date']();\n    var h = date['get' + utc + 'Hours']();\n    var m = date['get' + utc + 'Minutes']();\n    var s = date['get' + utc + 'Seconds']();\n    var S = date['get' + utc + 'Milliseconds']();\n\n    tpl = tpl.replace('MM', pad(M, 2))\n        .replace('M', M)\n        .replace('yyyy', y)\n        .replace('yy', y % 100)\n        .replace('dd', pad(d, 2))\n        .replace('d', d)\n        .replace('hh', pad(h, 2))\n        .replace('h', h)\n        .replace('mm', pad(m, 2))\n        .replace('m', m)\n        .replace('ss', pad(s, 2))\n        .replace('s', s)\n        .replace('SSS', pad(S, 3));\n\n    return tpl;\n}\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\nexport var truncateText = textContain.truncateText;\n\n/**\n * @public\n * @param {Object} opt\n * @param {string} opt.text\n * @param {string} opt.font\n * @param {string} [opt.textAlign='left']\n * @param {string} [opt.textVerticalAlign='top']\n * @param {Array.<number>} [opt.textPadding]\n * @param {number} [opt.textLineHeight]\n * @param {Object} [opt.rich]\n * @param {Object} [opt.truncate]\n * @return {Object} {x, y, width, height, lineHeight}\n */\nexport function getTextBoundingRect(opt) {\n    return textContain.getBoundingRect(\n        opt.text,\n        opt.font,\n        opt.textAlign,\n        opt.textVerticalAlign,\n        opt.textPadding,\n        opt.textLineHeight,\n        opt.rich,\n        opt.truncate\n    );\n}\n\n/**\n * @deprecated\n * the `textLineHeight` was added later.\n * For backward compatiblility, put it as the last parameter.\n * But deprecated this interface. Please use `getTextBoundingRect` instead.\n */\nexport function getTextRect(\n    text, font, textAlign, textVerticalAlign, textPadding, rich, truncate, textLineHeight\n) {\n    return textContain.getBoundingRect(\n        text, font, textAlign, textVerticalAlign, textPadding, textLineHeight, rich, truncate\n    );\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Layout helpers for each component positioning\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {parsePercent} from './number';\nimport * as formatUtil from './format';\n\nvar each = zrUtil.each;\n\n/**\n * @public\n */\nexport var LOCATION_PARAMS = [\n    'left', 'right', 'top', 'bottom', 'width', 'height'\n];\n\n/**\n * @public\n */\nexport var HV_NAMES = [\n    ['width', 'left', 'right'],\n    ['height', 'top', 'bottom']\n];\n\nfunction boxLayout(orient, group, gap, maxWidth, maxHeight) {\n    var x = 0;\n    var y = 0;\n\n    if (maxWidth == null) {\n        maxWidth = Infinity;\n    }\n    if (maxHeight == null) {\n        maxHeight = Infinity;\n    }\n    var currentLineMaxSize = 0;\n\n    group.eachChild(function (child, idx) {\n        var position = child.position;\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\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            }\n            else {\n                // FIXME: consider rect.y is not `0`?\n                currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);\n            }\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            }\n            else {\n                currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);\n            }\n        }\n\n        if (child.newline) {\n            return;\n        }\n\n        position[0] = x;\n        position[1] = y;\n\n        orient === 'horizontal'\n            ? (x = nextX + gap)\n            : (y = nextY + gap);\n    });\n}\n\n/**\n * VBox or HBox layouting\n * @param {string} orient\n * @param {module:zrender/container/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\nexport var box = boxLayout;\n\n/**\n * VBox layouting\n * @param {module:zrender/container/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/**\n * HBox layouting\n * @param {module:zrender/container/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\nexport var hbox = zrUtil.curry(boxLayout, 'horizontal');\n\n/**\n * If x or x2 is not specified or 'center' 'left' 'right',\n * the width would be as long as possible.\n * If y or y2 is not specified or 'middle' 'top' 'bottom',\n * the height would be as long as possible.\n *\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.x]\n * @param {number|string} [positionInfo.y]\n * @param {number|string} [positionInfo.x2]\n * @param {number|string} [positionInfo.y2]\n * @param {Object} containerRect {width, height}\n * @param {string|number} margin\n * @return {Object} {width, height}\n */\nexport function getAvailableSize(positionInfo, containerRect, margin) {\n    var containerWidth = containerRect.width;\n    var containerHeight = containerRect.height;\n\n    var x = parsePercent(positionInfo.x, containerWidth);\n    var y = parsePercent(positionInfo.y, containerHeight);\n    var x2 = parsePercent(positionInfo.x2, containerWidth);\n    var y2 = parsePercent(positionInfo.y2, containerHeight);\n\n    (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);\n    (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);\n    (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);\n    (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);\n\n    margin = formatUtil.normalizeCssArray(margin || 0);\n\n    return {\n        width: Math.max(x2 - x - margin[1] - margin[3], 0),\n        height: Math.max(y2 - y - margin[0] - margin[2], 0)\n    };\n}\n\n/**\n * Parse position info.\n *\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.left]\n * @param {number|string} [positionInfo.top]\n * @param {number|string} [positionInfo.right]\n * @param {number|string} [positionInfo.bottom]\n * @param {number|string} [positionInfo.width]\n * @param {number|string} [positionInfo.height]\n * @param {number|string} [positionInfo.aspect] Aspect is width / height\n * @param {Object} containerRect\n * @param {string|number} [margin]\n *\n * @return {module:zrender/core/BoundingRect}\n */\nexport function getLayoutRect(\n    positionInfo, containerRect, margin\n) {\n    margin = formatUtil.normalizeCssArray(margin || 0);\n\n    var containerWidth = containerRect.width;\n    var containerHeight = containerRect.height;\n\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\n    var verticalMargin = margin[2] + margin[0];\n    var horizontalMargin = margin[1] + margin[3];\n    var aspect = positionInfo.aspect;\n\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\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            if (aspect > containerWidth / containerHeight) {\n                width = containerWidth * 0.8;\n            }\n            else {\n                height = containerHeight * 0.8;\n            }\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\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\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\n    var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);\n    rect.margin = margin;\n    return rect;\n}\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. Traslate (with el.position by this method)\n * So this method only fixes the last step 'Traslate', which does not affect\n * scaling and rotating.\n *\n * If be called repeatly with the same input el, the same result will be gotten.\n *\n * @param {module:zrender/Element} el Should have `getBoundingRect` method.\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.left]\n * @param {number|string} [positionInfo.top]\n * @param {number|string} [positionInfo.right]\n * @param {number|string} [positionInfo.bottom]\n * @param {number|string} [positionInfo.width] Only for opt.boundingModel: 'raw'\n * @param {number|string} [positionInfo.height] Only for opt.boundingModel: 'raw'\n * @param {Object} containerRect\n * @param {string|number} margin\n * @param {Object} [opt]\n * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.\n * @param {Array.<number>} [opt.boundingMode='all']\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) {\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\n    if (!h && !v) {\n        return;\n    }\n\n    var rect;\n    if (boundingMode === 'raw') {\n        rect = el.type === 'group'\n            ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)\n            : el.getBoundingRect();\n    }\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\n    // The real width and height can not be specified but calculated by the given el.\n    positionInfo = getLayoutRect(\n        zrUtil.defaults(\n            {width: rect.width, height: rect.height},\n            positionInfo\n        ),\n        containerRect,\n        margin\n    );\n\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 elPos = el.position;\n    var dx = h ? positionInfo.x - rect.x : 0;\n    var dy = v ? positionInfo.y - rect.y : 0;\n\n    el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);\n}\n\n/**\n * @param {Object} option Contains some of the properties in HV_NAMES.\n * @param {number} hvIdx 0: horizontal; 1: vertical.\n */\nexport function sizeCalculable(option, hvIdx) {\n    return option[HV_NAMES[hvIdx][0]] != null\n        || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);\n}\n\n/**\n * Consider Case:\n * When defulat 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 *         var 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 {Object} targetOption\n * @param {Object} newOption\n * @param {Object|string} [opt]\n * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Used for the components\n *  that width (or height) should not be calculated by left and right (or top and bottom).\n */\nexport function mergeLayoutParam(targetOption, newOption, opt) {\n    !zrUtil.isObject(opt) && (opt = {});\n\n    var ignoreSize = opt.ignoreSize;\n    !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);\n\n    var hResult = merge(HV_NAMES[0], 0);\n    var vResult = merge(HV_NAMES[1], 1);\n\n    copy(HV_NAMES[0], targetOption, hResult);\n    copy(HV_NAMES[1], targetOption, vResult);\n\n    function merge(names, hvIdx) {\n        var newParams = {};\n        var newValueCount = 0;\n        var merged = {};\n        var mergedValueCount = 0;\n        var enoughParamNumber = 2;\n\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            hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);\n            hasValue(newParams, name) && newValueCount++;\n            hasValue(merged, name) && mergedValueCount++;\n        });\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            }\n            else if (hasValue(newOption, names[2])) {\n                merged[names[1]] = null;\n            }\n            return merged;\n        }\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        }\n        else {\n            // Chose another param from targetOption by priority.\n            for (var i = 0; i < names.length; i++) {\n                var name = names[i];\n                if (!hasProp(newParams, name) && hasProp(targetOption, name)) {\n                    newParams[name] = targetOption[name];\n                    break;\n                }\n            }\n            return newParams;\n        }\n    }\n\n    function hasProp(obj, name) {\n        return obj.hasOwnProperty(name);\n    }\n\n    function hasValue(obj, name) {\n        return obj[name] != null && obj[name] !== 'auto';\n    }\n\n    function copy(names, target, source) {\n        each(names, function (name) {\n            target[name] = source[name];\n        });\n    }\n}\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 getLayoutParams(source) {\n    return copyLayoutParams({}, source);\n}\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        source.hasOwnProperty(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\nexport default {\n    getBoxLayoutParams: function () {\n        return {\n            left: this.get('left'),\n            top: this.get('top'),\n            right: this.get('right'),\n            bottom: this.get('bottom'),\n            width: this.get('width'),\n            height: this.get('height')\n        };\n    }\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Component model\n *\n * @module echarts/model/Component\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Model from './Model';\nimport * as componentUtil from '../util/component';\nimport {enableClassManagement, parseClassType} from '../util/clazz';\nimport {makeInner} from '../util/model';\nimport * as layout from '../util/layout';\nimport boxLayoutMixin from './mixin/boxLayout';\n\nvar inner = makeInner();\n\n/**\n * @alias module:echarts/model/Component\n * @constructor\n * @param {Object} option\n * @param {module:echarts/model/Model} parentModel\n * @param {module:echarts/model/Model} ecModel\n */\nvar ComponentModel = Model.extend({\n\n    type: 'component',\n\n    /**\n     * @readOnly\n     * @type {string}\n     */\n    id: '',\n\n    /**\n     * Because simplified concept is probably better, series.name (or component.name)\n     * has been having too many resposibilities:\n     * (1) Generating id (which requires name in option should not be modified).\n     * (2) As an index to mapping series when merging option or calling API (a name\n     * can refer to more then one components, which is convinient is some case).\n     * (3) Display.\n     * @readOnly\n     */\n    name: '',\n\n    /**\n     * @readOnly\n     * @type {string}\n     */\n    mainType: '',\n\n    /**\n     * @readOnly\n     * @type {string}\n     */\n    subType: '',\n\n    /**\n     * @readOnly\n     * @type {number}\n     */\n    componentIndex: 0,\n\n    /**\n     * @type {Object}\n     * @protected\n     */\n    defaultOption: null,\n\n    /**\n     * @type {module:echarts/model/Global}\n     * @readOnly\n     */\n    ecModel: null,\n\n    /**\n     * key: componentType\n     * value:  Component model list, can not be null.\n     * @type {Object.<string, Array.<module:echarts/model/Model>>}\n     * @readOnly\n     */\n    dependentModels: [],\n\n    /**\n     * @type {string}\n     * @readOnly\n     */\n    uid: null,\n\n    /**\n     * Support merge layout params.\n     * Only support 'box' now (left/right/top/bottom/width/height).\n     * @type {string|Object} Object can be {ignoreSize: true}\n     * @readOnly\n     */\n    layoutMode: null,\n\n    $constructor: function (option, parentModel, ecModel, extraOpt) {\n        Model.call(this, option, parentModel, ecModel, extraOpt);\n\n        this.uid = componentUtil.getUID('ec_cpt_model');\n    },\n\n    init: function (option, parentModel, ecModel, extraOpt) {\n        this.mergeDefaultAndTheme(option, ecModel);\n    },\n\n    mergeDefaultAndTheme: function (option, ecModel) {\n        var layoutMode = this.layoutMode;\n        var inputPositionParams = layoutMode\n            ? layout.getLayoutParams(option) : {};\n\n        var themeModel = ecModel.getTheme();\n        zrUtil.merge(option, themeModel.get(this.mainType));\n        zrUtil.merge(option, this.getDefaultOption());\n\n        if (layoutMode) {\n            layout.mergeLayoutParam(option, inputPositionParams, layoutMode);\n        }\n    },\n\n    mergeOption: function (option, extraOpt) {\n        zrUtil.merge(this.option, option, true);\n\n        var layoutMode = this.layoutMode;\n        if (layoutMode) {\n            layout.mergeLayoutParam(this.option, option, layoutMode);\n        }\n    },\n\n    // Hooker after init or mergeOption\n    optionUpdated: function (newCptOption, isInit) {},\n\n    getDefaultOption: function () {\n        var fields = inner(this);\n        if (!fields.defaultOption) {\n            var optList = [];\n            var Class = this.constructor;\n            while (Class) {\n                var opt = Class.prototype.defaultOption;\n                opt && optList.push(opt);\n                Class = Class.superClass;\n            }\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    getReferringComponents: function (mainType) {\n        return this.ecModel.queryComponents({\n            mainType: mainType,\n            index: this.get(mainType + 'Index', true),\n            id: this.get(mainType + 'Id', true)\n        });\n    }\n\n});\n\n// Reset ComponentModel.extend, add preConstruct.\n// clazzUtil.enableClassExtend(\n//     ComponentModel,\n//     function (option, parentModel, ecModel, extraOpt) {\n//         // Set dependentModels, componentIndex, name, id, mainType, subType.\n//         zrUtil.extend(this, extraOpt);\n\n//         this.uid = componentUtil.getUID('componentModel');\n\n//         // this.setReadOnly([\n//         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',\n//         //     'dependentModels', 'componentIndex'\n//         // ]);\n//     }\n// );\n\n// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.\nenableClassManagement(\n    ComponentModel, {registerWhenExtend: true}\n);\ncomponentUtil.enableSubTypeDefaulter(ComponentModel);\n\n// Add capability of ComponentModel.topologicalTravel.\ncomponentUtil.enableTopologicalTravel(ComponentModel, getDependencies);\n\nfunction getDependencies(componentType) {\n    var deps = [];\n    zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {\n        deps = deps.concat(Clazz.prototype.dependencies || []);\n    });\n\n    // Ensure main type.\n    deps = zrUtil.map(deps, function (type) {\n        return parseClassType(type).main;\n    });\n\n    // Hack dataset for convenience.\n    if (componentType !== 'dataset' && zrUtil.indexOf(deps, 'dataset') <= 0) {\n        deps.unshift('dataset');\n    }\n\n    return deps;\n}\n\nzrUtil.mixin(ComponentModel, boxLayoutMixin);\n\nexport default ComponentModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nvar platform = '';\n// Navigator not exists in node\nif (typeof navigator !== 'undefined') {\n    platform = navigator.platform || '';\n}\n\nexport default {\n    // backgroundColor: 'rgba(0,0,0,0)',\n\n    // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization\n    // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],\n    // Light colors:\n    // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],\n    // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],\n    // Dark colors:\n    color: [\n        '#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83',\n        '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3'\n    ],\n\n    gradientColor: ['#f6efa6', '#d88273', '#bf444c'],\n\n    // If xAxis and yAxis declared, grid is created by default.\n    // grid: {},\n\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\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\n    animation: 'auto',\n    animationDuration: 1000,\n    animationDurationUpdate: 300,\n    animationEasing: 'exponentialOut',\n    animationEasingUpdate: 'cubicOut',\n\n    animationThreshold: 2000,\n    // Configuration for progressive/incremental rendering\n    progressiveThreshold: 3000,\n    progressive: 400,\n\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\n    // See: module:echarts/scale/Time\n    useUTC: false\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {makeInner, normalizeToArray} from '../../util/model';\n\nvar inner = makeInner();\n\nfunction getNearestColorPalette(colors, requestColorNum) {\n    var paletteNum = colors.length;\n    // TODO colors must be in order\n    for (var i = 0; i < paletteNum; i++) {\n        if (colors[i].length > requestColorNum) {\n            return colors[i];\n        }\n    }\n    return colors[paletteNum - 1];\n}\n\nexport default {\n    clearColorPalette: function () {\n        inner(this).colorIdx = 0;\n        inner(this).colorNameMap = {};\n    },\n\n    /**\n     * @param {string} name MUST NOT be null/undefined. Otherwise call this function\n     *                 twise with the same parameters will get different result.\n     * @param {Object} [scope=this]\n     * @param {Object} [requestColorNum]\n     * @return {string} color string.\n     */\n    getColorFromPalette: function (name, scope, requestColorNum) {\n        scope = scope || this;\n        var scopeFields = inner(scope);\n        var colorIdx = scopeFields.colorIdx || 0;\n        var colorNameMap = scopeFields.colorNameMap = scopeFields.colorNameMap || {};\n        // Use `hasOwnProperty` to avoid conflict with Object.prototype.\n        if (colorNameMap.hasOwnProperty(name)) {\n            return colorNameMap[name];\n        }\n        var defaultColorPalette = normalizeToArray(this.get('color', true));\n        var layeredColorPalette = this.get('colorLayer', true);\n        var colorPalette = ((requestColorNum == null || !layeredColorPalette)\n            ? defaultColorPalette : getNearestColorPalette(layeredColorPalette, requestColorNum));\n\n        // In case can't find in layered color palette.\n        colorPalette = colorPalette || defaultColorPalette;\n\n        if (!colorPalette || !colorPalette.length) {\n            return;\n        }\n\n        var color = colorPalette[colorIdx];\n        if (name) {\n            colorNameMap[name] = color;\n        }\n        scopeFields.colorIdx = (colorIdx + 1) % colorPalette.length;\n\n        return color;\n    }\n};\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Helper for model references.\n * There are many manners to refer axis/coordSys.\n */\n\n// TODO\n// merge relevant logic to this file?\n// check: \"modelHelper\" of tooltip and \"BrushTargetManager\".\n\nimport {__DEV__} from '../config';\nimport {createHashMap, retrieve, each} from 'zrender/src/core/util';\n\n/**\n * @return {Object} 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 *     // It also indicate that whether there is category axis.\n *     firstCategoryDimIndex: 1,\n *     // To replace user specified encode.\n * }\n */\nexport function getCoordSysDefineBySeries(seriesModel) {\n    var coordSysName = seriesModel.get('coordinateSystem');\n    var result = {\n        coordSysName: coordSysName,\n        coordSysDims: [],\n        axisMap: createHashMap(),\n        categoryAxisMap: createHashMap()\n    };\n    var fetch = fetchers[coordSysName];\n    if (fetch) {\n        fetch(seriesModel, result, result.axisMap, result.categoryAxisMap);\n        return result;\n    }\n}\n\nvar fetchers = {\n\n    cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var xAxisModel = seriesModel.getReferringComponents('xAxis')[0];\n        var yAxisModel = seriesModel.getReferringComponents('yAxis')[0];\n\n        if (__DEV__) {\n            if (!xAxisModel) {\n                throw new Error('xAxis \"' + retrieve(\n                    seriesModel.get('xAxisIndex'),\n                    seriesModel.get('xAxisId'),\n                    0\n                ) + '\" not found');\n            }\n            if (!yAxisModel) {\n                throw new Error('yAxis \"' + retrieve(\n                    seriesModel.get('xAxisIndex'),\n                    seriesModel.get('yAxisId'),\n                    0\n                ) + '\" not found');\n            }\n        }\n\n        result.coordSysDims = ['x', 'y'];\n        axisMap.set('x', xAxisModel);\n        axisMap.set('y', yAxisModel);\n\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 = 1;\n        }\n    },\n\n    singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var singleAxisModel = seriesModel.getReferringComponents('singleAxis')[0];\n\n        if (__DEV__) {\n            if (!singleAxisModel) {\n                throw new Error('singleAxis should be specified.');\n            }\n        }\n\n        result.coordSysDims = ['single'];\n        axisMap.set('single', singleAxisModel);\n\n        if (isCategory(singleAxisModel)) {\n            categoryAxisMap.set('single', singleAxisModel);\n            result.firstCategoryDimIndex = 0;\n        }\n    },\n\n    polar: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var polarModel = seriesModel.getReferringComponents('polar')[0];\n        var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n        var angleAxisModel = polarModel.findAxisModel('angleAxis');\n\n        if (__DEV__) {\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\n        result.coordSysDims = ['radius', 'angle'];\n        axisMap.set('radius', radiusAxisModel);\n        axisMap.set('angle', angleAxisModel);\n\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 = 1;\n        }\n    },\n\n    geo: function (seriesModel, result, axisMap, categoryAxisMap) {\n        result.coordSysDims = ['lng', 'lat'];\n    },\n\n    parallel: function (seriesModel, result, axisMap, categoryAxisMap) {\n        var ecModel = seriesModel.ecModel;\n        var parallelModel = ecModel.getComponent(\n            'parallel', seriesModel.get('parallelIndex')\n        );\n        var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice();\n\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\n            if (isCategory(axisModel) && result.firstCategoryDimIndex == null) {\n                categoryAxisMap.set(axisDim, axisModel);\n                result.firstCategoryDimIndex = index;\n            }\n        });\n    }\n};\n\nfunction isCategory(axisModel) {\n    return axisModel.get('type') === 'category';\n}\n\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Avoid typo.\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_UNKNOWN = 'unknown';\n// ??? CHANGE A NAME\nexport var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray';\n\nexport var SERIES_LAYOUT_BY_COLUMN = 'column';\nexport var SERIES_LAYOUT_BY_ROW = 'row';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {createHashMap, isTypedArray} from 'zrender/src/core/util';\nimport {enableClassCheck} from '../util/clazz';\nimport {\n    SOURCE_FORMAT_ORIGINAL,\n    SERIES_LAYOUT_BY_COLUMN,\n    SOURCE_FORMAT_UNKNOWN,\n    SOURCE_FORMAT_TYPED_ARRAY,\n    SOURCE_FORMAT_KEYED_COLUMNS\n} from './helper/sourceType';\n\n/**\n * [sourceFormat]\n *\n * + \"original\":\n * This format is only used in series.data, where\n * itemStyle can be specified in data item.\n *\n * + \"arrayRows\":\n * [\n *     ['product', 'score', 'amount'],\n *     ['Matcha Latte', 89.3, 95.8],\n *     ['Milk Tea', 92.1, 89.4],\n *     ['Cheese Cocoa', 94.4, 91.2],\n *     ['Walnut Brownie', 85.4, 76.9]\n * ]\n *\n * + \"objectRows\":\n * [\n *     {product: 'Matcha Latte', score: 89.3, amount: 95.8},\n *     {product: 'Milk Tea', score: 92.1, amount: 89.4},\n *     {product: 'Cheese Cocoa', score: 94.4, amount: 91.2},\n *     {product: 'Walnut Brownie', score: 85.4, amount: 76.9}\n * ]\n *\n * + \"keyedColumns\":\n * {\n *     'product': ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'],\n *     'count': [823, 235, 1042, 988],\n *     'score': [95.8, 81.4, 91.2, 76.9]\n * }\n *\n * + \"typedArray\"\n *\n * + \"unknown\"\n */\n\n/**\n * @constructor\n * @param {Object} fields\n * @param {string} fields.sourceFormat\n * @param {Array|Object} fields.fromDataset\n * @param {Array|Object} [fields.data]\n * @param {string} [seriesLayoutBy='column']\n * @param {Array.<Object|string>} [dimensionsDefine]\n * @param {Objet|HashMap} [encodeDefine]\n * @param {number} [startIndex=0]\n * @param {number} [dimensionsDetectCount]\n */\nfunction Source(fields) {\n\n    /**\n     * @type {boolean}\n     */\n    this.fromDataset = fields.fromDataset;\n\n    /**\n     * Not null/undefined.\n     * @type {Array|Object}\n     */\n    this.data = fields.data || (\n        fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []\n    );\n\n    /**\n     * See also \"detectSourceFormat\".\n     * Not null/undefined.\n     * @type {string}\n     */\n    this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN;\n\n    /**\n     * 'row' or 'column'\n     * Not null/undefined.\n     * @type {string} seriesLayoutBy\n     */\n    this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN;\n\n    /**\n     * dimensions definition in option.\n     * can be null/undefined.\n     * @type {Array.<Object|string>}\n     */\n    this.dimensionsDefine = fields.dimensionsDefine;\n\n    /**\n     * encode definition in option.\n     * can be null/undefined.\n     * @type {Objet|HashMap}\n     */\n    this.encodeDefine = fields.encodeDefine && createHashMap(fields.encodeDefine);\n\n    /**\n     * Not null/undefined, uint.\n     * @type {number}\n     */\n    this.startIndex = fields.startIndex || 0;\n\n    /**\n     * Can be null/undefined (when unknown), uint.\n     * @type {number}\n     */\n    this.dimensionsDetectCount = fields.dimensionsDetectCount;\n}\n\n/**\n * Wrap original series data for some compatibility cases.\n */\nSource.seriesDataToSource = function (data) {\n    return new Source({\n        data: data,\n        sourceFormat: isTypedArray(data)\n            ? SOURCE_FORMAT_TYPED_ARRAY\n            : SOURCE_FORMAT_ORIGINAL,\n        fromDataset: false\n    });\n};\n\nenableClassCheck(Source);\n\nexport default Source;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport {makeInner, getDataItemValue} from '../../util/model';\nimport {getCoordSysDefineBySeries} from '../../model/referHelper';\nimport {\n    createHashMap,\n    each,\n    map,\n    isArray,\n    isString,\n    isObject,\n    isTypedArray,\n    isArrayLike,\n    extend,\n    assert\n} from 'zrender/src/core/util';\nimport Source from '../Source';\n\nimport {\n    SOURCE_FORMAT_ORIGINAL,\n    SOURCE_FORMAT_ARRAY_ROWS,\n    SOURCE_FORMAT_OBJECT_ROWS,\n    SOURCE_FORMAT_KEYED_COLUMNS,\n    SOURCE_FORMAT_UNKNOWN,\n    SOURCE_FORMAT_TYPED_ARRAY,\n    SERIES_LAYOUT_BY_ROW\n} from './sourceType';\n\n\nvar inner = makeInner();\n\n/**\n * @see {module:echarts/data/Source}\n * @param {module:echarts/component/dataset/DatasetModel} datasetModel\n * @return {string} sourceFormat\n */\nexport function detectSourceFormat(datasetModel) {\n    var data = datasetModel.option.source;\n    var sourceFormat = SOURCE_FORMAT_UNKNOWN;\n\n    if (isTypedArray(data)) {\n        sourceFormat = SOURCE_FORMAT_TYPED_ARRAY;\n    }\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\n        for (var i = 0, len = data.length; i < len; i++) {\n            var item = data[i];\n\n            if (item == null) {\n                continue;\n            }\n            else if (isArray(item)) {\n                sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;\n                break;\n            }\n            else if (isObject(item)) {\n                sourceFormat = SOURCE_FORMAT_OBJECT_ROWS;\n                break;\n            }\n        }\n    }\n    else if (isObject(data)) {\n        for (var key in data) {\n            if (data.hasOwnProperty(key) && isArrayLike(data[key])) {\n                sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS;\n                break;\n            }\n        }\n    }\n    else if (data != null) {\n        throw new Error('Invalid data');\n    }\n\n    inner(datasetModel).sourceFormat = sourceFormat;\n}\n\n/**\n * [Scenarios]:\n * (1) Provide source data directly:\n *     series: {\n *         encode: {...},\n *         dimensions: [...]\n *         seriesLayoutBy: 'row',\n *         data: [[...]]\n *     }\n * (2) Refer to datasetModel.\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 * Get data from series itself or datset.\n * @return {module:echarts/data/Source} source\n */\nexport function getSource(seriesModel) {\n    return inner(seriesModel).source;\n}\n\n/**\n * MUST be called before mergeOption of all series.\n * @param {module:echarts/model/Global} ecModel\n */\nexport function resetSourceDefaulter(ecModel) {\n    // `datasetMap` is used to make default encode.\n    inner(ecModel).datasetMap = createHashMap();\n}\n\n/**\n * [Caution]:\n * MUST be called after series option merged and\n * before \"series.getInitailData()\" called.\n *\n * [The rule of making default encode]:\n * Category axis (if exists) alway map to the first dimension.\n * Each other axis occupies a subsequent dimension.\n *\n * [Why make default encode]:\n * Simplify the typing of encode in option, avoiding the case like that:\n * series: [{encode: {x: 0, y: 1}}, {encode: {x: 0, y: 2}}, {encode: {x: 0, y: 3}}],\n * where the \"y\" have to be manually typed as \"1, 2, 3, ...\".\n *\n * @param {module:echarts/model/Series} seriesModel\n */\nexport function prepareSource(seriesModel) {\n    var seriesOption = seriesModel.option;\n\n    var data = seriesOption.data;\n    var sourceFormat = isTypedArray(data)\n        ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL;\n    var fromDataset = false;\n\n    var seriesLayoutBy = seriesOption.seriesLayoutBy;\n    var sourceHeader = seriesOption.sourceHeader;\n    var dimensionsDefine = seriesOption.dimensions;\n\n    var datasetModel = getDatasetModel(seriesModel);\n    if (datasetModel) {\n        var datasetOption = datasetModel.option;\n\n        data = datasetOption.source;\n        sourceFormat = inner(datasetModel).sourceFormat;\n        fromDataset = true;\n\n        // These settings from series has higher priority.\n        seriesLayoutBy = seriesLayoutBy || datasetOption.seriesLayoutBy;\n        sourceHeader == null && (sourceHeader = datasetOption.sourceHeader);\n        dimensionsDefine = dimensionsDefine || datasetOption.dimensions;\n    }\n\n    var completeResult = completeBySourceData(\n        data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine\n    );\n\n    // Note: dataset option does not have `encode`.\n    var encodeDefine = seriesOption.encode;\n    if (!encodeDefine && datasetModel) {\n        encodeDefine = makeDefaultEncode(\n            seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult\n        );\n    }\n\n    inner(seriesModel).source = new Source({\n        data: data,\n        fromDataset: fromDataset,\n        seriesLayoutBy: seriesLayoutBy,\n        sourceFormat: sourceFormat,\n        dimensionsDefine: completeResult.dimensionsDefine,\n        startIndex: completeResult.startIndex,\n        dimensionsDetectCount: completeResult.dimensionsDetectCount,\n        encodeDefine: encodeDefine\n    });\n}\n\n// return {startIndex, dimensionsDefine, dimensionsCount}\nfunction completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine) {\n    if (!data) {\n        return {dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine)};\n    }\n\n    var dimensionsDetectCount;\n    var startIndex;\n    var findPotentialName;\n\n    if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\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                    }\n                    else {\n                        startIndex = 0;\n                    }\n                }\n            // 10 is an experience number, avoid long loop.\n            }, seriesLayoutBy, data, 10);\n        }\n        else {\n            startIndex = sourceHeader ? 1 : 0;\n        }\n\n        if (!dimensionsDefine && startIndex === 1) {\n            dimensionsDefine = [];\n            arrayRowsTravelFirst(function (val, index) {\n                dimensionsDefine[index] = val != null ? val : '';\n            }, seriesLayoutBy, data);\n        }\n\n        dimensionsDetectCount = dimensionsDefine\n            ? dimensionsDefine.length\n            : seriesLayoutBy === SERIES_LAYOUT_BY_ROW\n            ? data.length\n            : data[0]\n            ? data[0].length\n            : null;\n    }\n    else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n        if (!dimensionsDefine) {\n            dimensionsDefine = objectRowsCollectDimensions(data);\n            findPotentialName = true;\n        }\n    }\n    else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n        if (!dimensionsDefine) {\n            dimensionsDefine = [];\n            findPotentialName = true;\n            each(data, function (colArr, key) {\n                dimensionsDefine.push(key);\n            });\n        }\n    }\n    else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        var value0 = getDataItemValue(data[0]);\n        dimensionsDetectCount = isArray(value0) && value0.length || 1;\n    }\n    else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n        if (__DEV__) {\n            assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.');\n        }\n    }\n\n    var potentialNameDimIndex;\n    if (findPotentialName) {\n        each(dimensionsDefine, function (dim, idx) {\n            if ((isObject(dim) ? dim.name : dim) === 'name') {\n                potentialNameDimIndex = idx;\n            }\n        });\n    }\n\n    return {\n        startIndex: startIndex,\n        dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine),\n        dimensionsDetectCount: dimensionsDetectCount,\n        potentialNameDimIndex: potentialNameDimIndex\n        // TODO: potentialIdDimIdx\n    };\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/undefiend or string.\nfunction normalizeDimensionsDefine(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 (item, index) {\n        item = extend({}, isObject(item) ? item : {name: item});\n\n        // User can set null in dimensions.\n        // We dont auto specify name, othewise a given name may\n        // cause it be refered unexpectedly.\n        if (item.name == null) {\n            return item;\n        }\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\n        var exist = nameMap.get(item.name);\n        if (!exist) {\n            nameMap.set(item.name, {count: 1});\n        }\n        else {\n            item.name += '-' + exist.count++;\n        }\n\n        return item;\n    });\n}\n\nfunction arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) {\n    maxLoop == null && (maxLoop = Infinity);\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    }\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}\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        var dimensions = [];\n        each(obj, function (value, key) {\n            dimensions.push(key);\n        });\n        return dimensions;\n    }\n}\n\n// ??? TODO merge to completedimensions, where also has\n// default encode making logic. And the default rule\n// should depends on series? consider 'map'.\nfunction makeDefaultEncode(\n    seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult\n) {\n    var coordSysDefine = getCoordSysDefineBySeries(seriesModel);\n    var encode = {};\n    // var encodeTooltip = [];\n    // var encodeLabel = [];\n    var encodeItemName = [];\n    var encodeSeriesName = [];\n    var seriesType = seriesModel.subType;\n\n    // ??? TODO refactor: provide by series itself.\n    // Consider the case: 'map' series is based on geo coordSys,\n    // 'graph', 'heatmap' can be based on cartesian. But can not\n    // give default rule simply here.\n    var nSeriesMap = createHashMap(['pie', 'map', 'funnel']);\n    var cSeriesMap = createHashMap([\n        'line', 'bar', 'pictorialBar', 'scatter', 'effectScatter', 'candlestick', 'boxplot'\n    ]);\n\n    // Usually in this case series will use the first data\n    // dimension as the \"value\" dimension, or other default\n    // processes respectively.\n    if (coordSysDefine && cSeriesMap.get(seriesType) != null) {\n        var ecModel = seriesModel.ecModel;\n        var datasetMap = inner(ecModel).datasetMap;\n        var key = datasetModel.uid + '_' + seriesLayoutBy;\n        var datasetRecord = datasetMap.get(key)\n            || datasetMap.set(key, {categoryWayDim: 1, valueWayDim: 0});\n\n        // TODO\n        // Auto detect first time axis and do arrangement.\n        each(coordSysDefine.coordSysDims, function (coordDim) {\n            // In value way.\n            if (coordSysDefine.firstCategoryDimIndex == null) {\n                var dataDim = datasetRecord.valueWayDim++;\n                encode[coordDim] = dataDim;\n\n                // ??? TODO give a better default series name rule?\n                // especially when encode x y specified.\n                // consider: when mutiple series share one dimension\n                // category axis, series name should better use\n                // the other dimsion name. On the other hand, use\n                // both dimensions name.\n\n                encodeSeriesName.push(dataDim);\n                // encodeTooltip.push(dataDim);\n                // encodeLabel.push(dataDim);\n            }\n            // In category way, category axis.\n            else if (coordSysDefine.categoryAxisMap.get(coordDim)) {\n                encode[coordDim] = 0;\n                encodeItemName.push(0);\n            }\n            // In category way, non-category axis.\n            else {\n                var dataDim = datasetRecord.categoryWayDim++;\n                encode[coordDim] = dataDim;\n                // encodeTooltip.push(dataDim);\n                // encodeLabel.push(dataDim);\n                encodeSeriesName.push(dataDim);\n            }\n        });\n    }\n    // Do not make a complex rule! Hard to code maintain and not necessary.\n    // ??? TODO refactor: provide by series itself.\n    // [{name: ..., value: ...}, ...] like:\n    else if (nSeriesMap.get(seriesType) != null) {\n        // Find the first not ordinal. (5 is an experience value)\n        var firstNotOrdinal;\n        for (var i = 0; i < 5 && firstNotOrdinal == null; i++) {\n            if (!doGuessOrdinal(\n                data, sourceFormat, seriesLayoutBy,\n                completeResult.dimensionsDefine, completeResult.startIndex, i\n            )) {\n                firstNotOrdinal = i;\n            }\n        }\n        if (firstNotOrdinal != null) {\n            encode.value = firstNotOrdinal;\n            var nameDimIndex = completeResult.potentialNameDimIndex\n                || Math.max(firstNotOrdinal - 1, 0);\n            // By default, label use itemName in charts.\n            // So we dont set encodeLabel here.\n            encodeSeriesName.push(nameDimIndex);\n            encodeItemName.push(nameDimIndex);\n            // encodeTooltip.push(firstNotOrdinal);\n        }\n    }\n\n    // encodeTooltip.length && (encode.tooltip = encodeTooltip);\n    // encodeLabel.length && (encode.label = encodeLabel);\n    encodeItemName.length && (encode.itemName = encodeItemName);\n    encodeSeriesName.length && (encode.seriesName = encodeSeriesName);\n\n    return encode;\n}\n\n/**\n * If return null/undefined, indicate that should not use datasetModel.\n */\nfunction getDatasetModel(seriesModel) {\n    var option = seriesModel.option;\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 = option.data;\n    if (!thisData) {\n        return seriesModel.ecModel.getComponent('dataset', option.datasetIndex || 0);\n    }\n}\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 *\n * @param {module:echars/data/Source} source\n * @param {number} dimIndex\n * @return {boolean} Whether ordinal.\n */\nexport function guessOrdinal(source, dimIndex) {\n    return doGuessOrdinal(\n        source.data,\n        source.sourceFormat,\n        source.seriesLayoutBy,\n        source.dimensionsDefine,\n        source.startIndex,\n        dimIndex\n    );\n}\n\n// dimIndex may be overflow source data.\nfunction doGuessOrdinal(\n    data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex\n) {\n    var result;\n    // Experience value.\n    var maxLoop = 5;\n\n    if (isTypedArray(data)) {\n        return false;\n    }\n\n    // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine\n    // always exists in source.\n    var dimName;\n    if (dimensionsDefine) {\n        dimName = dimensionsDefine[dimIndex];\n        dimName = isObject(dimName) ? dimName.name : dimName;\n    }\n\n    if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n        if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {\n            var sample = data[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        }\n        else {\n            for (var i = 0; i < data.length && i < maxLoop; i++) {\n                var row = data[startIndex + i];\n                if (row && (result = detectValue(row[dimIndex])) != null) {\n                    return result;\n                }\n            }\n        }\n    }\n    else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n        if (!dimName) {\n            return;\n        }\n        for (var i = 0; i < data.length && i < maxLoop; i++) {\n            var item = data[i];\n            if (item && (result = detectValue(item[dimName])) != null) {\n                return result;\n            }\n        }\n    }\n    else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n        if (!dimName) {\n            return;\n        }\n        var sample = data[dimName];\n        if (!sample || isTypedArray(sample)) {\n            return false;\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    }\n    else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        for (var i = 0; i < data.length && i < maxLoop; i++) {\n            var item = data[i];\n            var val = getDataItemValue(item);\n            if (!isArray(val)) {\n                return false;\n            }\n            if ((result = detectValue(val[dimIndex])) != null) {\n                return result;\n            }\n        }\n    }\n\n    function detectValue(val) {\n        // Consider usage convenience, '1', '2' will be treated as \"number\".\n        // `isFinit('')` get `true`.\n        if (val != null && isFinite(val) && val !== '') {\n            return false;\n        }\n        else if (isString(val) && val !== '-') {\n            return true;\n        }\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 * ECharts global model\n *\n * @module {echarts/model/Global}\n */\n\n\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) `reset` feature (in toolbox). Find detailed info in comments about\n * `mergeOption` in module:echarts/model/OptionManager.\n */\n\nimport {__DEV__} from '../config';\nimport {\n    each, filter, map, isArray, indexOf, isObject, isString,\n    createHashMap, assert, clone, merge, extend, mixin\n} from 'zrender/src/core/util';\nimport * as modelUtil from '../util/model';\nimport Model from './Model';\nimport ComponentModel from './Component';\nimport globalDefault from './globalDefault';\nimport colorPaletteMixin from './mixin/colorPalette';\nimport {resetSourceDefaulter} from '../data/helper/sourceHelper';\n\nvar OPTION_INNER_KEY = '\\0_ec_inner';\n\n/**\n * @alias module:echarts/model/Global\n *\n * @param {Object} option\n * @param {module:echarts/model/Model} parentModel\n * @param {Object} theme\n */\nvar GlobalModel = Model.extend({\n\n    init: function (option, parentModel, theme, optionManager) {\n        theme = theme || {};\n\n        this.option = null; // Mark as not initialized.\n\n        /**\n         * @type {module:echarts/model/Model}\n         * @private\n         */\n        this._theme = new Model(theme);\n\n        /**\n         * @type {module:echarts/model/OptionManager}\n         */\n        this._optionManager = optionManager;\n    },\n\n    setOption: function (option, optionPreprocessorFuncs) {\n        assert(\n            !(OPTION_INNER_KEY in option),\n            'please use chart.getOption()'\n        );\n\n        this._optionManager.setOption(option, optionPreprocessorFuncs);\n\n        this.resetOption(null);\n    },\n\n    /**\n     * @param {string} 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 {boolean} Whether option changed.\n     */\n    resetOption: function (type) {\n        var optionChanged = false;\n        var optionManager = this._optionManager;\n\n        if (!type || type === 'recreate') {\n            var baseOption = optionManager.mountOption(type === 'recreate');\n\n            if (!this.option || type === 'recreate') {\n                initBase.call(this, baseOption);\n            }\n            else {\n                this.restoreData();\n                this.mergeOption(baseOption);\n            }\n            optionChanged = true;\n        }\n\n        if (type === 'timeline' || type === 'media') {\n            this.restoreData();\n        }\n\n        if (!type || type === 'recreate' || type === 'timeline') {\n            var timelineOption = optionManager.getTimelineOption(this);\n            timelineOption && (this.mergeOption(timelineOption), optionChanged = true);\n        }\n\n        if (!type || type === 'recreate' || type === 'media') {\n            var mediaOptions = optionManager.getMediaOption(this, this._api);\n            if (mediaOptions.length) {\n                each(mediaOptions, function (mediaOption) {\n                    this.mergeOption(mediaOption, optionChanged = true);\n                }, this);\n            }\n        }\n\n        return optionChanged;\n    },\n\n    /**\n     * @protected\n     */\n    mergeOption: function (newOption) {\n        var option = this.option;\n        var componentsMap = this._componentsMap;\n        var newCptTypes = [];\n\n        resetSourceDefaulter(this);\n\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\n            if (!ComponentModel.hasClass(mainType)) {\n                // globalSettingTask.dirty();\n                option[mainType] = option[mainType] == null\n                    ? clone(componentOption)\n                    : merge(option[mainType], componentOption, true);\n            }\n            else if (mainType) {\n                newCptTypes.push(mainType);\n            }\n        });\n\n        ComponentModel.topologicalTravel(\n            newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this\n        );\n\n        function visitComponent(mainType, dependencies) {\n\n            var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);\n\n            var mapResult = modelUtil.mappingToExists(\n                componentsMap.get(mainType), newCptOptionList\n            );\n\n            modelUtil.makeIdAndName(mapResult);\n\n            // Set mainType and complete subType.\n            each(mapResult, function (item, index) {\n                var opt = item.option;\n                if (isObject(opt)) {\n                    item.keyInfo.mainType = mainType;\n                    item.keyInfo.subType = determineSubType(mainType, opt, item.exist);\n                }\n            });\n\n            var dependentModels = getComponentsByTypes(\n                componentsMap, dependencies\n            );\n\n            option[mainType] = [];\n            componentsMap.set(mainType, []);\n\n            each(mapResult, function (resultItem, index) {\n                var componentModel = resultItem.exist;\n                var newCptOption = resultItem.option;\n\n                assert(\n                    isObject(newCptOption) || componentModel,\n                    'Empty component definition'\n                );\n\n                // Consider where is no new option and should be merged using {},\n                // see removeEdgeAndAdd in topologicalTravel and\n                // ComponentModel.getAllClassMainTypes.\n                if (!newCptOption) {\n                    componentModel.mergeOption({}, this);\n                    componentModel.optionUpdated({}, false);\n                }\n                else {\n                    var ComponentModelClass = ComponentModel.getClass(\n                        mainType, resultItem.keyInfo.subType, true\n                    );\n\n                    if (componentModel && componentModel instanceof ComponentModelClass) {\n                        componentModel.name = resultItem.keyInfo.name;\n                        // componentModel.settingTask && componentModel.settingTask.dirty();\n                        componentModel.mergeOption(newCptOption, this);\n                        componentModel.optionUpdated(newCptOption, false);\n                    }\n                    else {\n                        // PENDING Global as parent ?\n                        var extraOpt = extend(\n                            {\n                                dependentModels: dependentModels,\n                                componentIndex: index\n                            },\n                            resultItem.keyInfo\n                        );\n                        componentModel = new ComponentModelClass(\n                            newCptOption, this, this, extraOpt\n                        );\n                        extend(componentModel, extraOpt);\n                        componentModel.init(newCptOption, this, this, extraOpt);\n\n                        // Call optionUpdated after init.\n                        // newCptOption 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\n                componentsMap.get(mainType)[index] = componentModel;\n                option[mainType][index] = componentModel.option;\n            }, this);\n\n            // Backup series for filtering.\n            if (mainType === 'series') {\n                createSeriesIndices(this, componentsMap.get('series'));\n            }\n        }\n\n        this._seriesIndicesMap = createHashMap(\n            this._seriesIndices = this._seriesIndices || []\n        );\n    },\n\n    /**\n     * Get option for output (cloned option and inner info removed)\n     * @public\n     * @return {Object}\n     */\n    getOption: function () {\n        var option = clone(this.option);\n\n        each(option, function (opts, mainType) {\n            if (ComponentModel.hasClass(mainType)) {\n                var opts = modelUtil.normalizeToArray(opts);\n                for (var i = opts.length - 1; i >= 0; i--) {\n                    // Remove options with inner id.\n                    if (modelUtil.isIdInner(opts[i])) {\n                        opts.splice(i, 1);\n                    }\n                }\n                option[mainType] = opts;\n            }\n        });\n\n        delete option[OPTION_INNER_KEY];\n\n        return option;\n    },\n\n    /**\n     * @return {module:echarts/model/Model}\n     */\n    getTheme: function () {\n        return this._theme;\n    },\n\n    /**\n     * @param {string} mainType\n     * @param {number} [idx=0]\n     * @return {module:echarts/model/Component}\n     */\n    getComponent: function (mainType, idx) {\n        var list = this._componentsMap.get(mainType);\n        if (list) {\n            return list[idx || 0];\n        }\n    },\n\n    /**\n     * If none of index and id and name used, return all components with mainType.\n     * @param {Object} condition\n     * @param {string} condition.mainType\n     * @param {string} [condition.subType] If ignore, only query by mainType\n     * @param {number|Array.<number>} [condition.index] Either input index or id or name.\n     * @param {string|Array.<string>} [condition.id] Either input index or id or name.\n     * @param {string|Array.<string>} [condition.name] Either input index or id or name.\n     * @return {Array.<module:echarts/model/Component>}\n     */\n    queryComponents: function (condition) {\n        var mainType = condition.mainType;\n        if (!mainType) {\n            return [];\n        }\n\n        var index = condition.index;\n        var id = condition.id;\n        var name = condition.name;\n\n        var cpts = this._componentsMap.get(mainType);\n\n        if (!cpts || !cpts.length) {\n            return [];\n        }\n\n        var result;\n\n        if (index != null) {\n            if (!isArray(index)) {\n                index = [index];\n            }\n            result = filter(map(index, function (idx) {\n                return cpts[idx];\n            }), function (val) {\n                return !!val;\n            });\n        }\n        else if (id != null) {\n            var isIdArray = isArray(id);\n            result = filter(cpts, function (cpt) {\n                return (isIdArray && indexOf(id, cpt.id) >= 0)\n                    || (!isIdArray && cpt.id === id);\n            });\n        }\n        else if (name != null) {\n            var isNameArray = isArray(name);\n            result = filter(cpts, function (cpt) {\n                return (isNameArray && indexOf(name, cpt.name) >= 0)\n                    || (!isNameArray && cpt.name === name);\n            });\n        }\n        else {\n            // Return all components with mainType\n            result = cpts.slice();\n        }\n\n        return filterBySubType(result, condition);\n    },\n\n    /**\n     * The interface is different from queryComponents,\n     * which is convenient for inner usage.\n     *\n     * @usage\n     * var result = findComponents(\n     *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}\n     * );\n     * var result = findComponents(\n     *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}\n     * );\n     * var result = findComponents(\n     *     {mainType: 'series'},\n     *     function (model, index) {...}\n     * );\n     * // result like [component0, componnet1, ...]\n     *\n     * @param {Object} condition\n     * @param {string} condition.mainType Mandatory.\n     * @param {string} [condition.subType] Optional.\n     * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName},\n     *        where xxx is mainType.\n     *        If query attribute is null/undefined or has no index/id/name,\n     *        do not filtering by query conditions, which is convenient for\n     *        no-payload situations or when target of action is global.\n     * @param {Function} [condition.filter] parameter: component, return boolean.\n     * @return {Array.<module:echarts/model/Component>}\n     */\n    findComponents: function (condition) {\n        var query = condition.query;\n        var mainType = condition.mainType;\n\n        var queryCond = getQueryCond(query);\n        var result = queryCond\n            ? this.queryComponents(queryCond)\n            : this._componentsMap.get(mainType);\n\n        return doFilter(filterBySubType(result, condition));\n\n        function getQueryCond(q) {\n            var indexAttr = mainType + 'Index';\n            var idAttr = mainType + 'Id';\n            var nameAttr = mainType + 'Name';\n            return q && (\n                    q[indexAttr] != null\n                    || q[idAttr] != null\n                    || q[nameAttr] != null\n                )\n                ? {\n                    mainType: mainType,\n                    // subType will be filtered finally.\n                    index: q[indexAttr],\n                    id: q[idAttr],\n                    name: q[nameAttr]\n                }\n                : null;\n        }\n\n        function doFilter(res) {\n            return condition.filter\n                    ? filter(res, condition.filter)\n                    : res;\n        }\n    },\n\n    /**\n     * @usage\n     * eachComponent('legend', function (legendModel, index) {\n     *     ...\n     * });\n     * eachComponent(function (componentType, model, index) {\n     *     // componentType does not include subType\n     *     // (componentType is 'xxx' but not 'xxx.aa')\n     * });\n     * eachComponent(\n     *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}},\n     *     function (model, index) {...}\n     * );\n     * eachComponent(\n     *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}},\n     *     function (model, index) {...}\n     * );\n     *\n     * @param {string|Object=} mainType When mainType is object, the definition\n     *                                  is the same as the method 'findComponents'.\n     * @param {Function} cb\n     * @param {*} context\n     */\n    eachComponent: function (mainType, cb, context) {\n        var componentsMap = this._componentsMap;\n\n        if (typeof mainType === 'function') {\n            context = cb;\n            cb = mainType;\n            componentsMap.each(function (components, componentType) {\n                each(components, function (component, index) {\n                    cb.call(context, componentType, component, index);\n                });\n            });\n        }\n        else if (isString(mainType)) {\n            each(componentsMap.get(mainType), cb, context);\n        }\n        else if (isObject(mainType)) {\n            var queryResult = this.findComponents(mainType);\n            each(queryResult, cb, context);\n        }\n    },\n\n    /**\n     * @param {string} name\n     * @return {Array.<module:echarts/model/Series>}\n     */\n    getSeriesByName: function (name) {\n        var series = this._componentsMap.get('series');\n        return filter(series, function (oneSeries) {\n            return oneSeries.name === name;\n        });\n    },\n\n    /**\n     * @param {number} seriesIndex\n     * @return {module:echarts/model/Series}\n     */\n    getSeriesByIndex: function (seriesIndex) {\n        return this._componentsMap.get('series')[seriesIndex];\n    },\n\n    /**\n     * Get series list before filtered by type.\n     * FIXME: rename to getRawSeriesByType?\n     *\n     * @param {string} subType\n     * @return {Array.<module:echarts/model/Series>}\n     */\n    getSeriesByType: function (subType) {\n        var series = this._componentsMap.get('series');\n        return filter(series, function (oneSeries) {\n            return oneSeries.subType === subType;\n        });\n    },\n\n    /**\n     * @return {Array.<module:echarts/model/Series>}\n     */\n    getSeries: function () {\n        return this._componentsMap.get('series').slice();\n    },\n\n    /**\n     * @return {number}\n     */\n    getSeriesCount: function () {\n        return this._componentsMap.get('series').length;\n    },\n\n    /**\n     * After filtering, series may be different\n     * frome raw series.\n     *\n     * @param {Function} cb\n     * @param {*} context\n     */\n    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    /**\n     * Iterate raw series before filtered.\n     *\n     * @param {Function} cb\n     * @param {*} context\n     */\n    eachRawSeries: function (cb, context) {\n        each(this._componentsMap.get('series'), cb, context);\n    },\n\n    /**\n     * After filtering, series may be different.\n     * frome raw series.\n     *\n     * @param {string} subType.\n     * @param {Function} cb\n     * @param {*} context\n     */\n    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    /**\n     * Iterate raw series before filtered of given type.\n     *\n     * @parma {string} subType\n     * @param {Function} cb\n     * @param {*} context\n     */\n    eachRawSeriesByType: function (subType, cb, context) {\n        return each(this.getSeriesByType(subType), cb, context);\n    },\n\n    /**\n     * @param {module:echarts/model/Series} seriesModel\n     */\n    isSeriesFiltered: function (seriesModel) {\n        assertSeriesInitialized(this);\n        return this._seriesIndicesMap.get(seriesModel.componentIndex) == null;\n    },\n\n    /**\n     * @return {Array.<number>}\n     */\n    getCurrentSeriesIndices: function () {\n        return (this._seriesIndices || []).slice();\n    },\n\n    /**\n     * @param {Function} cb\n     * @param {*} context\n     */\n    filterSeries: function (cb, context) {\n        assertSeriesInitialized(this);\n        var filteredSeries = filter(\n            this._componentsMap.get('series'), cb, context\n        );\n        createSeriesIndices(this, filteredSeries);\n    },\n\n    restoreData: function (payload) {\n        var componentsMap = this._componentsMap;\n\n        createSeriesIndices(this, componentsMap.get('series'));\n\n        var componentTypes = [];\n        componentsMap.each(function (components, componentType) {\n            componentTypes.push(componentType);\n        });\n\n        ComponentModel.topologicalTravel(\n            componentTypes,\n            ComponentModel.getAllClassMainTypes(),\n            function (componentType, dependencies) {\n                each(componentsMap.get(componentType), function (component) {\n                    (componentType !== 'series' || !isNotTargetSeries(component, payload))\n                        && component.restoreData();\n                });\n            }\n        );\n    }\n\n});\n\nfunction isNotTargetSeries(seriesModel, payload) {\n    if (payload) {\n        var index = payload.seiresIndex;\n        var id = payload.seriesId;\n        var name = payload.seriesName;\n        return (index != null && seriesModel.componentIndex !== index)\n            || (id != null && seriesModel.id !== id)\n            || (name != null && seriesModel.name !== name);\n    }\n}\n\n/**\n * @inner\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\n    each(theme, function (themeItem, name) {\n        if (name === 'colorLayer' && notMergeColorLayer) {\n            return;\n        }\n        // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理\n        if (!ComponentModel.hasClass(name)) {\n            if (typeof themeItem === 'object') {\n                option[name] = !option[name]\n                    ? clone(themeItem)\n                    : merge(option[name], themeItem, false);\n            }\n            else {\n                if (option[name] == null) {\n                    option[name] = themeItem;\n                }\n            }\n        }\n    });\n}\n\nfunction initBase(baseOption) {\n    baseOption = baseOption;\n\n    // Using OPTION_INNER_KEY to mark that this option can not be used outside,\n    // i.e. `chart.setOption(chart.getModel().option);` is forbiden.\n    this.option = {};\n    this.option[OPTION_INNER_KEY] = 1;\n\n    /**\n     * Init with series: [], in case of calling findSeries method\n     * before series initialized.\n     * @type {Object.<string, Array.<module:echarts/model/Model>>}\n     * @private\n     */\n    this._componentsMap = createHashMap({series: []});\n\n    /**\n     * Mapping between filtered series list and raw series list.\n     * key: filtered series indices, value: raw series indices.\n     * @type {Array.<nubmer>}\n     * @private\n     */\n    this._seriesIndices;\n\n    this._seriesIndicesMap;\n\n    mergeTheme(baseOption, this._theme.option);\n\n    // TODO Needs clone when merging to the unexisted property\n    merge(baseOption, globalDefault, false);\n\n    this.mergeOption(baseOption);\n}\n\n/**\n * @inner\n * @param {Array.<string>|string} types model types\n * @return {Object} key: {string} type, value: {Array.<Object>} models\n */\nfunction getComponentsByTypes(componentsMap, types) {\n    if (!isArray(types)) {\n        types = types ? [types] : [];\n    }\n\n    var ret = {};\n    each(types, function (type) {\n        ret[type] = (componentsMap.get(type) || []).slice();\n    });\n\n    return ret;\n}\n\n/**\n * @inner\n */\nfunction determineSubType(mainType, newCptOption, existComponent) {\n    var subType = newCptOption.type\n        ? newCptOption.type\n        : existComponent\n        ? existComponent.subType\n        // Use determineSubType only when there is no existComponent.\n        : ComponentModel.determineSubType(mainType, newCptOption);\n\n    // tooltip, markline, markpoint may always has no subType\n    return subType;\n}\n\n/**\n * @inner\n */\nfunction createSeriesIndices(ecModel, seriesModels) {\n    ecModel._seriesIndicesMap = createHashMap(\n        ecModel._seriesIndices = map(seriesModels, function (series) {\n            return series.componentIndex;\n        }) || []\n    );\n}\n\n/**\n * @inner\n */\nfunction filterBySubType(components, condition) {\n    // Using hasOwnProperty for restrict. Consider\n    // subType is undefined in user payload.\n    return condition.hasOwnProperty('subType')\n        ? filter(components, function (cpt) {\n            return cpt.subType === condition.subType;\n        })\n        : components;\n}\n\n/**\n * @inner\n */\nfunction assertSeriesInitialized(ecModel) {\n    // Components that use _seriesIndices should depends on series component,\n    // which make sure that their initialization is after series.\n    if (__DEV__) {\n        if (!ecModel._seriesIndices) {\n            throw new Error('Option should contains series.');\n        }\n    }\n}\n\nmixin(GlobalModel, colorPaletteMixin);\n\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\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar echartsAPIList = [\n    'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',\n    'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',\n    'getViewOfComponentModel', 'getViewOfSeriesModel'\n];\n// And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js\n\nfunction ExtensionAPI(chartInstance) {\n    zrUtil.each(echartsAPIList, function (name) {\n        this[name] = zrUtil.bind(chartInstance[name], chartInstance);\n    }, this);\n}\n\nexport default ExtensionAPI;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar coordinateSystemCreators = {};\n\nfunction CoordinateSystemManager() {\n\n    this._coordinateSystems = [];\n}\n\nCoordinateSystemManager.prototype = {\n\n    constructor: CoordinateSystemManager,\n\n    create: function (ecModel, api) {\n        var coordinateSystems = [];\n        zrUtil.each(coordinateSystemCreators, function (creater, type) {\n            var list = creater.create(ecModel, api);\n            coordinateSystems = coordinateSystems.concat(list || []);\n        });\n\n        this._coordinateSystems = coordinateSystems;\n    },\n\n    update: function (ecModel, api) {\n        zrUtil.each(this._coordinateSystems, function (coordSys) {\n            coordSys.update && coordSys.update(ecModel, api);\n        });\n    },\n\n    getCoordinateSystems: function () {\n        return this._coordinateSystems.slice();\n    }\n};\n\nCoordinateSystemManager.register = function (type, coordinateSystemCreator) {\n    coordinateSystemCreators[type] = coordinateSystemCreator;\n};\n\nCoordinateSystemManager.get = function (type) {\n    return coordinateSystemCreators[type];\n};\n\nexport default CoordinateSystemManager;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * ECharts option manager\n *\n * @module {echarts/model/OptionManager}\n */\n\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../util/model';\nimport ComponentModel from './Component';\n\nvar each = zrUtil.each;\nvar clone = zrUtil.clone;\nvar map = zrUtil.map;\nvar merge = zrUtil.merge;\n\nvar QUERY_REG = /^(min|max)?(.+)$/;\n\n/**\n * TERM EXPLANATIONS:\n *\n * [option]:\n *\n *     An object that contains definitions of components. For example:\n *     var option = {\n *         title: {...},\n *         legend: {...},\n *         visualMap: {...},\n *         series: [\n *             {data: [...]},\n *             {data: [...]},\n *             ...\n *         ]\n *     };\n *\n * [rawOption]:\n *\n *     An object input to echarts.setOption. 'rawOption' may be an\n *     'option', or may be an object contains multi-options. For example:\n *     var option = {\n *         baseOption: {\n *             title: {...},\n *             legend: {...},\n *             series: [\n *                 {data: [...]},\n *                 {data: [...]},\n *                 ...\n *             ]\n *         },\n *         timeline: {...},\n *         options: [\n *             {title: {...}, series: {data: [...]}},\n *             {title: {...}, series: {data: [...]}},\n *             ...\n *         ],\n *         media: [\n *             {\n *                 query: {maxWidth: 320},\n *                 option: {series: {x: 20}, visualMap: {show: false}}\n *             },\n *             {\n *                 query: {minWidth: 320, maxWidth: 720},\n *                 option: {series: {x: 500}, visualMap: {show: true}}\n *             },\n *             {\n *                 option: {series: {x: 1200}, visualMap: {show: true}}\n *             }\n *         ]\n *     };\n *\n * @alias module:echarts/model/OptionManager\n * @param {module:echarts/ExtensionAPI} api\n */\nfunction OptionManager(api) {\n\n    /**\n     * @private\n     * @type {module:echarts/ExtensionAPI}\n     */\n    this._api = api;\n\n    /**\n     * @private\n     * @type {Array.<number>}\n     */\n    this._timelineOptions = [];\n\n    /**\n     * @private\n     * @type {Array.<Object>}\n     */\n    this._mediaList = [];\n\n    /**\n     * @private\n     * @type {Object}\n     */\n    this._mediaDefault;\n\n    /**\n     * -1, means default.\n     * empty means no media.\n     * @private\n     * @type {Array.<number>}\n     */\n    this._currentMediaIndices = [];\n\n    /**\n     * @private\n     * @type {Object}\n     */\n    this._optionBackup;\n\n    /**\n     * @private\n     * @type {Object}\n     */\n    this._newBaseOption;\n}\n\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\nOptionManager.prototype = {\n\n    constructor: OptionManager,\n\n    /**\n     * @public\n     * @param {Object} rawOption Raw option.\n     * @param {module:echarts/model/Global} ecModel\n     * @param {Array.<Function>} optionPreprocessorFuncs\n     * @return {Object} Init option\n     */\n    setOption: function (rawOption, optionPreprocessorFuncs) {\n        if (rawOption) {\n            // That set dat primitive is dangerous if user reuse the data when setOption again.\n            zrUtil.each(modelUtil.normalizeToArray(rawOption.series), function (series) {\n                series && series.data && zrUtil.isTypedArray(series.data) && zrUtil.setAsPrimitive(series.data);\n            });\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\n        // FIXME\n        // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。\n\n        var oldOptionBackup = this._optionBackup;\n        var newParsedOption = parseRawOption.call(\n            this, rawOption, optionPreprocessorFuncs, !oldOptionBackup\n        );\n        this._newBaseOption = newParsedOption.baseOption;\n\n        // For setOption at second time (using merge mode);\n        if (oldOptionBackup) {\n            // Only baseOption can be merged.\n            mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);\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 opitons will not be merged to the formers, but just substitude them.\n            if (newParsedOption.timelineOptions.length) {\n                oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;\n            }\n            if (newParsedOption.mediaList.length) {\n                oldOptionBackup.mediaList = newParsedOption.mediaList;\n            }\n            if (newParsedOption.mediaDefault) {\n                oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;\n            }\n        }\n        else {\n            this._optionBackup = newParsedOption;\n        }\n    },\n\n    /**\n     * @param {boolean} isRecreate\n     * @return {Object}\n     */\n    mountOption: function (isRecreate) {\n        var optionBackup = this._optionBackup;\n\n        // TODO\n        // 如果没有reset功能则不clone。\n\n        this._timelineOptions = map(optionBackup.timelineOptions, clone);\n        this._mediaList = map(optionBackup.mediaList, clone);\n        this._mediaDefault = clone(optionBackup.mediaDefault);\n        this._currentMediaIndices = [];\n\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 `mergeOption`\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    },\n\n    /**\n     * @param {module:echarts/model/Global} ecModel\n     * @return {Object}\n     */\n    getTimelineOption: function (ecModel) {\n        var option;\n        var timelineOptions = this._timelineOptions;\n\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                    timelineOptions[timelineModel.getCurrentIndex()],\n                    true\n                );\n            }\n        }\n\n        return option;\n    },\n\n    /**\n     * @param {module:echarts/model/Global} ecModel\n     * @return {Array.<Object>}\n     */\n    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\n        // No media defined.\n        if (!mediaList.length && !mediaDefault) {\n            return result;\n        }\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\n        // FIXME\n        // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。\n        if (!indices.length && mediaDefault) {\n            indices = [-1];\n        }\n\n        if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {\n            result = map(indices, function (index) {\n                return clone(\n                    index === -1 ? mediaDefault.option : mediaList[index].option\n                );\n            });\n        }\n        // Otherwise return nothing.\n\n        this._currentMediaIndices = indices;\n\n        return result;\n    }\n};\n\nfunction parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {\n    var timelineOptions = [];\n    var mediaList = [];\n    var mediaDefault;\n    var baseOption;\n\n    // Compatible with ec2.\n    var timelineOpt = rawOption.timeline;\n\n    if (rawOption.baseOption) {\n        baseOption = rawOption.baseOption;\n    }\n\n    // For timeline\n    if (timelineOpt || rawOption.options) {\n        baseOption = baseOption || {};\n        timelineOptions = (rawOption.options || []).slice();\n    }\n\n    // For media query\n    if (rawOption.media) {\n        baseOption = baseOption || {};\n        var media = rawOption.media;\n        each(media, function (singleMedia) {\n            if (singleMedia && singleMedia.option) {\n                if (singleMedia.query) {\n                    mediaList.push(singleMedia);\n                }\n                else if (!mediaDefault) {\n                    // Use the first media default.\n                    mediaDefault = singleMedia;\n                }\n            }\n        });\n    }\n\n    // For normal option\n    if (!baseOption) {\n        baseOption = rawOption;\n    }\n\n    // Set timelineOpt to baseOption in ec3,\n    // which is convenient for merge option.\n    if (!baseOption.timeline) {\n        baseOption.timeline = timelineOpt;\n    }\n\n    // Preprocess.\n    each([baseOption].concat(timelineOptions)\n        .concat(zrUtil.map(mediaList, function (media) {\n            return media.option;\n        })),\n        function (option) {\n            each(optionPreprocessorFuncs, function (preProcess) {\n                preProcess(option, isNew);\n            });\n        }\n    );\n\n    return {\n        baseOption: baseOption,\n        timelineOptions: timelineOptions,\n        mediaDefault: mediaDefault,\n        mediaList: mediaList\n    };\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 // lowser case for convenientce.\n    };\n\n    var applicatable = true;\n\n    zrUtil.each(query, function (value, attr) {\n        var matched = attr.match(QUERY_REG);\n\n        if (!matched || !matched[1] || !matched[2]) {\n            return;\n        }\n\n        var operator = matched[1];\n        var realAttr = matched[2].toLowerCase();\n\n        if (!compare(realMap[realAttr], value, operator)) {\n            applicatable = false;\n        }\n    });\n\n    return applicatable;\n}\n\nfunction compare(real, expect, operator) {\n    if (operator === 'min') {\n        return real >= expect;\n    }\n    else if (operator === 'max') {\n        return real <= expect;\n    }\n    else { // Equals\n        return real === expect;\n    }\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/**\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 handle its self restoration but not uniform treatment.\n *     (Too complex in logic and error-prone)\n * 2. Use a shadow ecModel. (Performace expensive)\n */\nfunction mergeOption(oldOption, newOption) {\n    newOption = newOption || {};\n\n    each(newOption, function (newCptOpt, mainType) {\n        if (newCptOpt == null) {\n            return;\n        }\n\n        var oldCptOpt = oldOption[mainType];\n\n        if (!ComponentModel.hasClass(mainType)) {\n            oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);\n        }\n        else {\n            newCptOpt = modelUtil.normalizeToArray(newCptOpt);\n            oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);\n\n            var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);\n\n            oldOption[mainType] = map(mapResult, function (item) {\n                return (item.option && item.exist)\n                    ? merge(item.exist, item.option, true)\n                    : (item.exist || item.option);\n            });\n        }\n    });\n}\n\nexport default OptionManager;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../../util/model';\n\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\n\nvar POSSIBLE_STYLES = [\n    'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle',\n    'chordStyle', 'label', 'labelLine'\n];\n\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            opt[styleName] = opt[styleName] || {};\n            if (!opt[styleName].normal) {\n                opt[styleName].normal = normalItemStyleOpt[styleName];\n            }\n            else {\n                zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]);\n            }\n            normalItemStyleOpt[styleName] = null;\n        }\n        if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) {\n            opt[styleName] = opt[styleName] || {};\n            if (!opt[styleName].emphasis) {\n                opt[styleName].emphasis = emphasisItemStyleOpt[styleName];\n            }\n            else {\n                zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]);\n            }\n            emphasisItemStyleOpt[styleName] = null;\n        }\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\n        if (normalOpt) {\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            }\n            else {\n                opt[optType] = normalOpt;\n            }\n        }\n        if (emphasisOpt) {\n            opt.emphasis = opt.emphasis || {};\n            opt.emphasis[optType] = emphasisOpt;\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}\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        for (var i = 0, len = modelUtil.TEXT_STYLE_OPTIONS.length; i < len; i++) {\n            var propName = modelUtil.TEXT_STYLE_OPTIONS[i];\n            if (textStyle.hasOwnProperty(propName)) {\n                labelOptSingle[propName] = textStyle[propName];\n            }\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}\n\nfunction processSeries(seriesOpt) {\n    if (!isObject(seriesOpt)) {\n        return;\n    }\n\n    compatEC2ItemStyle(seriesOpt);\n    removeEC3NormalStatus(seriesOpt);\n\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\n    var markPoint = seriesOpt.markPoint;\n    if (markPoint) {\n        compatEC2ItemStyle(markPoint);\n        compatEC3CommonStyles(markPoint);\n    }\n\n    var markLine = seriesOpt.markLine;\n    if (markLine) {\n        compatEC2ItemStyle(markLine);\n        compatEC3CommonStyles(markLine);\n    }\n\n    var markArea = seriesOpt.markArea;\n    if (markArea) {\n        compatEC3CommonStyles(markArea);\n    }\n\n    var data = seriesOpt.data;\n\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\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\n    if (data && !zrUtil.isTypedArray(data)) {\n        for (var i = 0; i < data.length; i++) {\n            compatEC3CommonStyles(data[i]);\n        }\n    }\n\n    // mark point data\n    var 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    var 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            }\n            else {\n                compatEC3CommonStyles(mlData[i]);\n            }\n        }\n    }\n\n    // Series\n    if (seriesOpt.type === 'gauge') {\n        compatTextStyle(seriesOpt, 'axisLabel');\n        compatTextStyle(seriesOpt, 'title');\n        compatTextStyle(seriesOpt, 'detail');\n    }\n    else if (seriesOpt.type === 'treemap') {\n        convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle');\n        zrUtil.each(seriesOpt.levels, function (opt) {\n            removeEC3NormalStatus(opt);\n        });\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}\n\nfunction toArr(o) {\n    return zrUtil.isArray(o) ? o : o ? [o] : [];\n}\n\nfunction toObj(o) {\n    return (zrUtil.isArray(o) ? o[0] : o) || {};\n}\n\nexport default function (option, isTheme) {\n    each(toArr(option.series), function (seriesOpt) {\n        isObject(seriesOpt) && processSeries(seriesOpt);\n    });\n\n    var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar'];\n    isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis');\n\n    each(\n        axes,\n        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    );\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\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\n    // radar.name.textStyle\n    each(toArr(option.radar), function (radarOpt) {\n        compatTextStyle(radarOpt, 'name');\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\n    each(toArr(option.timeline), function (timelineOpt) {\n        compatEC3CommonStyles(timelineOpt);\n        convertNormalEmphasis(timelineOpt, 'label');\n        convertNormalEmphasis(timelineOpt, 'itemStyle');\n        convertNormalEmphasis(timelineOpt, 'controlStyle', true);\n\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\n    each(toArr(option.toolbox), function (toolboxOpt) {\n        convertNormalEmphasis(toolboxOpt, 'iconStyle');\n        each(toolboxOpt.feature, function (featureOpt) {\n            convertNormalEmphasis(featureOpt, 'iconStyle');\n        });\n    });\n\n    compatTextStyle(toObj(option.axisPointer), 'label');\n    compatTextStyle(toObj(option.tooltip).axisPointer, 'label');\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Compatitable with 2.0\n\nimport {each, isArray, isObject} from 'zrender/src/core/util';\nimport compatStyle from './helper/compatStyle';\nimport {normalizeToArray} from '../util/model';\n\nfunction get(opt, path) {\n    path = path.split(',');\n    var obj = opt;\n    for (var i = 0; i < path.length; i++) {\n        obj = obj && obj[path[i]];\n        if (obj == null) {\n            break;\n        }\n    }\n    return obj;\n}\n\nfunction set(opt, path, val, overwrite) {\n    path = path.split(',');\n    var obj = opt;\n    var key;\n    for (var i = 0; i < path.length - 1; i++) {\n        key = path[i];\n        if (obj[key] == null) {\n            obj[key] = {};\n        }\n        obj = obj[key];\n    }\n    if (overwrite || obj[path[i]] == null) {\n        obj[path[i]] = val;\n    }\n}\n\nfunction compatLayoutProperties(option) {\n    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}\n\nvar LAYOUT_PROPERTIES = [\n    ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']\n];\n\nvar COMPATITABLE_COMPONENTS = [\n    'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'\n];\n\nexport default function (option, isTheme) {\n    compatStyle(option, isTheme);\n\n    // Make sure series array for model initialization.\n    option.series = normalizeToArray(option.series);\n\n    each(option.series, function (seriesOpt) {\n        if (!isObject(seriesOpt)) {\n            return;\n        }\n\n        var seriesType = seriesOpt.type;\n\n        if (seriesType === 'pie' || seriesType === 'gauge') {\n            if (seriesOpt.clockWise != null) {\n                seriesOpt.clockwise = seriesOpt.clockWise;\n            }\n        }\n        if (seriesType === 'gauge') {\n            var pointerColor = get(seriesOpt, 'pointer.color');\n            pointerColor != null\n                && set(seriesOpt, 'itemStyle.color', pointerColor);\n        }\n\n        compatLayoutProperties(seriesOpt);\n    });\n\n    // dataRange has changed to visualMap\n    if (option.dataRange) {\n        option.visualMap = option.dataRange;\n    }\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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {createHashMap, each} from 'zrender/src/core/util';\n\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 repeatly.\n//     Should be executed before after series filtered and before stack calculation.\nexport default function (ecModel) {\n    var stackInfoMap = createHashMap();\n    ecModel.eachSeries(function (seriesModel) {\n        var stack = seriesModel.get('stack');\n        // Compatibal: 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\n            var stackInfo = {\n                // Used for calculate axis extent automatically.\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\n            // If stacked on axis that do not support data stack.\n            if (!stackInfo.stackedDimension\n                || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)\n            ) {\n                return;\n            }\n\n            stackInfoList.length && data.setCalculationInfo(\n                'stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel\n            );\n\n            stackInfoList.push(stackInfo);\n        }\n    });\n\n    stackInfoMap.each(calculateStack);\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\n        // Should not write on raw data, because stack series model list changes\n        // depending on legend selection.\n        var newData = targetData.map(dims, function (v0, v1, dataIndex) {\n            var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex);\n\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\n            var byValue;\n            var stackedDataRawIndex;\n\n            if (isStackedByIndex) {\n                stackedDataRawIndex = targetData.getRawIndex(dataIndex);\n            }\n            else {\n                byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex);\n            }\n\n            // If stackOver is NaN, chart view will render point on value start.\n            var stackedOver = NaN;\n\n            for (var j = idxInStack - 1; j >= 0; j--) {\n                var stackInfo = stackInfoList[j];\n\n                // Has been optimized by inverted indices on `stackedByDimension`.\n                if (!isStackedByIndex) {\n                    stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue);\n                }\n\n                if (stackedDataRawIndex >= 0) {\n                    var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex);\n\n                    // Considering positive stack, negative stack and empty data\n                    if ((sum >= 0 && val > 0) // Positive stack\n                        || (sum <= 0 && val < 0) // Negative stack\n                    ) {\n                        sum += val;\n                        stackedOver = val;\n                        break;\n                    }\n                }\n            }\n\n            resultVal[0] = sum;\n            resultVal[1] = stackedOver;\n\n            return resultVal;\n        });\n\n        targetData.hostModel.setData(newData);\n        // Update for consequent calculation\n        targetStackInfo.data = newData;\n    });\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// TODO\n// ??? refactor? check the outer usage of data provider.\n// merge with defaultDimValueGetter?\n\nimport {__DEV__} from '../../config';\nimport {isTypedArray, extend, assert, each, isObject} from 'zrender/src/core/util';\nimport {getDataItemValue, isDataItemOption} from '../../util/model';\nimport {parseDate} from '../../util/number';\nimport Source from '../Source';\nimport {\n    SOURCE_FORMAT_TYPED_ARRAY,\n    SOURCE_FORMAT_ARRAY_ROWS,\n    SOURCE_FORMAT_ORIGINAL,\n    SOURCE_FORMAT_OBJECT_ROWS\n} from './sourceType';\n\n/**\n * If normal array used, mutable chunk size is supported.\n * If typed array used, chunk size must be fixed.\n */\nexport function DefaultDataProvider(source, dimSize) {\n    if (!Source.isInstance(source)) {\n        source = Source.seriesDataToSource(source);\n    }\n    this._source = source;\n\n    var data = this._data = source.data;\n    var sourceFormat = source.sourceFormat;\n\n    // Typed array. TODO IE10+?\n    if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n        if (__DEV__) {\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\n    var methods = providerMethods[\n        sourceFormat === SOURCE_FORMAT_ARRAY_ROWS\n        ? sourceFormat + '_' + source.seriesLayoutBy\n        : sourceFormat\n    ];\n\n    if (__DEV__) {\n        assert(methods, 'Invalide sourceFormat: ' + sourceFormat);\n    }\n\n    extend(this, methods);\n}\n\nvar providerProto = DefaultDataProvider.prototype;\n// If data is pure without style configuration\nproviderProto.pure = false;\n// If data is persistent and will not be released after use.\nproviderProto.persistent = true;\n\n// ???! FIXME legacy data provider do not has method getSource\nproviderProto.getSource = function () {\n    return this._source;\n};\n\nvar providerMethods = {\n\n    'arrayRows_column': {\n        pure: true,\n        count: function () {\n            return Math.max(0, this._data.length - this._source.startIndex);\n        },\n        getItem: function (idx) {\n            return this._data[idx + this._source.startIndex];\n        },\n        appendData: appendDataSimply\n    },\n\n    'arrayRows_row': {\n        pure: true,\n        count: function () {\n            var row = this._data[0];\n            return row ? Math.max(0, row.length - this._source.startIndex) : 0;\n        },\n        getItem: function (idx) {\n            idx += this._source.startIndex;\n            var item = [];\n            var data = this._data;\n            for (var i = 0; i < data.length; i++) {\n                var row = data[i];\n                item.push(row ? row[idx] : null);\n            }\n            return item;\n        },\n        appendData: function () {\n            throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".');\n        }\n    },\n\n    'objectRows': {\n        pure: true,\n        count: countSimply,\n        getItem: getItemSimply,\n        appendData: appendDataSimply\n    },\n\n    'keyedColumns': {\n        pure: true,\n        count: function () {\n            var dimName = this._source.dimensionsDefine[0].name;\n            var col = this._data[dimName];\n            return col ? col.length : 0;\n        },\n        getItem: function (idx) {\n            var item = [];\n            var dims = this._source.dimensionsDefine;\n            for (var i = 0; i < dims.length; i++) {\n                var col = this._data[dims[i].name];\n                item.push(col ? col[idx] : null);\n            }\n            return item;\n        },\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    },\n\n    'original': {\n        count: countSimply,\n        getItem: getItemSimply,\n        appendData: appendDataSimply\n    },\n\n    'typedArray': {\n        persistent: false,\n        pure: true,\n        count: function () {\n            return this._data ? (this._data.length / this._dimSize) : 0;\n        },\n        getItem: function (idx, out) {\n            idx = idx - this._offset;\n            out = out || [];\n            var offset = this._dimSize * idx;\n            for (var i = 0; i < this._dimSize; i++) {\n                out[i] = this._data[offset + i];\n            }\n            return out;\n        },\n        appendData: function (newData) {\n            if (__DEV__) {\n                assert(\n                    isTypedArray(newData),\n                    'Added data must be TypedArray if data in initialization is TypedArray'\n                );\n            }\n\n            this._data = newData;\n        },\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    }\n};\n\nfunction countSimply() {\n    return this._data.length;\n}\nfunction getItemSimply(idx) {\n    return this._data[idx];\n}\nfunction appendDataSimply(newData) {\n    for (var i = 0; i < newData.length; i++) {\n        this._data.push(newData[i]);\n    }\n}\n\n\n\nvar rawValueGetters = {\n\n    arrayRows: getRawValueSimply,\n\n    objectRows: function (dataItem, dataIndex, dimIndex, dimName) {\n        return dimIndex != null ? dataItem[dimName] : dataItem;\n    },\n\n    keyedColumns: getRawValueSimply,\n\n    original: function (dataItem, dataIndex, dimIndex, dimName) {\n        // FIXME\n        // In some case (markpoint in geo (geo-map.html)), dataItem\n        // is {coord: [...]}\n        var value = getDataItemValue(dataItem);\n        return (dimIndex == null || !(value instanceof Array))\n            ? value\n            : value[dimIndex];\n    },\n\n    typedArray: getRawValueSimply\n};\n\nfunction getRawValueSimply(dataItem, dataIndex, dimIndex, dimName) {\n    return dimIndex != null ? dataItem[dimIndex] : dataItem;\n}\n\n\nexport var defaultDimValueGetters = {\n\n    arrayRows: getDimValueSimply,\n\n    objectRows: function (dataItem, dimName, dataIndex, dimIndex) {\n        return converDataValue(dataItem[dimName], this._dimensionInfos[dimName]);\n    },\n\n    keyedColumns: getDimValueSimply,\n\n    original: function (dataItem, dimName, dataIndex, dimIndex) {\n        // Performance sensitive, do not use modelUtil.getDataItemValue.\n        // If dataItem is an plain object with no value field, the var `value`\n        // will be assigned with the object, but it will be tread correctly\n        // in the `convertDataValue`.\n        var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value);\n\n        // If any dataItem is like { value: 10 }\n        if (!this._rawData.pure && isDataItemOption(dataItem)) {\n            this.hasItemOption = true;\n        }\n        return converDataValue(\n            (value instanceof Array)\n                ? value[dimIndex]\n                // If value is a single number or something else not array.\n                : value,\n            this._dimensionInfos[dimName]\n        );\n    },\n\n    typedArray: function (dataItem, dimName, dataIndex, dimIndex) {\n        return dataItem[dimIndex];\n    }\n\n};\n\nfunction getDimValueSimply(dataItem, dimName, dataIndex, dimIndex) {\n    return converDataValue(dataItem[dimIndex], this._dimensionInfos[dimName]);\n}\n\n/**\n * This helper method convert value in data.\n * @param {string|number|Date} value\n * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'.\n *        If \"dimInfo.ordinalParseAndSave\", ordinal value can be parsed.\n */\nfunction converDataValue(value, dimInfo) {\n    // Performance sensitive.\n    var dimType = dimInfo && dimInfo.type;\n    if (dimType === 'ordinal') {\n        // If given value is a category string\n        var ordinalMeta = dimInfo && dimInfo.ordinalMeta;\n        return ordinalMeta\n            ? ordinalMeta.parseAndCollect(value)\n            : value;\n    }\n\n    if (dimType === 'time'\n        // spead up when using timestamp\n        && typeof value !== 'number'\n        && value != null\n        && value !== '-'\n    ) {\n        value = +parseDate(value);\n    }\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    return (value == null || value === '')\n        ? NaN\n        // If string (like '-'), using '+' parse to NaN\n        // If object, also parse to NaN\n        : +value;\n}\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?\n/**\n * @param {module:echarts/data/List} data\n * @param {number} dataIndex\n * @param {string|number} [dim] dimName or dimIndex\n * @return {Array.<number>|string|number} can be null/undefined.\n */\nexport function retrieveRawValue(data, dataIndex, dim) {\n    if (!data) {\n        return;\n    }\n\n    // Consider data may be not persistent.\n    var dataItem = data.getRawDataItem(dataIndex);\n\n    if (dataItem == null) {\n        return;\n    }\n\n    var sourceFormat = data.getProvider().getSource().sourceFormat;\n    var dimName;\n    var dimIndex;\n\n    var dimInfo = data.getDimensionInfo(dim);\n    if (dimInfo) {\n        dimName = dimInfo.name;\n        dimIndex = dimInfo.index;\n    }\n\n    return rawValueGetters[sourceFormat](dataItem, dataIndex, dimIndex, dimName);\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 {module:echarts/data/List} data\n * @param {number} dataIndex\n * @param {string} attr like 'selected'\n */\nexport function retrieveRawAttr(data, dataIndex, attr) {\n    if (!data) {\n        return;\n    }\n\n    var sourceFormat = data.getProvider().getSource().sourceFormat;\n\n    if (sourceFormat !== SOURCE_FORMAT_ORIGINAL\n        && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS\n    ) {\n        return;\n    }\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\nimport {retrieveRawValue} from '../../data/helper/dataProvider';\nimport {getTooltipMarker, formatTpl} from '../../util/format';\nimport { getTooltipRenderMode } from '../../util/model';\n\nvar DIMENSION_LABEL_REG = /\\{@(.+?)\\}/g;\n\n// PENDING A little ugly\nexport default {\n    /**\n     * Get params for formatter\n     * @param {number} dataIndex\n     * @param {string} [dataType]\n     * @return {Object}\n     */\n    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 color = data.getItemVisual(dataIndex, 'color');\n        var tooltipModel = this.ecModel.getComponent('tooltip');\n        var renderModeOption = tooltipModel && tooltipModel.get('renderMode');\n        var renderMode = getTooltipRenderMode(renderModeOption);\n        var mainType = this.mainType;\n        var isSeries = mainType === 'series';\n        var userOutput = data.userOutput;\n\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            dimensionNames: userOutput ? userOutput.dimensionNames : null,\n            encode: userOutput ? userOutput.encode : null,\n            marker: getTooltipMarker({\n                color: color,\n                renderMode: renderMode\n            }),\n\n            // Param name list for mapping `a`, `b`, `c`, `d`, `e`\n            $vars: ['seriesName', 'name', 'value']\n        };\n    },\n\n    /**\n     * Format label\n     * @param {number} dataIndex\n     * @param {string} [status='normal'] 'normal' or 'emphasis'\n     * @param {string} [dataType]\n     * @param {number} [dimIndex] Only used in some chart that\n     *        use formatter in different dimensions, like radar.\n     * @param {string} [labelProp='label']\n     * @return {string} If not formatter, return null/undefined\n     */\n    getFormattedLabel: function (dataIndex, status, dataType, dimIndex, labelProp) {\n        status = status || 'normal';\n        var data = this.getData(dataType);\n        var itemModel = data.getItemModel(dataIndex);\n\n        var params = this.getDataParams(dataIndex, dataType);\n        if (dimIndex != null && (params.value instanceof Array)) {\n            params.value = params.value[dimIndex];\n        }\n\n        var formatter = itemModel.get(\n            status === 'normal'\n            ? [labelProp || 'label', 'formatter']\n            : [status, labelProp || 'label', 'formatter']\n        );\n\n        if (typeof formatter === 'function') {\n            params.status = status;\n            params.dimensionIndex = dimIndex;\n            return formatter(params);\n        }\n        else if (typeof formatter === 'string') {\n            var str = formatTpl(formatter, params);\n\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, dim) {\n                var len = dim.length;\n                if (dim.charAt(0) === '[' && dim.charAt(len - 1) === ']') {\n                    dim = +dim.slice(1, len - 1); // Also: '[]' => 0\n                }\n                return retrieveRawValue(data, dataIndex, dim);\n            });\n        }\n    },\n\n    /**\n     * Get raw value in option\n     * @param {number} idx\n     * @param {string} [dataType]\n     * @return {Array|number|string}\n     */\n    getRawValue: function (idx, dataType) {\n        return retrieveRawValue(this.getData(dataType), idx);\n    },\n\n    /**\n     * Should be implemented.\n     * @param {number} dataIndex\n     * @param {boolean} [multipleSeries=false]\n     * @param {number} [dataType]\n     * @return {string} tooltip string\n     */\n    formatTooltip: function () {\n        // Empty function\n    }\n};\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {assert, isArray} from 'zrender/src/core/util';\nimport { __DEV__ } from '../config';\n\n/**\n * @param {Object} define\n * @return See the return of `createTask`.\n */\nexport function createTask(define) {\n    return new Task(define);\n}\n\n/**\n * @constructor\n * @param {Object} define\n * @param {Function} define.reset Custom reset\n * @param {Function} [define.plan] Returns 'reset' indicate reset immediately.\n * @param {Function} [define.count] count is used to determin data task.\n * @param {Function} [define.onDirty] count is used to determin data task.\n */\nfunction Task(define) {\n    define = define || {};\n\n    this._reset = define.reset;\n    this._plan = define.plan;\n    this._count = define.count;\n    this._onDirty = define.onDirty;\n\n    this._dirty = true;\n\n    // Context must be specified implicitly, to\n    // avoid miss update context when model changed.\n    this.context;\n}\n\nvar taskProto = Task.prototype;\n\n/**\n * @param {Object} performArgs\n * @param {number} [performArgs.step] Specified step.\n * @param {number} [performArgs.skip] Skip customer perform call.\n * @param {number} [performArgs.modBy] Sampling window size.\n * @param {number} [performArgs.modDataCount] Sampling count.\n */\ntaskProto.perform = function (performArgs) {\n    var upTask = this._upstream;\n    var skip = performArgs && performArgs.skip;\n\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\n    if (this.__pipeline) {\n        this.__pipeline.currentTask = this;\n    }\n\n    var planResult;\n    if (this._plan && !skip) {\n        planResult = this._plan(this.context);\n    }\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\n    function normalizeModBy(val) {\n        !(val >= 1) && (val = 1); // jshint ignore:line\n        return val;\n    }\n\n    var forceFirstProgress;\n    if (this._dirty || planResult === 'reset') {\n        this._dirty = false;\n        forceFirstProgress = reset(this, skip);\n    }\n\n    this._modBy = modBy;\n    this._modDataCount = modDataCount;\n\n    var step = performArgs && performArgs.step;\n\n    if (upTask) {\n\n        if (__DEV__) {\n            assert(upTask._outputDueEnd != null);\n        }\n        this._dueEnd = upTask._outputDueEnd;\n    }\n    // DataTask or overallTask\n    else {\n        if (__DEV__) {\n            assert(!this._progress || this._count);\n        }\n        this._dueEnd = this._count ? this._count(this.context) : Infinity;\n    }\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(\n            step != null ? this._dueIndex + step : Infinity,\n            this._dueEnd\n        );\n\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                    doProgress(this, progress[i], start, end, modBy, modDataCount);\n                }\n            }\n            else {\n                doProgress(this, progress, start, end, modBy, modDataCount);\n            }\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\n            ? this._settedOutputEnd : end;\n\n        if (__DEV__) {\n            // ??? Can not rollback.\n            assert(outputDueEnd >= this._outputDueEnd);\n        }\n\n        this._outputDueEnd = outputDueEnd;\n    }\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\n            ? this._settedOutputEnd : this._dueEnd;\n    }\n\n    return this.unfinished();\n};\n\nvar iterator = (function () {\n\n    var end;\n    var current;\n    var modBy;\n    var modDataCount;\n    var winCount;\n\n    var it = {\n        reset: function (s, e, sStep, sCount) {\n            current = s;\n            end = e;\n\n            modBy = sStep;\n            modDataCount = sCount;\n            winCount = Math.ceil(modDataCount / modBy);\n\n            it.next = (modBy > 1 && modDataCount > 0) ? modNext : sequentialNext;\n        }\n    };\n\n    return it;\n\n    function sequentialNext() {\n        return current < end ? current++ : null;\n    }\n\n    function modNext() {\n        var dataIndex = (current % winCount) * modBy + Math.ceil(current / winCount);\n        var result = current >= end\n            ? null\n            : dataIndex < modDataCount\n            ? 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\ntaskProto.dirty = function () {\n    this._dirty = true;\n    this._onDirty && this._onDirty(this.context);\n};\n\nfunction doProgress(taskIns, progress, start, end, modBy, modDataCount) {\n    iterator.reset(start, end, modBy, modDataCount);\n    taskIns._callingProgress = progress;\n    taskIns._callingProgress({\n        start: start, end: end, count: end - start, next: iterator.next\n    }, taskIns.context);\n}\n\nfunction reset(taskIns, skip) {\n    taskIns._dueIndex = taskIns._outputDueEnd = taskIns._dueEnd = 0;\n    taskIns._settedOutputEnd = null;\n\n    var progress;\n    var forceFirstProgress;\n\n    if (!skip && taskIns._reset) {\n        progress = taskIns._reset(taskIns.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\n    taskIns._progress = progress;\n    taskIns._modBy = taskIns._modDataCount = null;\n\n    var downstream = taskIns._downstream;\n    downstream && downstream.dirty();\n\n    return forceFirstProgress;\n}\n\n/**\n * @return {boolean}\n */\ntaskProto.unfinished = function () {\n    return this._progress && this._dueIndex < this._dueEnd;\n};\n\n/**\n * @param {Object} downTask The downstream task.\n * @return {Object} The downstream task.\n */\ntaskProto.pipe = function (downTask) {\n    if (__DEV__) {\n        assert(downTask && !downTask._disposed && downTask !== this);\n    }\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\ntaskProto.dispose = function () {\n    if (this._disposed) {\n        return;\n    }\n\n    this._upstream && (this._upstream._downstream = null);\n    this._downstream && (this._downstream._upstream = null);\n\n    this._dirty = false;\n    this._disposed = true;\n};\n\ntaskProto.getUpstream = function () {\n    return this._upstream;\n};\n\ntaskProto.getDownstream = function () {\n    return this._downstream;\n};\n\ntaskProto.setOutputEnd = function (end) {\n    // This only happend 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 setted end, in case\n    // that the stub of dataZoom perform again and earse the\n    // setted end by upstream.\n    this._outputDueEnd = this._settedOutputEnd = end;\n};\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// function printTask(task, prefix, extra) {\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//     var props = [];\n//     if (task.__pipeline) {\n//         var val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`;\n//         props.push({text: 'idx', value: val});\n//     } else {\n//         var 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: 'pid', 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//     var args = ['color: blue'];\n//     var msg = `%c[${prefix || 'T'}] %c` + props.map(item => (\n//         args.push('color: black', '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","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport {\n    formatTime,\n    encodeHTML,\n    addCommas,\n    getTooltipMarker\n} from '../util/format';\nimport * as modelUtil from '../util/model';\nimport ComponentModel from './Component';\nimport colorPaletteMixin from './mixin/colorPalette';\nimport dataFormatMixin from '../model/mixin/dataFormat';\nimport {\n    getLayoutParams,\n    mergeLayoutParam\n} from '../util/layout';\nimport {createTask} from '../stream/task';\nimport {\n    prepareSource,\n    getSource\n} from '../data/helper/sourceHelper';\nimport {retrieveRawValue} from '../data/helper/dataProvider';\n\nvar inner = modelUtil.makeInner();\n\nvar SeriesModel = ComponentModel.extend({\n\n    type: 'series.__base__',\n\n    /**\n     * @readOnly\n     */\n    seriesIndex: 0,\n\n    // coodinateSystem will be injected in the echarts/CoordinateSystem\n    coordinateSystem: null,\n\n    /**\n     * @type {Object}\n     * @protected\n     */\n    defaultOption: null,\n\n    /**\n     * Data provided for legend\n     * @type {Function}\n     */\n    // PENDING\n    legendDataProvider: null,\n\n    /**\n     * Access path of color for visual\n     */\n    visualColorAccessPath: 'itemStyle.color',\n\n    /**\n     * Support merge layout params.\n     * Only support 'box' now (left/right/top/bottom/width/height).\n     * @type {string|Object} Object can be {ignoreSize: true}\n     * @readOnly\n     */\n    layoutMode: null,\n\n    init: function (option, parentModel, ecModel, extraOpt) {\n\n        /**\n         * @type {number}\n         * @readOnly\n         */\n        this.seriesIndex = this.componentIndex;\n\n        this.dataTask = createTask({\n            count: dataTaskCount,\n            reset: dataTaskReset\n        });\n        this.dataTask.context = {model: this};\n\n        this.mergeDefaultAndTheme(option, ecModel);\n\n        prepareSource(this);\n\n\n        var data = this.getInitialData(option, ecModel);\n        wrapData(data, this);\n        this.dataTask.context.data = data;\n\n        if (__DEV__) {\n            zrUtil.assert(data, 'getInitialData returned invalid data.');\n        }\n\n        /**\n         * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}\n         * @private\n         */\n        inner(this).dataBeforeProcessed = data;\n\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/linkList\n\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\n        autoSeriesName(this);\n    },\n\n    /**\n     * Util for merge default and theme to option\n     * @param  {Object} option\n     * @param  {module:echarts/model/Global} ecModel\n     */\n    mergeDefaultAndTheme: function (option, ecModel) {\n        var layoutMode = this.layoutMode;\n        var inputPositionParams = layoutMode\n            ? getLayoutParams(option) : {};\n\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(\n            option,\n            ecModel.getTheme().get(this.subType)\n        );\n        zrUtil.merge(option, this.getDefaultOption());\n\n        // Default label emphasis `show`\n        modelUtil.defaultEmphasis(option, 'label', ['show']);\n\n        this.fillDataTextStyle(option.data);\n\n        if (layoutMode) {\n            mergeLayoutParam(option, inputPositionParams, layoutMode);\n        }\n    },\n\n    mergeOption: function (newSeriesOption, ecModel) {\n        // this.settingTask.dirty();\n\n        newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);\n        this.fillDataTextStyle(newSeriesOption.data);\n\n        var layoutMode = this.layoutMode;\n        if (layoutMode) {\n            mergeLayoutParam(this.option, newSeriesOption, layoutMode);\n        }\n\n        prepareSource(this);\n\n        var data = this.getInitialData(newSeriesOption, ecModel);\n        wrapData(data, this);\n        this.dataTask.dirty();\n        this.dataTask.context.data = data;\n\n        inner(this).dataBeforeProcessed = data;\n\n        autoSeriesName(this);\n    },\n\n    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    /**\n     * Init a data structure from data related option in series\n     * Must be overwritten\n     */\n    getInitialData: function () {},\n\n    /**\n     * Append data to list\n     * @param {Object} params\n     * @param {Array|TypedArray} params.data\n     */\n    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    /**\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     * @param {string} [dataType]\n     * @return {module:echarts/data/List}\n     */\n    getData: function (dataType) {\n        var task = getCurrentTask(this);\n        if (task) {\n            var data = task.context.data;\n            return dataType == null ? data : data.getLinkedData(dataType);\n        }\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\n    /**\n     * @param {module:echarts/data/List} data\n     */\n    setData: function (data) {\n        var task = getCurrentTask(this);\n        if (task) {\n            var context = task.context;\n            // Consider case: filter, data sample.\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\n    /**\n     * @see {module:echarts/data/helper/sourceHelper#getSource}\n     * @return {module:echarts/data/Source} source\n     */\n    getSource: function () {\n        return getSource(this);\n    },\n\n    /**\n     * Get data before processed\n     * @return {module:echarts/data/List}\n     */\n    getRawData: function () {\n        return inner(this).dataBeforeProcessed;\n    },\n\n    /**\n     * Get base axis if has coordinate system and has axis.\n     * By default use coordSys.getBaseAxis();\n     * Can be overrided for some chart.\n     * @return {type} description\n     */\n    getBaseAxis: function () {\n        var coordSys = this.coordinateSystem;\n        return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();\n    },\n\n    // FIXME\n    /**\n     * Default tooltip formatter\n     *\n     * @param {number} dataIndex\n     * @param {boolean} [multipleSeries=false]\n     * @param {number} [dataType]\n     * @param {string} [renderMode='html'] valid values: 'html' 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 {Object} formatted tooltip with `html` and `markers`\n     */\n    formatTooltip: function (dataIndex, multipleSeries, dataType, renderMode) {\n\n        var series = this;\n        renderMode = renderMode || 'html';\n        var newLine = renderMode === 'html' ? '<br/>' : '\\n';\n        var isRichText = renderMode === 'richText';\n        var markers = {};\n        var markerId = 0;\n\n        function formatArrayValue(value) {\n            // ??? TODO refactor these logic.\n            // check: category-no-encode-has-axis-data in dataset.html\n            var vertially = zrUtil.reduce(value, function (vertially, val, idx) {\n                var dimItem = data.getDimensionInfo(idx);\n                return vertially |= dimItem && dimItem.tooltip !== false && dimItem.displayName != null;\n            }, 0);\n\n            var result = [];\n\n            tooltipDims.length\n                ? zrUtil.each(tooltipDims, function (dim) {\n                    setEachItem(retrieveRawValue(data, dataIndex, dim), dim);\n                })\n                // By default, all dims is used on tooltip.\n                : zrUtil.each(value, setEachItem);\n\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                var dimType = dimInfo.type;\n                var markName = 'sub' + series.seriesIndex + 'at' + markerId;\n                var dimHead = getTooltipMarker({\n                    color: color,\n                    type: 'subItem',\n                    renderMode: renderMode,\n                    markerId: markName\n                });\n\n                var dimHeadStr = typeof dimHead === 'string' ? dimHead : dimHead.content;\n                var valStr = (vertially\n                        ? dimHeadStr + encodeHTML(dimInfo.displayName || '-') + ': '\n                        : ''\n                    )\n                    // FIXME should not format time for raw data?\n                    + encodeHTML(dimType === 'ordinal'\n                        ? val + ''\n                        : dimType === 'time'\n                        ? (multipleSeries ? '' : formatTime('yyyy/MM/dd hh:mm:ss', val))\n                        : addCommas(val)\n                    );\n                valStr && result.push(valStr);\n\n                if (isRichText) {\n                    markers[markName] = color;\n                    ++markerId;\n                }\n            }\n\n            var newLine = vertially ? (isRichText ? '\\n' : '<br/>') : '';\n            var content = newLine + result.join(newLine || ', ');\n            return {\n                renderMode: renderMode,\n                content: content,\n                style: markers\n            };\n        }\n\n        function formatSingleValue(val) {\n            // return encodeHTML(addCommas(val));\n            return {\n                renderMode: renderMode,\n                content: encodeHTML(addCommas(val)),\n                style: markers\n            };\n        }\n\n        var data = this.getData();\n        var tooltipDims = data.mapDimension('defaultedTooltip', true);\n        var tooltipDimLen = tooltipDims.length;\n        var value = this.getRawValue(dataIndex);\n        var isValueArr = zrUtil.isArray(value);\n\n        var color = data.getItemVisual(dataIndex, 'color');\n        if (zrUtil.isObject(color) && color.colorStops) {\n            color = (color.colorStops[0] || {}).color;\n        }\n        color = color || 'transparent';\n\n        // Complicated rule for pretty tooltip.\n        var formattedValue = (tooltipDimLen > 1 || (isValueArr && !tooltipDimLen))\n            ? formatArrayValue(value)\n            : tooltipDimLen\n            ? formatSingleValue(retrieveRawValue(data, dataIndex, tooltipDims[0]))\n            : formatSingleValue(isValueArr ? value[0] : value);\n        var content = formattedValue.content;\n\n        var markName = series.seriesIndex + 'at' + markerId;\n        var colorEl = getTooltipMarker({\n            color: color,\n            type: 'item',\n            renderMode: renderMode,\n            markerId: markName\n        });\n        markers[markName] = color;\n        ++markerId;\n\n        var name = data.getName(dataIndex);\n\n        var seriesName = this.name;\n        if (!modelUtil.isNameSpecified(this)) {\n            seriesName = '';\n        }\n        seriesName = seriesName\n            ? encodeHTML(seriesName) + (!multipleSeries ? newLine : ': ')\n            : '';\n\n        var colorStr = typeof colorEl === 'string' ? colorEl : colorEl.content;\n        var html = !multipleSeries\n            ? seriesName + colorStr\n                + (name\n                    ? encodeHTML(name) + ': ' + content\n                    : content\n                )\n            : colorStr + seriesName + content;\n\n        return {\n            html: html,\n            markers: markers\n        };\n    },\n\n    /**\n     * @return {boolean}\n     */\n    isAnimationEnabled: function () {\n        if (env.node) {\n            return false;\n        }\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\n    restoreData: function () {\n        this.dataTask.dirty();\n    },\n\n    getColorFromPalette: function (name, scope, requestColorNum) {\n        var ecModel = this.ecModel;\n        // PENDING\n        var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope, requestColorNum);\n        if (!color) {\n            color = ecModel.getColorFromPalette(name, scope, requestColorNum);\n        }\n        return color;\n    },\n\n    /**\n     * Use `data.mapDimension(coordDim, true)` instead.\n     * @deprecated\n     */\n    coordDimToDataDim: function (coordDim) {\n        return this.getRawData().mapDimension(coordDim, true);\n    },\n\n    /**\n     * Get progressive rendering count each step\n     * @return {number}\n     */\n    getProgressive: function () {\n        return this.get('progressive');\n    },\n\n    /**\n     * Get progressive rendering count each step\n     * @return {number}\n     */\n    getProgressiveThreshold: function () {\n        return this.get('progressiveThreshold');\n    },\n\n    /**\n     * Get data indices for show tooltip content. See tooltip.\n     * @abstract\n     * @param {Array.<string>|string} dim\n     * @param {Array.<number>} value\n     * @param {module:echarts/coord/single/SingleAxis} baseAxis\n     * @return {Object} {dataIndices, nestestValue}.\n     */\n    getAxisTooltipData: null,\n\n    /**\n     * See tooltip.\n     * @abstract\n     * @param {number} dataIndex\n     * @return {Array.<number>} Point of tooltip. null/undefined can be returned.\n     */\n    getTooltipPosition: null,\n\n    /**\n     * @see {module:echarts/stream/Scheduler}\n     */\n    pipeTask: null,\n\n    /**\n     * Convinient for override in extended class.\n     * @protected\n     * @type {Function}\n     */\n    preventIncremental: null,\n\n    /**\n     * @public\n     * @readOnly\n     * @type {Object}\n     */\n    pipelineContext: null\n\n});\n\n\nzrUtil.mixin(SeriesModel, dataFormatMixin);\nzrUtil.mixin(SeriesModel, colorPaletteMixin);\n\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}\n\nfunction getSeriesAutoName(seriesModel) {\n    var data = seriesModel.getRawData();\n    var dataDims = data.mapDimension('seriesName', true);\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}\n\nfunction dataTaskCount(context) {\n    return context.model.getRawData().count();\n}\n\nfunction dataTaskReset(context) {\n    var seriesModel = context.model;\n    seriesModel.setData(seriesModel.getRawData().cloneShallow());\n    return dataTaskProgress;\n}\n\nfunction dataTaskProgress(param, context) {\n    // Avoid repead cloneShallow when data just created in reset.\n    if (param.end > context.outputData.count()) {\n        context.model.getRawData().cloneShallow(context.outputData);\n    }\n}\n\n// TODO refactor\nfunction wrapData(data, seriesModel) {\n    zrUtil.each(data.CHANGABLE_METHODS, function (methodName) {\n        data.wrapMethod(methodName, zrUtil.curry(onDataSelfChange, seriesModel));\n    });\n}\n\nfunction onDataSelfChange(seriesModel) {\n    var task = getCurrentTask(seriesModel);\n    if (task) {\n        // Consider case: filter, selectRange\n        task.setOutputEnd(this.count());\n    }\n}\n\nfunction getCurrentTask(seriesModel) {\n    var scheduler = (seriesModel.ecModel || {}).scheduler;\n    var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid);\n\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}\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\nimport Group from 'zrender/src/container/Group';\nimport * as componentUtil from '../util/component';\nimport * as clazzUtil from '../util/clazz';\n\nvar Component = function () {\n    /**\n     * @type {module:zrender/container/Group}\n     * @readOnly\n     */\n    this.group = new Group();\n\n    /**\n     * @type {string}\n     * @readOnly\n     */\n    this.uid = componentUtil.getUID('viewComponent');\n};\n\nComponent.prototype = {\n\n    constructor: Component,\n\n    init: function (ecModel, api) {},\n\n    render: function (componentModel, ecModel, api, payload) {},\n\n    dispose: function () {},\n\n    /**\n     * @param {string} eventType\n     * @param {Object} query\n     * @param {module:zrender/Element} targetEl\n     * @param {Object} packedEvent\n     * @return {boolen} Pass only when return `true`.\n     */\n    filterForExposedEvent: null\n\n};\n\nvar componentProto = Component.prototype;\ncomponentProto.updateView\n    = componentProto.updateLayout\n    = componentProto.updateVisual\n    = function (seriesModel, ecModel, api, payload) {\n        // Do nothing;\n    };\n// Enable Component.extend.\nclazzUtil.enableClassExtend(Component);\n\n// Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.\nclazzUtil.enableClassManagement(Component, {registerWhenExtend: true});\n\nexport default Component;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {makeInner} from '../../util/model';\n\n/**\n * @return {string} If large mode changed, return string 'reset';\n */\nexport default function () {\n    var inner = makeInner();\n\n    return function (seriesModel) {\n        var fields = inner(seriesModel);\n        var pipelineContext = seriesModel.pipelineContext;\n\n        var originalLarge = fields.large;\n        var originalProgressive = fields.progressiveRender;\n\n        var large = fields.large = pipelineContext.large;\n        var progressive = fields.progressiveRender = pipelineContext.progressiveRender;\n\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\nimport {each} from 'zrender/src/core/util';\nimport Group from 'zrender/src/container/Group';\nimport * as componentUtil from '../util/component';\nimport * as clazzUtil from '../util/clazz';\nimport * as modelUtil from '../util/model';\nimport * as graphicUtil from '../util/graphic';\nimport {createTask} from '../stream/task';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner';\n\nvar inner = modelUtil.makeInner();\nvar renderPlanner = createRenderPlanner();\n\nfunction Chart() {\n\n    /**\n     * @type {module:zrender/container/Group}\n     * @readOnly\n     */\n    this.group = new Group();\n\n    /**\n     * @type {string}\n     * @readOnly\n     */\n    this.uid = componentUtil.getUID('viewChart');\n\n    this.renderTask = createTask({\n        plan: renderTaskPlan,\n        reset: renderTaskReset\n    });\n    this.renderTask.context = {view: this};\n}\n\nChart.prototype = {\n\n    type: 'chart',\n\n    /**\n     * Init the chart.\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    init: function (ecModel, api) {},\n\n    /**\n     * Render the chart.\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     */\n    render: function (seriesModel, ecModel, api, payload) {},\n\n    /**\n     * Highlight series or specified data item.\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     */\n    highlight: function (seriesModel, ecModel, api, payload) {\n        toggleHighlight(seriesModel.getData(), payload, 'emphasis');\n    },\n\n    /**\n     * Downplay series or specified data item.\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     */\n    downplay: function (seriesModel, ecModel, api, payload) {\n        toggleHighlight(seriesModel.getData(), payload, 'normal');\n    },\n\n    /**\n     * Remove self.\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    remove: function (ecModel, api) {\n        this.group.removeAll();\n    },\n\n    /**\n     * Dispose self.\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    dispose: function () {},\n\n    /**\n     * Rendering preparation in progressive mode.\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     */\n    incrementalPrepareRender: null,\n\n    /**\n     * Render in progressive mode.\n     * @param  {Object} params See taskParams in `stream/task.js`\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     */\n    incrementalRender: null,\n\n    /**\n     * Update transform directly.\n     * @param  {module:echarts/model/Series} seriesModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @param  {Object} payload\n     * @return {Object} {update: true}\n     */\n    updateTransform: null,\n\n    /**\n     * The view contains the given point.\n     * @interface\n     * @param {Array.<number>} point\n     * @return {boolean}\n     */\n    // containPoint: function () {}\n\n    /**\n     * @param {string} eventType\n     * @param {Object} query\n     * @param {module:zrender/Element} targetEl\n     * @param {Object} packedEvent\n     * @return {boolen} Pass only when return `true`.\n     */\n    filterForExposedEvent: null\n\n};\n\nvar chartProto = Chart.prototype;\nchartProto.updateView =\nchartProto.updateLayout =\nchartProto.updateVisual =\n    function (seriesModel, ecModel, api, payload) {\n        this.render(seriesModel, ecModel, api, payload);\n    };\n\n/**\n * Set state of single element\n * @param {module:zrender/Element} el\n * @param {string} state 'normal'|'emphasis'\n * @param {number} highlightDigit\n */\nfunction elSetState(el, state, highlightDigit) {\n    if (el) {\n        el.trigger(state, highlightDigit);\n        if (el.isGroup\n            // Simple optimize.\n            && !graphicUtil.isHighDownDispatcher(el)\n        ) {\n            for (var i = 0, len = el.childCount(); i < len; i++) {\n                elSetState(el.childAt(i), state, highlightDigit);\n            }\n        }\n    }\n}\n\n/**\n * @param {module:echarts/data/List} data\n * @param {Object} payload\n * @param {string} state 'normal'|'emphasis'\n */\nfunction toggleHighlight(data, payload, state) {\n    var dataIndex = modelUtil.queryDataIndex(data, payload);\n\n    var highlightDigit = (payload && payload.highlightKey != null)\n        ? graphicUtil.getHighlightDigit(payload.highlightKey)\n        : null;\n\n    if (dataIndex != null) {\n        each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {\n            elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit);\n        });\n    }\n    else {\n        data.eachItemGraphicEl(function (el) {\n            elSetState(el, state, highlightDigit);\n        });\n    }\n}\n\n// Enable Chart.extend.\nclazzUtil.enableClassExtend(Chart, ['dispose']);\n\n// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.\nclazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});\n\nChart.markUpdateMethod = function (payload, methodName) {\n    inner(payload).updateMethod = methodName;\n};\n\nfunction renderTaskPlan(context) {\n    return renderPlanner(context.model);\n}\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    // ???! remove updateView updateVisual\n    var progressiveRender = seriesModel.pipelineContext.progressiveRender;\n    var view = context.view;\n\n    var updateMethod = payload && inner(payload).updateMethod;\n    var methodName = progressiveRender\n        ? 'incrementalPrepareRender'\n        : (updateMethod && view[updateMethod])\n        ? updateMethod\n        // `appendData` is also supported when data amount\n        // is less than progressive threshold.\n        : 'render';\n\n    if (methodName !== 'render') {\n        view[methodName](seriesModel, ecModel, api, payload);\n    }\n\n    return progressMethodMap[methodName];\n}\n\nvar progressMethodMap = {\n    incrementalPrepareRender: {\n        progress: function (params, context) {\n            context.view.incrementalRender(\n                params, context.model, context.ecModel, context.api, context.payload\n            );\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(\n                context.model, context.ecModel, context.api, context.payload\n            );\n        }\n    }\n};\n\nexport default Chart;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\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\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\n    delay = delay || 0;\n\n    function exec() {\n        lastExec = (new Date()).getTime();\n        timer = null;\n        fn.apply(scope, args || []);\n    }\n\n    var cb = function () {\n        currCall = (new Date()).getTime();\n        scope = this;\n        args = arguments;\n        var thisDelay = debounceNextCall || delay;\n        var thisDebounce = debounceNextCall || debounce;\n        debounceNextCall = null;\n        diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay;\n\n        clearTimeout(timer);\n\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        }\n        else {\n            if (diff >= 0) {\n                exec();\n            }\n            else {\n                timer = setTimeout(exec, -diff);\n            }\n        }\n\n        lastCall = currCall;\n    };\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    /**\n     * Enable debounce once.\n     */\n    cb.debounceNextCall = function (debounceDelay) {\n        debounceNextCall = debounceDelay;\n    };\n\n    return cb;\n}\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 * @public\n * @param {Object} obj\n * @param {string} fnAttr\n * @param {number} [rate]\n * @param {string} [throttleType='fixRate'] 'fixRate' or 'debounce'\n * @return {Function} throttled function.\n */\nexport function createOrUpdate(obj, fnAttr, rate, throttleType) {\n    var fn = obj[fnAttr];\n\n    if (!fn) {\n        return;\n    }\n\n    var originFn = fn[ORIGIN_METHOD] || fn;\n    var lastThrottleType = fn[THROTTLE_TYPE];\n    var lastRate = fn[RATE];\n\n    if (lastRate !== rate || lastThrottleType !== throttleType) {\n        if (rate == null || !throttleType) {\n            return (obj[fnAttr] = originFn);\n        }\n\n        fn = obj[fnAttr] = throttle(\n            originFn, rate, throttleType === 'debounce'\n        );\n        fn[ORIGIN_METHOD] = originFn;\n        fn[THROTTLE_TYPE] = throttleType;\n        fn[RATE] = rate;\n    }\n\n    return fn;\n}\n\n/**\n * Clear throttle. Example see throttle.createOrUpdate.\n *\n * @public\n * @param {Object} obj\n * @param {string} fnAttr\n */\nexport function clear(obj, fnAttr) {\n    var fn = obj[fnAttr];\n    if (fn && fn[ORIGIN_METHOD]) {\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\nimport Gradient from 'zrender/src/graphic/Gradient';\n\nexport default {\n    createOnAllSeries: true,\n    performRawSeries: true,\n    reset: function (seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.color').split('.');\n        var color = seriesModel.get(colorAccessPath) // Set in itemStyle\n            || seriesModel.getColorFromPalette(\n                // TODO series count changed.\n                seriesModel.name, null, ecModel.getSeriesCount()\n            );  // Default color\n\n        // FIXME Set color function or use the platte color\n        data.setVisual('color', color);\n\n        // Only visible series has each data be visual encoded\n        if (!ecModel.isSeriesFiltered(seriesModel)) {\n            if (typeof color === 'function' && !(color instanceof Gradient)) {\n                data.each(function (idx) {\n                    data.setItemVisual(\n                        idx, 'color', color(seriesModel.getDataParams(idx))\n                    );\n                });\n            }\n\n            // itemStyle in each data item\n            var dataEach = function (data, idx) {\n                var itemModel = data.getItemModel(idx);\n                var color = itemModel.get(colorAccessPath, true);\n                if (color != null) {\n                    data.setItemVisual(idx, 'color', color);\n                }\n            };\n\n            return { dataEach: data.hasItemOption ? dataEach : 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\nexport default {\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    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\nimport * as zrUtil from 'zrender/src/core/util';\nimport lang from '../lang';\nimport { retrieveRawValue } from '../data/helper/dataProvider';\n\nexport default function (dom, ecModel) {\n    var ariaModel = ecModel.getModel('aria');\n    if (!ariaModel.get('show')) {\n        return;\n    }\n    else if (ariaModel.get('description')) {\n        dom.setAttribute('aria-label', ariaModel.get('description'));\n        return;\n    }\n\n    var seriesCnt = 0;\n    ecModel.eachSeries(function (seriesModel, idx) {\n        ++seriesCnt;\n    }, this);\n\n    var maxDataCnt = ariaModel.get('data.maxCount') || 10;\n    var maxSeriesCnt = ariaModel.get('series.maxCount') || 10;\n    var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);\n\n    var ariaLabel;\n    if (seriesCnt < 1) {\n        // No series, no aria label\n        return;\n    }\n    else {\n        var title = getTitle();\n        if (title) {\n            ariaLabel = replace(getConfig('general.withTitle'), {\n                title: title\n            });\n        }\n        else {\n            ariaLabel = getConfig('general.withoutTitle');\n        }\n\n        var seriesLabels = [];\n        var prefix = seriesCnt > 1\n            ? 'series.multiple.prefix'\n            : 'series.single.prefix';\n        ariaLabel += replace(getConfig(prefix), { seriesCount: seriesCnt });\n\n        ecModel.eachSeries(function (seriesModel, idx) {\n            if (idx < displaySeriesCnt) {\n                var seriesLabel;\n\n                var seriesName = seriesModel.get('name');\n                var seriesTpl = 'series.'\n                    + (seriesCnt > 1 ? 'multiple' : 'single') + '.';\n                seriesLabel = getConfig(seriesName\n                    ? seriesTpl + 'withName'\n                    : seriesTpl + 'withoutName');\n\n                seriesLabel = replace(seriesLabel, {\n                    seriesId: seriesModel.seriesIndex,\n                    seriesName: seriesModel.get('name'),\n                    seriesType: getSeriesTypeName(seriesModel.subType)\n                });\n\n                var data = seriesModel.getData();\n                window.data = data;\n                if (data.count() > maxDataCnt) {\n                    // Show part of data\n                    seriesLabel += replace(getConfig('data.partialData'), {\n                        displayCnt: maxDataCnt\n                    });\n                }\n                else {\n                    seriesLabel += getConfig('data.allData');\n                }\n\n                var dataLabels = [];\n                for (var i = 0; i < data.count(); i++) {\n                    if (i < maxDataCnt) {\n                        var name = data.getName(i);\n                        var value = retrieveRawValue(data, i);\n                        dataLabels.push(\n                            replace(\n                                name\n                                    ? getConfig('data.withName')\n                                    : getConfig('data.withoutName'),\n                                {\n                                    name: name,\n                                    value: value\n                                }\n                            )\n                        );\n                    }\n                }\n                seriesLabel += dataLabels\n                    .join(getConfig('data.separator.middle'))\n                    + getConfig('data.separator.end');\n\n                seriesLabels.push(seriesLabel);\n            }\n        });\n\n        ariaLabel += seriesLabels\n            .join(getConfig('series.multiple.separator.middle'))\n            + getConfig('series.multiple.separator.end');\n\n        dom.setAttribute('aria-label', ariaLabel);\n    }\n\n    function replace(str, keyValues) {\n        if (typeof str !== 'string') {\n            return str;\n        }\n\n        var result = str;\n        zrUtil.each(keyValues, function (value, key) {\n            result = result.replace(\n                new RegExp('\\\\{\\\\s*' + key + '\\\\s*\\\\}', 'g'),\n                value\n            );\n        });\n        return result;\n    }\n\n    function getConfig(path) {\n        var userConfig = ariaModel.get(path);\n        if (userConfig == null) {\n            var pathArr = path.split('.');\n            var result = lang.aria;\n            for (var i = 0; i < pathArr.length; ++i) {\n                result = result[pathArr[i]];\n            }\n            return result;\n        }\n        else {\n            return userConfig;\n        }\n    }\n\n    function getTitle() {\n        var title = ecModel.getModel('title').option;\n        if (title && title.length) {\n            title = title[0];\n        }\n        return title && title.text;\n    }\n\n    function getSeriesTypeName(type) {\n        return lang.series.typeNames[type] || '自定义图';\n    }\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../util/graphic';\n\nvar PI = Math.PI;\n\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 (api, opts) {\n    opts = opts || {};\n    zrUtil.defaults(opts, {\n        text: 'loading',\n        color: '#c23531',\n        textColor: '#000',\n        maskColor: 'rgba(255, 255, 255, 0.8)',\n        zlevel: 0\n    });\n    var mask = new graphic.Rect({\n        style: {\n            fill: opts.maskColor\n        },\n        zlevel: opts.zlevel,\n        z: 10000\n    });\n    var arc = new graphic.Arc({\n        shape: {\n            startAngle: -PI / 2,\n            endAngle: -PI / 2 + 0.1,\n            r: 10\n        },\n        style: {\n            stroke: opts.color,\n            lineCap: 'round',\n            lineWidth: 5\n        },\n        zlevel: opts.zlevel,\n        z: 10001\n    });\n    var labelRect = new graphic.Rect({\n        style: {\n            fill: 'none',\n            text: opts.text,\n            textPosition: 'right',\n            textDistance: 10,\n            textFill: opts.textColor\n        },\n        zlevel: opts.zlevel,\n        z: 10001\n    });\n\n    arc.animateShape(true)\n        .when(1000, {\n            endAngle: PI * 3 / 2\n        })\n        .start('circularInOut');\n    arc.animateShape(true)\n        .when(1000, {\n            startAngle: PI * 3 / 2\n        })\n        .delay(300)\n        .start('circularInOut');\n\n    var group = new graphic.Group();\n    group.add(arc);\n    group.add(labelRect);\n    group.add(mask);\n    // Inject resize\n    group.resize = function () {\n        var cx = api.getWidth() / 2;\n        var cy = api.getHeight() / 2;\n        arc.setShape({\n            cx: cx,\n            cy: cy\n        });\n        var r = arc.shape.r;\n        labelRect.setShape({\n            x: cx - r,\n            y: cy - r,\n            width: r * 2,\n            height: r * 2\n        });\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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/stream/Scheduler\n */\n\nimport {each, map, isFunction, createHashMap, noop} from 'zrender/src/core/util';\nimport {createTask} from './task';\nimport {getUID} from '../util/component';\nimport GlobalModel from '../model/Global';\nimport ExtensionAPI from '../ExtensionAPI';\nimport {normalizeToArray} from '../util/model';\n\n/**\n * @constructor\n */\nfunction Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) {\n    this.ecInstance = ecInstance;\n    this.api = api;\n    this.unfinished;\n\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    var dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice();\n    var visualHandlers = this._visualHandlers = visualHandlers.slice();\n    this._allHandlers = dataProcessorHandlers.concat(visualHandlers);\n\n    /**\n     * @private\n     * @type {\n     *     [handlerUID: string]: {\n     *         seriesTaskMap?: {\n     *             [seriesUID: string]: Task\n     *         },\n     *         overallTask?: Task\n     *     }\n     * }\n     */\n    this._stageTaskMap = createHashMap();\n}\n\nvar proto = Scheduler.prototype;\n\n/**\n * @param {module:echarts/model/Global} ecModel\n * @param {Object} payload\n */\nproto.restoreData = function (ecModel, payload) {\n    // TODO: Only restroe 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\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\n    ecModel.restoreData(payload);\n\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\n// If seriesModel provided, incremental threshold is check by series data.\nproto.getPerformArgs = function (task, isBlock) {\n    // For overall task\n    if (!task.__pipeline) {\n        return;\n    }\n\n    var pipeline = this._pipelineMap.get(task.__pipeline.id);\n    var pCtx = pipeline.context;\n    var incremental = !isBlock\n        && pipeline.progressiveEnabled\n        && (!pCtx || pCtx.progressiveRender)\n        && task.__idxInPipeline > pipeline.blockIndex;\n\n    var step = incremental ? pipeline.step : null;\n    var modDataCount = pCtx && pCtx.modDataCount;\n    var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null;\n\n    return {step: step, modBy: modBy, modDataCount: modDataCount};\n};\n\nproto.getPipeline = function (pipelineId) {\n    return this._pipelineMap.get(pipelineId);\n};\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 */\nproto.updateStreamModes = function (seriesModel, view) {\n    var pipeline = this._pipelineMap.get(seriesModel.uid);\n    var data = seriesModel.getData();\n    var dataLen = data.count();\n\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\n        && view.incrementalPrepareRender\n        && dataLen >= pipeline.threshold;\n\n    var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold');\n\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\n    seriesModel.pipelineContext = pipeline.context = {\n        progressiveRender: progressiveRender,\n        modDataCount: modDataCount,\n        large: large\n    };\n};\n\nproto.restorePipelines = function (ecModel) {\n    var scheduler = this;\n    var pipelineMap = scheduler._pipelineMap = createHashMap();\n\n    ecModel.eachSeries(function (seriesModel) {\n        var progressive = seriesModel.getProgressive();\n        var pipelineId = seriesModel.uid;\n\n        pipelineMap.set(pipelineId, {\n            id: pipelineId,\n            head: null,\n            tail: null,\n            threshold: seriesModel.getProgressiveThreshold(),\n            progressiveEnabled: progressive\n                && !(seriesModel.preventIncremental && seriesModel.preventIncremental()),\n            blockIndex: -1,\n            step: Math.round(progressive || 700),\n            count: 0\n        });\n\n        pipe(scheduler, seriesModel, seriesModel.dataTask);\n    });\n};\n\nproto.prepareStageTasks = function () {\n    var stageTaskMap = this._stageTaskMap;\n    var ecModel = this.ecInstance.getModel();\n    var api = this.api;\n\n    each(this._allHandlers, function (handler) {\n        var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, []);\n\n        handler.reset && createSeriesStageTask(this, handler, record, ecModel, api);\n        handler.overallReset && createOverallStageTask(this, handler, record, ecModel, api);\n    }, this);\n};\n\nproto.prepareView = function (view, model, ecModel, api) {\n    var renderTask = view.renderTask;\n    var context = renderTask.context;\n\n    context.model = model;\n    context.ecModel = ecModel;\n    context.api = api;\n\n    renderTask.__block = !view.incrementalPrepareRender;\n\n    pipe(this, model, renderTask);\n};\n\n\nproto.performDataProcessorTasks = function (ecModel, payload) {\n    // If we do not use `block` here, it should be considered when to update modes.\n    performStageTasks(this, this._dataProcessorHandlers, ecModel, payload, {block: true});\n};\n\n// opt\n// opt.visualType: 'visual' or 'layout'\n// opt.setDirty\nproto.performVisualTasks = function (ecModel, payload, opt) {\n    performStageTasks(this, this._visualHandlers, ecModel, payload, opt);\n};\n\nfunction performStageTasks(scheduler, stageHandlers, ecModel, payload, opt) {\n    opt = opt || {};\n    var unfinished;\n\n    each(stageHandlers, function (stageHandler, idx) {\n        if (opt.visualType && opt.visualType !== stageHandler.visualType) {\n            return;\n        }\n\n        var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid);\n        var seriesTaskMap = stageHandlerRecord.seriesTaskMap;\n        var overallTask = stageHandlerRecord.overallTask;\n\n        if (overallTask) {\n            var overallNeedDirty;\n            var agentStubMap = overallTask.agentStubMap;\n            agentStubMap.each(function (stub) {\n                if (needSetDirty(opt, stub)) {\n                    stub.dirty();\n                    overallNeedDirty = true;\n                }\n            });\n            overallNeedDirty && overallTask.dirty();\n            updatePayload(overallTask, payload);\n            var performArgs = 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);\n            });\n            unfinished |= overallTask.perform(performArgs);\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                performArgs.skip = !stageHandler.performRawSeries\n                    && ecModel.isSeriesFiltered(task.context.model);\n                updatePayload(task, payload);\n                unfinished |= task.perform(performArgs);\n            });\n        }\n    });\n\n    function needSetDirty(opt, task) {\n        return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id));\n    }\n\n    scheduler.unfinished |= unfinished;\n}\n\nproto.performSeriesTasks = function (ecModel) {\n    var unfinished;\n\n    ecModel.eachSeries(function (seriesModel) {\n        // Progress to the end for dataInit and dataRestore.\n        unfinished |= seriesModel.dataTask.perform();\n    });\n\n    this.unfinished |= unfinished;\n};\n\nproto.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        }\n        while (task);\n    });\n};\n\nvar updatePayload = proto.updatePayload = function (task, payload) {\n    payload !== 'remain' && (task.context.payload = payload);\n};\n\nfunction createSeriesStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) {\n    var seriesTaskMap = stageHandlerRecord.seriesTaskMap\n        || (stageHandlerRecord.seriesTaskMap = createHashMap());\n    var seriesType = stageHandler.seriesType;\n    var getTargetSeries = stageHandler.getTargetSeries;\n\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    }\n    else if (seriesType) {\n        ecModel.eachRawSeriesByType(seriesType, create);\n    }\n    else if (getTargetSeries) {\n        getTargetSeries(ecModel, api).each(create);\n    }\n\n    function create(seriesModel) {\n        var pipelineId = seriesModel.uid;\n\n        // Init tasks for each seriesModel only once.\n        // Reuse original task instance.\n        var task = seriesTaskMap.get(pipelineId)\n            || seriesTaskMap.set(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            useClearVisual: stageHandler.isVisual && !stageHandler.isLayout,\n            plan: stageHandler.plan,\n            reset: stageHandler.reset,\n            scheduler: scheduler\n        };\n        pipe(scheduler, seriesModel, task);\n    }\n\n    // Clear unused series tasks.\n    var pipelineMap = scheduler._pipelineMap;\n    seriesTaskMap.each(function (task, pipelineId) {\n        if (!pipelineMap.get(pipelineId)) {\n            task.dispose();\n            seriesTaskMap.removeKey(pipelineId);\n        }\n    });\n}\n\nfunction createOverallStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) {\n    var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask\n        // For overall task, the function only be called on reset stage.\n        || createTask({reset: overallTaskReset});\n\n    overallTask.context = {\n        ecModel: ecModel,\n        api: api,\n        overallReset: stageHandler.overallReset,\n        scheduler: scheduler\n    };\n\n    // Reuse orignal stubs.\n    var agentStubMap = overallTask.agentStubMap = overallTask.agentStubMap || createHashMap();\n\n    var seriesType = stageHandler.seriesType;\n    var getTargetSeries = stageHandler.getTargetSeries;\n    var overallProgress = true;\n    var modifyOutputEnd = stageHandler.modifyOutputEnd;\n\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    if (seriesType) {\n        ecModel.eachRawSeriesByType(seriesType, createStub);\n    }\n    else if (getTargetSeries) {\n        getTargetSeries(ecModel, api).each(createStub);\n    }\n    // Otherwise, (usually it is legancy case), the overall task will only be\n    // executed when upstream dirty. Otherwise the progressive rendering of all\n    // pipelines will be disabled unexpectedly. But it still needs stubs to receive\n    // dirty info from upsteam.\n    else {\n        overallProgress = false;\n        each(ecModel.getSeries(), createStub);\n    }\n\n    function createStub(seriesModel) {\n        var pipelineId = seriesModel.uid;\n        var stub = agentStubMap.get(pipelineId);\n        if (!stub) {\n            stub = agentStubMap.set(pipelineId, createTask(\n                {reset: stubReset, onDirty: stubOnDirty}\n            ));\n            // When the result of `getTargetSeries` changed, the overallTask\n            // should be set as dirty and re-performed.\n            overallTask.dirty();\n        }\n        stub.context = {\n            model: seriesModel,\n            overallProgress: overallProgress,\n            modifyOutputEnd: modifyOutputEnd\n        };\n        stub.agent = overallTask;\n        stub.__block = overallProgress;\n\n        pipe(scheduler, seriesModel, stub);\n    }\n\n    // Clear unused stubs.\n    var pipelineMap = scheduler._pipelineMap;\n    agentStubMap.each(function (stub, pipelineId) {\n        if (!pipelineMap.get(pipelineId)) {\n            stub.dispose();\n            // When the result of `getTargetSeries` changed, the overallTask\n            // should be set as dirty and re-performed.\n            overallTask.dirty();\n            agentStubMap.removeKey(pipelineId);\n        }\n    });\n}\n\nfunction overallTaskReset(context) {\n    context.overallReset(\n        context.ecModel, context.api, context.payload\n    );\n}\n\nfunction stubReset(context, upstreamContext) {\n    return context.overallProgress && stubProgress;\n}\n\nfunction stubProgress() {\n    this.agent.dirty();\n    this.getDownstream().dirty();\n}\n\nfunction stubOnDirty() {\n    this.agent && this.agent.dirty();\n}\n\nfunction seriesTaskPlan(context) {\n    return context.plan && context.plan(\n        context.model, context.ecModel, context.api, context.payload\n    );\n}\n\nfunction seriesTaskReset(context) {\n    if (context.useClearVisual) {\n        context.data.clearAllVisual();\n    }\n    var resetDefines = context.resetDefines = normalizeToArray(context.reset(\n        context.model, context.ecModel, context.api, context.payload\n    ));\n    return resetDefines.length > 1\n        ? map(resetDefines, function (v, idx) {\n            return makeSeriesTaskProgress(idx);\n        })\n        : singleSeriesTaskProgress;\n}\n\nvar singleSeriesTaskProgress = makeSeriesTaskProgress(0);\n\nfunction makeSeriesTaskProgress(resetDefineIdx) {\n    return function (params, context) {\n        var data = context.data;\n        var resetDefine = context.resetDefines[resetDefineIdx];\n\n        if (resetDefine && resetDefine.dataEach) {\n            for (var i = params.start; i < params.end; i++) {\n                resetDefine.dataEach(data, i);\n            }\n        }\n        else if (resetDefine && resetDefine.progress) {\n            resetDefine.progress(params, data);\n        }\n    };\n}\n\nfunction seriesTaskCount(context) {\n    return context.data.count();\n}\n\nfunction pipe(scheduler, seriesModel, task) {\n    var pipelineId = seriesModel.uid;\n    var pipeline = scheduler._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\nScheduler.wrapStageHandler = function (stageHandler, visualType) {\n    if (isFunction(stageHandler)) {\n        stageHandler = {\n            overallReset: stageHandler,\n            seriesType: detectSeriseType(stageHandler)\n        };\n    }\n\n    stageHandler.uid = getUID('stageHandler');\n    visualType && (stageHandler.visualType = visualType);\n\n    return stageHandler;\n};\n\n\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    }\n    catch (e) {\n    }\n    return seriesType;\n}\n\nvar ecModelMock = {};\nvar apiMock = {};\nvar seriesType;\n\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};\n\nfunction mockMethods(target, Clz) {\n    /* eslint-disable */\n    for (var name in Clz.prototype) {\n        // Do not use hasOwnProperty\n        target[name] = noop;\n    }\n    /* eslint-enable */\n}\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\nvar colorAll = [\n    '#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f',\n    '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF'\n];\n\nexport default {\n\n    color: colorAll,\n\n    colorLayer: [\n        ['#37A2DA', '#ffd85c', '#fd7b5f'],\n        ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'],\n        ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'],\n        colorAll\n    ]\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\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 contrastColor = '#eee';\nvar axisCommon = function () {\n    return {\n        axisLine: {\n            lineStyle: {\n                color: contrastColor\n            }\n        },\n        axisTick: {\n            lineStyle: {\n                color: contrastColor\n            }\n        },\n        axisLabel: {\n            textStyle: {\n                color: contrastColor\n            }\n        },\n        splitLine: {\n            lineStyle: {\n                type: 'dashed',\n                color: '#aaa'\n            }\n        },\n        splitArea: {\n            areaStyle: {\n                color: contrastColor\n            }\n        }\n    };\n};\n\nvar colorPalette = [\n    '#dd6b66', '#759aa0', '#e69d87', '#8dc1a9', '#ea7e53',\n    '#eedd78', '#73a373', '#73b9bc', '#7289ab', '#91ca8c', '#f49f42'\n];\nvar theme = {\n    color: colorPalette,\n    backgroundColor: '#333',\n    tooltip: {\n        axisPointer: {\n            lineStyle: {\n                color: contrastColor\n            },\n            crossStyle: {\n                color: contrastColor\n            }\n        }\n    },\n    legend: {\n        textStyle: {\n            color: contrastColor\n        }\n    },\n    textStyle: {\n        color: contrastColor\n    },\n    title: {\n        textStyle: {\n            color: contrastColor\n        }\n    },\n    toolbox: {\n        iconStyle: {\n            normal: {\n                borderColor: contrastColor\n            }\n        }\n    },\n    dataZoom: {\n        textStyle: {\n            color: contrastColor\n        }\n    },\n    visualMap: {\n        textStyle: {\n            color: contrastColor\n        }\n    },\n    timeline: {\n        lineStyle: {\n            color: contrastColor\n        },\n        itemStyle: {\n            normal: {\n                color: colorPalette[1]\n            }\n        },\n        label: {\n            normal: {\n                textStyle: {\n                    color: contrastColor\n                }\n            }\n        },\n        controlStyle: {\n            normal: {\n                color: contrastColor,\n                borderColor: contrastColor\n            }\n        }\n    },\n    timeAxis: axisCommon(),\n    logAxis: axisCommon(),\n    valueAxis: axisCommon(),\n    categoryAxis: axisCommon(),\n\n    line: {\n        symbol: 'circle'\n    },\n    graph: {\n        color: colorPalette\n    },\n    gauge: {\n        title: {\n            textStyle: {\n                color: contrastColor\n            }\n        }\n    },\n    candlestick: {\n        itemStyle: {\n            normal: {\n                color: '#FD1050',\n                color0: '#0CF49B',\n                borderColor: '#FD1050',\n                borderColor0: '#0CF49B'\n            }\n        }\n    }\n};\ntheme.categoryAxis.splitLine.show = false;\n\nexport default theme;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\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 */\n\nimport ComponentModel from '../model/Component';\nimport ComponentView from '../view/Component';\nimport {detectSourceFormat} from '../data/helper/sourceHelper';\nimport {SERIES_LAYOUT_BY_COLUMN} from '../data/helper/sourceType';\n\nComponentModel.extend({\n\n    type: 'dataset',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n\n        // 'row', 'column'\n        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,\n\n        // null/'auto': auto detect header, see \"module:echarts/data/helper/sourceHelper\"\n        sourceHeader: null,\n\n        dimensions: null,\n\n        source: null\n    },\n\n    optionUpdated: function () {\n        detectSourceFormat(this);\n    }\n\n});\n\nComponentView.extend({\n\n    type: 'dataset'\n\n});\n","/**\n * 椭圆形状\n * @module zrender/graphic/shape/Ellipse\n */\n\nimport Path from '../Path';\n\nexport default Path.extend({\n\n    type: 'ellipse',\n\n    shape: {\n        cx: 0, cy: 0,\n        rx: 0, ry: 0\n    },\n\n    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        // 从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线\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});","import Group from '../container/Group';\nimport ZImage from '../graphic/Image';\nimport Text from '../graphic/Text';\nimport Circle from '../graphic/shape/Circle';\nimport Rect from '../graphic/shape/Rect';\nimport Ellipse from '../graphic/shape/Ellipse';\nimport Line from '../graphic/shape/Line';\nimport Path from '../graphic/Path';\nimport Polygon from '../graphic/shape/Polygon';\nimport Polyline from '../graphic/shape/Polyline';\nimport LinearGradient from '../graphic/LinearGradient';\n// import RadialGradient from '../graphic/RadialGradient';\n// import Pattern from '../graphic/Pattern';\nimport Style from '../graphic/Style';\n// import * as vector from '../core/vector';\nimport * as matrix from '../core/matrix';\nimport { createFromString } from './path';\nimport { isString, extend, defaults, trim, each } from '../core/util';\n\n// Most of the values can be separated by comma and/or white space.\nvar DILIMITER_REG = /[\\s,]+/;\n\n/**\n * For big svg string, this method might be time consuming.\n *\n * @param {string} svg xml string\n * @return {Object} xml root.\n */\nexport function parseXML(svg) {\n    if (isString(svg)) {\n        var parser = new DOMParser();\n        svg = parser.parseFromString(svg, 'text/xml');\n    }\n\n    // Document node. If using $.get, doc node may be input.\n    if (svg.nodeType === 9) {\n        svg = svg.firstChild;\n    }\n    // nodeName of <!DOCTYPE svg> is also 'svg'.\n    while (svg.nodeName.toLowerCase() !== 'svg' || svg.nodeType !== 1) {\n        svg = svg.nextSibling;\n    }\n\n    return svg;\n}\n\nfunction SVGParser() {\n    this._defs = {};\n    this._root = null;\n\n    this._isDefine = false;\n    this._isText = false;\n}\n\nSVGParser.prototype.parse = function (xml, opt) {\n    opt = opt || {};\n\n    var svg = parseXML(xml);\n\n    if (!svg) {\n        throw new Error('Illegal svg');\n    }\n\n    var root = new Group();\n    this._root = root;\n    // parse view port\n    var viewBox = svg.getAttribute('viewBox') || '';\n\n    // If width/height not specified, means \"100%\" of `opt.width/height`.\n    // TODO: Other percent value not supported yet.\n    var width = parseFloat(svg.getAttribute('width') || opt.width);\n    var height = parseFloat(svg.getAttribute('height') || opt.height);\n    // If width/height not specified, set as null for output.\n    isNaN(width) && (width = null);\n    isNaN(height) && (height = null);\n\n    // Apply inline style on svg element.\n    parseAttributes(svg, root, null, true);\n\n    var child = svg.firstChild;\n    while (child) {\n        this._parseNode(child, root);\n        child = child.nextSibling;\n    }\n\n    var viewBoxRect;\n    var viewBoxTransform;\n\n    if (viewBox) {\n        var viewBoxArr = trim(viewBox).split(DILIMITER_REG);\n        // Some invalid case like viewBox: 'none'.\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\n    if (viewBoxRect && width != null && height != null) {\n        viewBoxTransform = makeViewBoxTransform(viewBoxRect, width, height);\n\n        if (!opt.ignoreViewBox) {\n            // If set transform on the output group, it probably bring trouble when\n            // some users only intend to show the clipped content inside the viewBox,\n            // but not intend to transform the output group. So we keep the output\n            // group no transform. If the user intend to use the viewBox as a\n            // camera, just set `opt.ignoreViewBox` as `true` and set transfrom\n            // manually according to the viewBox info in the output of this method.\n            var elRoot = root;\n            root = new Group();\n            root.add(elRoot);\n            elRoot.scale = viewBoxTransform.scale.slice();\n            elRoot.position = viewBoxTransform.position.slice();\n        }\n    }\n\n    // Some shapes might be overflow the viewport, which should be\n    // clipped despite whether the viewBox is used, as the SVG does.\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\n    // Set width/height on group just for output the viewport size.\n    return {\n        root: root,\n        width: width,\n        height: height,\n        viewBoxRect: viewBoxRect,\n        viewBoxTransform: viewBoxTransform\n    };\n};\n\nSVGParser.prototype._parseNode = function (xmlNode, parentGroup) {\n\n    var nodeName = xmlNode.nodeName.toLowerCase();\n\n    // TODO\n    // support <style>...</style> in svg, where nodeName is 'style',\n    // CSS classes is defined globally wherever the style tags are declared.\n\n    if (nodeName === 'defs') {\n        // define flag\n        this._isDefine = true;\n    }\n    else if (nodeName === 'text') {\n        this._isText = true;\n    }\n\n    var el;\n    if (this._isDefine) {\n        var parser = defineParsers[nodeName];\n        if (parser) {\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    else {\n        var parser = nodeParsers[nodeName];\n        if (parser) {\n            el = parser.call(this, xmlNode, parentGroup);\n            parentGroup.add(el);\n        }\n    }\n\n    var child = xmlNode.firstChild;\n    while (child) {\n        if (child.nodeType === 1) {\n            this._parseNode(child, el);\n        }\n        // Is text\n        if (child.nodeType === 3 && this._isText) {\n            this._parseText(child, el);\n        }\n        child = child.nextSibling;\n    }\n\n    // Quit define\n    if (nodeName === 'defs') {\n        this._isDefine = false;\n    }\n    else if (nodeName === 'text') {\n        this._isText = false;\n    }\n};\n\nSVGParser.prototype._parseText = function (xmlNode, parentGroup) {\n    if (xmlNode.nodeType === 1) {\n        var dx = xmlNode.getAttribute('dx') || 0;\n        var dy = xmlNode.getAttribute('dy') || 0;\n        this._textX += parseFloat(dx);\n        this._textY += parseFloat(dy);\n    }\n\n    var text = new Text({\n        style: {\n            text: xmlNode.textContent,\n            transformText: true\n        },\n        position: [this._textX || 0, this._textY || 0]\n    });\n\n    inheritStyle(parentGroup, text);\n    parseAttributes(xmlNode, text, this._defs);\n\n    var fontSize = text.style.fontSize;\n    if (fontSize && fontSize < 9) {\n        // PENDING\n        text.style.fontSize = 9;\n        text.scale = text.scale || [1, 1];\n        text.scale[0] *= fontSize / 9;\n        text.scale[1] *= fontSize / 9;\n    }\n\n    var rect = text.getBoundingRect();\n    this._textX += rect.width;\n\n    parentGroup.add(text);\n\n    return text;\n};\n\nvar nodeParsers = {\n    'g': function (xmlNode, parentGroup) {\n        var g = new Group();\n        inheritStyle(parentGroup, g);\n        parseAttributes(xmlNode, g, this._defs);\n\n        return g;\n    },\n    'rect': function (xmlNode, parentGroup) {\n        var rect = new Rect();\n        inheritStyle(parentGroup, rect);\n        parseAttributes(xmlNode, rect, this._defs);\n\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\n        // console.log(xmlNode.getAttribute('transform'));\n        // console.log(rect.transform);\n\n        return rect;\n    },\n    'circle': function (xmlNode, parentGroup) {\n        var circle = new Circle();\n        inheritStyle(parentGroup, circle);\n        parseAttributes(xmlNode, circle, this._defs);\n\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\n        return circle;\n    },\n    'line': function (xmlNode, parentGroup) {\n        var line = new Line();\n        inheritStyle(parentGroup, line);\n        parseAttributes(xmlNode, line, this._defs);\n\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\n        return line;\n    },\n    'ellipse': function (xmlNode, parentGroup) {\n        var ellipse = new Ellipse();\n        inheritStyle(parentGroup, ellipse);\n        parseAttributes(xmlNode, ellipse, this._defs);\n\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        return ellipse;\n    },\n    'polygon': function (xmlNode, parentGroup) {\n        var points = xmlNode.getAttribute('points');\n        if (points) {\n            points = parsePoints(points);\n        }\n        var polygon = new Polygon({\n            shape: {\n                points: points || []\n            }\n        });\n\n        inheritStyle(parentGroup, polygon);\n        parseAttributes(xmlNode, polygon, this._defs);\n\n        return polygon;\n    },\n    'polyline': function (xmlNode, parentGroup) {\n        var path = new Path();\n        inheritStyle(parentGroup, path);\n        parseAttributes(xmlNode, path, this._defs);\n\n        var points = xmlNode.getAttribute('points');\n        if (points) {\n            points = parsePoints(points);\n        }\n        var polyline = new Polyline({\n            shape: {\n                points: points || []\n            }\n        });\n\n        return polyline;\n    },\n    'image': function (xmlNode, parentGroup) {\n        var img = new ZImage();\n        inheritStyle(parentGroup, img);\n        parseAttributes(xmlNode, img, this._defs);\n\n        img.setStyle({\n            image: xmlNode.getAttribute('xlink:href'),\n            x: xmlNode.getAttribute('x'),\n            y: xmlNode.getAttribute('y'),\n            width: xmlNode.getAttribute('width'),\n            height: xmlNode.getAttribute('height')\n        });\n\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\n        this._textX = parseFloat(x) + parseFloat(dx);\n        this._textY = parseFloat(y) + parseFloat(dy);\n\n        var g = new Group();\n        inheritStyle(parentGroup, g);\n        parseAttributes(xmlNode, g, this._defs);\n\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            // new offset x\n            this._textX = parseFloat(x);\n        }\n        if (y != null) {\n            // new offset y\n            this._textY = parseFloat(y);\n        }\n        var dx = xmlNode.getAttribute('dx') || 0;\n        var dy = xmlNode.getAttribute('dy') || 0;\n\n        var g = new Group();\n\n        inheritStyle(parentGroup, g);\n        parseAttributes(xmlNode, g, this._defs);\n\n\n        this._textX += dx;\n        this._textY += dy;\n\n        return g;\n    },\n    'path': function (xmlNode, parentGroup) {\n        // TODO svg fill rule\n        // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule\n        // path.style.globalCompositeOperation = 'xor';\n        var d = xmlNode.getAttribute('d') || '';\n\n        // Performance sensitive.\n\n        var path = createFromString(d);\n\n        inheritStyle(parentGroup, path);\n        parseAttributes(xmlNode, path, this._defs);\n\n        return path;\n    }\n};\n\nvar defineParsers = {\n\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\n        var gradient = new LinearGradient(x1, y1, x2, y2);\n\n        _parseGradientColorStops(xmlNode, gradient);\n\n        return gradient;\n    },\n\n    'radialgradient': function (xmlNode) {\n\n    }\n};\n\nfunction _parseGradientColorStops(xmlNode, gradient) {\n\n    var stop = xmlNode.firstChild;\n\n    while (stop) {\n        if (stop.nodeType === 1) {\n            var offset = stop.getAttribute('offset');\n            if (offset.indexOf('%') > 0) {  // percentage\n                offset = parseInt(offset, 10) / 100;\n            }\n            else if (offset) {    // number from 0 to 1\n                offset = parseFloat(offset);\n            }\n            else {\n                offset = 0;\n            }\n\n            var stopColor = stop.getAttribute('stop-color') || '#000000';\n\n            gradient.addColorStop(offset, stopColor);\n        }\n        stop = stop.nextSibling;\n    }\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}\n\nfunction parsePoints(pointsString) {\n    var list = trim(pointsString).split(DILIMITER_REG);\n    var points = [];\n\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}\n\nvar attributesMap = {\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\n    'text-align': 'textAlign',\n    'alignment-baseline': 'textBaseline'\n};\n\nfunction parseAttributes(xmlNode, el, defs, onlyInlineStyle) {\n    var zrStyle = el.__inheritedStyle || {};\n    var isTextEl = el.type === 'text';\n\n    // TODO Shadow\n    if (xmlNode.nodeType === 1) {\n        parseTransformAttribute(xmlNode, el);\n\n        extend(zrStyle, parseStyleAttribute(xmlNode));\n\n        if (!onlyInlineStyle) {\n            for (var svgAttrName in attributesMap) {\n                if (attributesMap.hasOwnProperty(svgAttrName)) {\n                    var attrValue = xmlNode.getAttribute(svgAttrName);\n                    if (attrValue != null) {\n                        zrStyle[attributesMap[svgAttrName]] = attrValue;\n                    }\n                }\n            }\n        }\n    }\n\n    var elFillProp = isTextEl ? 'textFill' : 'fill';\n    var elStrokeProp = isTextEl ? 'textStroke' : 'stroke';\n\n    el.style = el.style || new Style();\n    var elStyle = el.style;\n\n    zrStyle.fill != null && elStyle.set(elFillProp, getPaint(zrStyle.fill, defs));\n    zrStyle.stroke != null && elStyle.set(elStrokeProp, getPaint(zrStyle.stroke, defs));\n\n    each([\n        'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize'\n    ], function (propName) {\n        var elPropName = (propName === 'lineWidth' && isTextEl) ? 'textStrokeWidth' : propName;\n        zrStyle[propName] != null && elStyle.set(elPropName, parseFloat(zrStyle[propName]));\n    });\n\n    if (!zrStyle.textBaseline || zrStyle.textBaseline === 'auto') {\n        zrStyle.textBaseline = 'alphabetic';\n    }\n    if (zrStyle.textBaseline === 'alphabetic') {\n        zrStyle.textBaseline = 'bottom';\n    }\n    if (zrStyle.textAlign === 'start') {\n        zrStyle.textAlign = 'left';\n    }\n    if (zrStyle.textAlign === 'end') {\n        zrStyle.textAlign = 'right';\n    }\n\n    each(['lineDashOffset', 'lineCap', 'lineJoin',\n        'fontWeight', 'fontFamily', 'fontStyle', 'textAlign', 'textBaseline'\n    ], function (propName) {\n        zrStyle[propName] != null && elStyle.set(propName, zrStyle[propName]);\n    });\n\n    if (zrStyle.lineDash) {\n        el.style.lineDash = trim(zrStyle.lineDash).split(DILIMITER_REG);\n    }\n\n    if (elStyle[elStrokeProp] && elStyle[elStrokeProp] !== 'none') {\n        // enable stroke\n        el[elStrokeProp] = true;\n    }\n\n    el.__inheritedStyle = zrStyle;\n}\n\n\nvar urlRegex = /url\\(\\s*#(.*?)\\)/;\nfunction getPaint(str, defs) {\n    // if (str === 'none') {\n    //     return;\n    // }\n    var urlMatch = defs && str && str.match(urlRegex);\n    if (urlMatch) {\n        var url = trim(urlMatch[1]);\n        var def = defs[url];\n        return def;\n    }\n    return str;\n}\n\nvar transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\\(([\\-\\s0-9\\.e,]*)\\)/g;\n\nfunction parseTransformAttribute(xmlNode, node) {\n    var transform = xmlNode.getAttribute('transform');\n    if (transform) {\n        transform = transform.replace(/,/g, ' ');\n        var m = null;\n        var transformOps = [];\n        transform.replace(transformRegex, function (str, type, value) {\n            transformOps.push(type, value);\n        });\n        for (var i = transformOps.length - 1; i > 0; i -= 2) {\n            var value = transformOps[i];\n            var type = transformOps[i - 1];\n            m = m || matrix.create();\n            switch (type) {\n                case 'translate':\n                    value = trim(value).split(DILIMITER_REG);\n                    matrix.translate(m, m, [parseFloat(value[0]), parseFloat(value[1] || 0)]);\n                    break;\n                case 'scale':\n                    value = trim(value).split(DILIMITER_REG);\n                    matrix.scale(m, m, [parseFloat(value[0]), parseFloat(value[1] || value[0])]);\n                    break;\n                case 'rotate':\n                    value = trim(value).split(DILIMITER_REG);\n                    matrix.rotate(m, m, parseFloat(value[0]));\n                    break;\n                case 'skew':\n                    value = trim(value).split(DILIMITER_REG);\n                    console.warn('Skew transform is not supported yet');\n                    break;\n                case 'matrix':\n                    var value = trim(value).split(DILIMITER_REG);\n                    m[0] = parseFloat(value[0]);\n                    m[1] = parseFloat(value[1]);\n                    m[2] = parseFloat(value[2]);\n                    m[3] = parseFloat(value[3]);\n                    m[4] = parseFloat(value[4]);\n                    m[5] = parseFloat(value[5]);\n                    break;\n            }\n        }\n        node.setLocalTransform(m);\n    }\n}\n\n// Value may contain space.\nvar styleRegex = /([^\\s:;]+)\\s*:\\s*([^:;]+)/g;\nfunction parseStyleAttribute(xmlNode) {\n    var style = xmlNode.getAttribute('style');\n    var result = {};\n\n    if (!style) {\n        return result;\n    }\n\n    var styleList = {};\n    styleRegex.lastIndex = 0;\n    var styleRegResult;\n    while ((styleRegResult = styleRegex.exec(style)) != null) {\n        styleList[styleRegResult[1]] = styleRegResult[2];\n    }\n\n    for (var svgAttrName in attributesMap) {\n        if (attributesMap.hasOwnProperty(svgAttrName) && styleList[svgAttrName] != null) {\n            result[attributesMap[svgAttrName]] = styleList[svgAttrName];\n        }\n    }\n\n    return result;\n}\n\n/**\n * @param {Array.<number>} viewBoxRect\n * @param {number} width\n * @param {number} height\n * @return {Object} {scale, position}\n */\nexport function makeViewBoxTransform(viewBoxRect, width, height) {\n    var scaleX = width / viewBoxRect.width;\n    var scaleY = height / viewBoxRect.height;\n    var scale = Math.min(scaleX, scaleY);\n    // preserveAspectRatio 'xMidYMid'\n    var viewBoxScale = [scale, scale];\n    var viewBoxPosition = [\n        -(viewBoxRect.x + viewBoxRect.width / 2) * scale + width / 2,\n        -(viewBoxRect.y + viewBoxRect.height / 2) * scale + height / 2\n    ];\n\n    return {\n        scale: viewBoxScale,\n        position: viewBoxPosition\n    };\n}\n\n/**\n * @param {string|XMLElement} xml\n * @param {Object} [opt]\n * @param {number} [opt.width] Default width if svg width not specified or is a percent value.\n * @param {number} [opt.height] Default height if svg height not specified or is a percent value.\n * @param {boolean} [opt.ignoreViewBox]\n * @param {boolean} [opt.ignoreRootClip]\n * @return {Object} result:\n * {\n *     root: Group, The root of the the result tree of zrender shapes,\n *     width: number, the viewport width of the SVG,\n *     height: number, the viewport height of the SVG,\n *     viewBoxRect: {x, y, width, height}, the declared viewBox rect of the SVG, if exists,\n *     viewBoxTransform: the {scale, position} calculated by viewBox and viewport, is exists.\n * }\n */\nexport function parseSVG(xml, opt) {\n    var parser = new SVGParser();\n    return parser.parse(xml, opt);\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport {createHashMap, isString, isArray, each, assert} from 'zrender/src/core/util';\nimport {parseXML} from 'zrender/src/tool/parseSVG';\n\n\nvar storage = createHashMap();\n\n// For minimize the code size of common echarts package,\n// do not put too much logic in this module.\n\nexport default {\n\n    // The format of record: see `echarts.registerMap`.\n    // Compatible with previous `echarts.registerMap`.\n    registerMap: function (mapName, rawGeoJson, rawSpecialAreas) {\n\n        var records;\n\n        if (isArray(rawGeoJson)) {\n            records = rawGeoJson;\n        }\n        else if (rawGeoJson.svg) {\n            records = [{\n                type: 'svg',\n                source: rawGeoJson.svg,\n                specialAreas: rawGeoJson.specialAreas\n            }];\n        }\n        else {\n            // Backward compatibility.\n            if (rawGeoJson.geoJson && !rawGeoJson.features) {\n                rawSpecialAreas = rawGeoJson.specialAreas;\n                rawGeoJson = rawGeoJson.geoJson;\n            }\n            records = [{\n                type: 'geoJSON',\n                source: rawGeoJson,\n                specialAreas: rawSpecialAreas\n            }];\n        }\n\n        each(records, function (record) {\n            var type = record.type;\n            type === 'geoJson' && (type = record.type = 'geoJSON');\n\n            var parse = parsers[type];\n\n            if (__DEV__) {\n                assert(parse, 'Illegal map type: ' + type);\n            }\n\n            parse(record);\n        });\n\n        return storage.set(mapName, records);\n    },\n\n    retrieveMap: function (mapName) {\n        return storage.get(mapName);\n    }\n\n};\n\nvar parsers = {\n\n    geoJSON: function (record) {\n        var source = record.source;\n        record.geoJSON = !isString(source)\n            ? source\n            : (typeof JSON !== 'undefined' && JSON.parse)\n            ? JSON.parse(source)\n            : (new Function('return (' + source + ');'))();\n    },\n\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    svg: function (record) {\n        record.svgXML = parseXML(record.source);\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*/\nimport {__DEV__} from './config';\nimport * as zrender from 'zrender/src/zrender';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as colorTool from 'zrender/src/tool/color';\nimport env from 'zrender/src/core/env';\nimport timsort from 'zrender/src/core/timsort';\nimport Eventful from 'zrender/src/mixin/Eventful';\nimport GlobalModel from './model/Global';\nimport ExtensionAPI from './ExtensionAPI';\nimport CoordinateSystemManager from './CoordinateSystem';\nimport OptionManager from './model/OptionManager';\nimport backwardCompat from './preprocessor/backwardCompat';\nimport dataStack from './processor/dataStack';\nimport ComponentModel from './model/Component';\nimport SeriesModel from './model/Series';\nimport ComponentView from './view/Component';\nimport ChartView from './view/Chart';\nimport * as graphic from './util/graphic';\nimport * as modelUtil from './util/model';\nimport {throttle} from './util/throttle';\nimport seriesColor from './visual/seriesColor';\nimport aria from './visual/aria';\nimport loadingDefault from './loading/default';\nimport Scheduler from './stream/Scheduler';\nimport lightTheme from './theme/light';\nimport darkTheme from './theme/dark';\nimport './component/dataset';\nimport mapDataStorage from './coord/geo/mapDataStorage';\n\nvar assert = zrUtil.assert;\nvar each = zrUtil.each;\nvar isFunction = zrUtil.isFunction;\nvar isObject = zrUtil.isObject;\nvar parseClassType = ComponentModel.parseClassType;\n\nexport var version = '4.3.0';\n\nexport var dependencies = {\n    zrender: '4.1.0'\n};\n\nvar TEST_FRAME_REMAIN_TIME = 1;\n\nvar PRIORITY_PROCESSOR_FILTER = 1000;\nvar PRIORITY_PROCESSOR_STATISTIC = 5000;\n\nvar PRIORITY_VISUAL_LAYOUT = 1000;\nvar PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100;\nvar PRIORITY_VISUAL_GLOBAL = 2000;\nvar PRIORITY_VISUAL_CHART = 3000;\nvar PRIORITY_VISUAL_POST_CHART_LAYOUT = 3500;\nvar PRIORITY_VISUAL_COMPONENT = 4000;\n// FIXME\n// necessary?\nvar PRIORITY_VISUAL_BRUSH = 5000;\n\nexport var PRIORITY = {\n    PROCESSOR: {\n        FILTER: PRIORITY_PROCESSOR_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    }\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 = '__flagInMainProcess';\nvar OPTION_UPDATED = '__optionUpdated';\nvar ACTION_REG = /^[a-zA-Z0-9_]+$/;\n\n\nfunction createRegisterEventWithLowercaseName(method) {\n    return function (eventName, handler, context) {\n        // Event name is all lowercase\n        eventName = eventName && eventName.toLowerCase();\n        Eventful.prototype[method].call(this, eventName, handler, context);\n    };\n}\n\n/**\n * @module echarts~MessageCenter\n */\nfunction MessageCenter() {\n    Eventful.call(this);\n}\nMessageCenter.prototype.on = createRegisterEventWithLowercaseName('on');\nMessageCenter.prototype.off = createRegisterEventWithLowercaseName('off');\nMessageCenter.prototype.one = createRegisterEventWithLowercaseName('one');\nzrUtil.mixin(MessageCenter, Eventful);\n\n/**\n * @module echarts~ECharts\n */\nfunction ECharts(dom, theme, opts) {\n    opts = opts || {};\n\n    // Get theme by name\n    if (typeof theme === 'string') {\n        theme = themeStorage[theme];\n    }\n\n    /**\n     * @type {string}\n     */\n    this.id;\n\n    /**\n     * Group id\n     * @type {string}\n     */\n    this.group;\n\n    /**\n     * @type {HTMLElement}\n     * @private\n     */\n    this._dom = dom;\n\n    var defaultRenderer = 'canvas';\n    if (__DEV__) {\n        defaultRenderer = (\n            typeof window === 'undefined' ? global : window\n        ).__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer;\n    }\n\n    /**\n     * @type {module:zrender/ZRender}\n     * @private\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    });\n\n    /**\n     * Expect 60 fps.\n     * @type {Function}\n     * @private\n     */\n    this._throttledZrFlush = throttle(zrUtil.bind(zr.flush, zr), 17);\n\n    var theme = zrUtil.clone(theme);\n    theme && backwardCompat(theme, true);\n    /**\n     * @type {Object}\n     * @private\n     */\n    this._theme = theme;\n\n    /**\n     * @type {Array.<module:echarts/view/Chart>}\n     * @private\n     */\n    this._chartsViews = [];\n\n    /**\n     * @type {Object.<string, module:echarts/view/Chart>}\n     * @private\n     */\n    this._chartsMap = {};\n\n    /**\n     * @type {Array.<module:echarts/view/Component>}\n     * @private\n     */\n    this._componentsViews = [];\n\n    /**\n     * @type {Object.<string, module:echarts/view/Component>}\n     * @private\n     */\n    this._componentsMap = {};\n\n    /**\n     * @type {module:echarts/CoordinateSystem}\n     * @private\n     */\n    this._coordSysMgr = new CoordinateSystemManager();\n\n    /**\n     * @type {module:echarts/ExtensionAPI}\n     * @private\n     */\n    var api = this._api = createExtensionAPI(this);\n\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\n    /**\n     * @type {module:echarts/stream/Scheduler}\n     */\n    this._scheduler = new Scheduler(this, api, dataProcessorFuncs, visualFuncs);\n\n    Eventful.call(this, this._ecEventProcessor = new EventProcessor());\n\n    /**\n     * @type {module:echarts~MessageCenter}\n     * @private\n     */\n    this._messageCenter = new MessageCenter();\n\n    // Init mouse events\n    this._initEvents();\n\n    // In case some people write `window.onresize = chart.resize`\n    this.resize = zrUtil.bind(this.resize, this);\n\n    // Can't dispatch action during rendering procedure\n    this._pendingActions = [];\n\n    zr.animation.on('frame', this._onframe, this);\n\n    bindRenderedEvent(zr, this);\n\n    // ECharts instance can be used as value.\n    zrUtil.setAsPrimitive(this);\n}\n\nvar echartsProto = ECharts.prototype;\n\nechartsProto._onframe = function () {\n    if (this._disposed) {\n        return;\n    }\n\n    var scheduler = this._scheduler;\n\n    // Lazy update\n    if (this[OPTION_UPDATED]) {\n        var silent = this[OPTION_UPDATED].silent;\n\n        this[IN_MAIN_PROCESS] = true;\n\n        prepare(this);\n        updateMethods.update.call(this);\n\n        this[IN_MAIN_PROCESS] = false;\n\n        this[OPTION_UPDATED] = false;\n\n        flushPendingActions.call(this, silent);\n\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\n            scheduler.performSeriesTasks(ecModel);\n\n            // Currently dataProcessorFuncs do not check threshold.\n            scheduler.performDataProcessorTasks(ecModel);\n\n            updateStreamModes(this, ecModel);\n\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 determin in the first frame (the\n            // frame is executed immedietely after task reset.\n            // this._coordSysMgr.update(ecModel, api);\n\n            // console.log('--- ec frame visual ---', remainTime);\n            scheduler.performVisualTasks(ecModel);\n\n            renderSeries(this, this._model, api, 'remain');\n\n            remainTime -= (+new Date() - startTime);\n        }\n        while (remainTime > 0 && scheduler.unfinished);\n\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\n/**\n * @return {HTMLElement}\n */\nechartsProto.getDom = function () {\n    return this._dom;\n};\n\n/**\n * @return {module:zrender~ZRender}\n */\nechartsProto.getZr = function () {\n    return this._zr;\n};\n\n/**\n * Usage:\n * chart.setOption(option, notMerge, lazyUpdate);\n * chart.setOption(option, {\n *     notMerge: ...,\n *     lazyUpdate: ...,\n *     silent: ...\n * });\n *\n * @param {Object} option\n * @param {Object|boolean} [opts] opts or notMerge.\n * @param {boolean} [opts.notMerge=false]\n * @param {boolean} [opts.lazyUpdate=false] Useful when setOption frequently.\n */\nechartsProto.setOption = function (option, notMerge, lazyUpdate) {\n    if (__DEV__) {\n        assert(!this[IN_MAIN_PROCESS], '`setOption` should not be called during main process.');\n    }\n\n    var silent;\n    if (isObject(notMerge)) {\n        lazyUpdate = notMerge.lazyUpdate;\n        silent = notMerge.silent;\n        notMerge = notMerge.notMerge;\n    }\n\n    this[IN_MAIN_PROCESS] = true;\n\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.init(null, null, theme, optionManager);\n    }\n\n    this._model.setOption(option, optionPreprocessorFuncs);\n\n    if (lazyUpdate) {\n        this[OPTION_UPDATED] = {silent: silent};\n        this[IN_MAIN_PROCESS] = false;\n    }\n    else {\n        prepare(this);\n\n        updateMethods.update.call(this);\n\n        // Ensure zr refresh sychronously, and then pixel in canvas can be\n        // fetched after `setOption`.\n        this._zr.flush();\n\n        this[OPTION_UPDATED] = false;\n        this[IN_MAIN_PROCESS] = false;\n\n        flushPendingActions.call(this, silent);\n        triggerUpdatedEvent.call(this, silent);\n    }\n};\n\n/**\n * @DEPRECATED\n */\nechartsProto.setTheme = function () {\n    console.error('ECharts#setTheme() is DEPRECATED in ECharts 3.0');\n};\n\n/**\n * @return {module:echarts/model/Global}\n */\nechartsProto.getModel = function () {\n    return this._model;\n};\n\n/**\n * @return {Object}\n */\nechartsProto.getOption = function () {\n    return this._model && this._model.getOption();\n};\n\n/**\n * @return {number}\n */\nechartsProto.getWidth = function () {\n    return this._zr.getWidth();\n};\n\n/**\n * @return {number}\n */\nechartsProto.getHeight = function () {\n    return this._zr.getHeight();\n};\n\n/**\n * @return {number}\n */\nechartsProto.getDevicePixelRatio = function () {\n    return this._zr.painter.dpr || window.devicePixelRatio || 1;\n};\n\n/**\n * Get canvas which has all thing rendered\n * @param {Object} opts\n * @param {string} [opts.backgroundColor]\n * @return {string}\n */\nechartsProto.getRenderedCanvas = function (opts) {\n    if (!env.canvasSupported) {\n        return;\n    }\n    opts = opts || {};\n    opts.pixelRatio = opts.pixelRatio || 1;\n    opts.backgroundColor = opts.backgroundColor\n        || this._model.get('backgroundColor');\n    var zr = this._zr;\n    // var list = zr.storage.getDisplayList();\n    // Stop animations\n    // Never works before in init animation, so remove it.\n    // zrUtil.each(list, function (el) {\n    //     el.stopAnimation(true);\n    // });\n    return zr.painter.getRenderedCanvas(opts);\n};\n\n/**\n * Get svg data url\n * @return {string}\n */\nechartsProto.getSvgDataUrl = function () {\n    if (!env.svgSupported) {\n        return;\n    }\n\n    var zr = this._zr;\n    var list = zr.storage.getDisplayList();\n    // Stop animations\n    zrUtil.each(list, function (el) {\n        el.stopAnimation(true);\n    });\n\n    return zr.painter.pathToDataUrl();\n};\n\n/**\n * @return {string}\n * @param {Object} opts\n * @param {string} [opts.type='png']\n * @param {string} [opts.pixelRatio=1]\n * @param {string} [opts.backgroundColor]\n * @param {string} [opts.excludeComponents]\n */\nechartsProto.getDataURL = function (opts) {\n    opts = opts || {};\n    var excludeComponents = opts.excludeComponents;\n    var ecModel = this._model;\n    var excludesComponentViews = [];\n    var self = this;\n\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\n    var url = this._zr.painter.getType() === 'svg'\n        ? this.getSvgDataUrl()\n        : this.getRenderedCanvas(opts).toDataURL(\n            'image/' + (opts && opts.type || 'png')\n        );\n\n    each(excludesComponentViews, function (view) {\n        view.group.ignore = false;\n    });\n\n    return url;\n};\n\n\n/**\n * @return {string}\n * @param {Object} opts\n * @param {string} [opts.type='png']\n * @param {string} [opts.pixelRatio=1]\n * @param {string} [opts.backgroundColor]\n */\nechartsProto.getConnectedDataURL = function (opts) {\n    if (!env.canvasSupported) {\n        return;\n    }\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 = MAX_NUMBER;\n        var top = MAX_NUMBER;\n        var right = -MAX_NUMBER;\n        var bottom = -MAX_NUMBER;\n        var canvasList = [];\n        var dpr = (opts && opts.pixelRatio) || 1;\n\n        zrUtil.each(instances, function (chart, id) {\n            if (chart.group === groupId) {\n                var canvas = chart.getRenderedCanvas(\n                    zrUtil.clone(opts)\n                );\n                var boundingRect = chart.getDom().getBoundingClientRect();\n                left = mathMin(boundingRect.left, left);\n                top = mathMin(boundingRect.top, top);\n                right = mathMax(boundingRect.right, right);\n                bottom = mathMax(boundingRect.bottom, bottom);\n                canvasList.push({\n                    dom: canvas,\n                    left: boundingRect.left,\n                    top: boundingRect.top\n                });\n            }\n        });\n\n        left *= dpr;\n        top *= dpr;\n        right *= dpr;\n        bottom *= dpr;\n        var width = right - left;\n        var height = bottom - top;\n        var targetCanvas = zrUtil.createCanvas();\n        targetCanvas.width = width;\n        targetCanvas.height = height;\n        var zr = zrender.init(targetCanvas);\n\n        // Background between the charts\n        if (opts.connectedBackgroundColor) {\n            zr.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\n        each(canvasList, function (item) {\n            var img = new graphic.Image({\n                style: {\n                    x: item.left * dpr - left,\n                    y: item.top * dpr - top,\n                    image: item.dom\n                }\n            });\n            zr.add(img);\n        });\n        zr.refreshImmediately();\n\n        return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));\n    }\n    else {\n        return this.getDataURL(opts);\n    }\n};\n\n/**\n * Convert from logical coordinate system to pixel coordinate system.\n * See CoordinateSystem#convertToPixel.\n * @param {string|Object} finder\n *        If string, e.g., 'geo', means {geoIndex: 0}.\n *        If Object, could contain some of these properties below:\n *        {\n *            seriesIndex / seriesId / seriesName,\n *            geoIndex / geoId, geoName,\n *            bmapIndex / bmapId / bmapName,\n *            xAxisIndex / xAxisId / xAxisName,\n *            yAxisIndex / yAxisId / yAxisName,\n *            gridIndex / gridId / gridName,\n *            ... (can be extended)\n *        }\n * @param {Array|number} value\n * @return {Array|number} result\n */\nechartsProto.convertToPixel = zrUtil.curry(doConvertPixel, 'convertToPixel');\n\n/**\n * Convert from pixel coordinate system to logical coordinate system.\n * See CoordinateSystem#convertFromPixel.\n * @param {string|Object} finder\n *        If string, e.g., 'geo', means {geoIndex: 0}.\n *        If Object, could contain some of these properties below:\n *        {\n *            seriesIndex / seriesId / seriesName,\n *            geoIndex / geoId / geoName,\n *            bmapIndex / bmapId / bmapName,\n *            xAxisIndex / xAxisId / xAxisName,\n *            yAxisIndex / yAxisId / yAxisName\n *            gridIndex / gridId / gridName,\n *            ... (can be extended)\n *        }\n * @param {Array|number} value\n * @return {Array|number} result\n */\nechartsProto.convertFromPixel = zrUtil.curry(doConvertPixel, 'convertFromPixel');\n\nfunction doConvertPixel(methodName, finder, value) {\n    var ecModel = this._model;\n    var coordSysList = this._coordSysMgr.getCoordinateSystems();\n    var result;\n\n    finder = modelUtil.parseFinder(ecModel, finder);\n\n    for (var i = 0; i < coordSysList.length; i++) {\n        var coordSys = coordSysList[i];\n        if (coordSys[methodName]\n            && (result = coordSys[methodName](ecModel, finder, value)) != null\n        ) {\n            return result;\n        }\n    }\n\n    if (__DEV__) {\n        console.warn(\n            'No coordinate system that supports ' + methodName + ' found by the given finder.'\n        );\n    }\n}\n\n/**\n * Is the specified coordinate systems or components contain the given pixel point.\n * @param {string|Object} finder\n *        If string, e.g., 'geo', means {geoIndex: 0}.\n *        If Object, could contain some of these properties below:\n *        {\n *            seriesIndex / seriesId / seriesName,\n *            geoIndex / geoId / geoName,\n *            bmapIndex / bmapId / bmapName,\n *            xAxisIndex / xAxisId / xAxisName,\n *            yAxisIndex / yAxisId / yAxisName,\n *            gridIndex / gridId / gridName,\n *            ... (can be extended)\n *        }\n * @param {Array|number} value\n * @return {boolean} result\n */\nechartsProto.containPixel = function (finder, value) {\n    var ecModel = this._model;\n    var result;\n\n    finder = modelUtil.parseFinder(ecModel, finder);\n\n    zrUtil.each(finder, function (models, key) {\n        key.indexOf('Models') >= 0 && zrUtil.each(models, function (model) {\n            var coordSys = model.coordinateSystem;\n            if (coordSys && coordSys.containPoint) {\n                result |= !!coordSys.containPoint(value);\n            }\n            else if (key === 'seriesModels') {\n                var view = this._chartsMap[model.__viewId];\n                if (view && view.containPoint) {\n                    result |= view.containPoint(value, model);\n                }\n                else {\n                    if (__DEV__) {\n                        console.warn(key + ': ' + (view\n                            ? 'The found component do not support containPoint.'\n                            : 'No view mapping to the found component.'\n                        ));\n                    }\n                }\n            }\n            else {\n                if (__DEV__) {\n                    console.warn(key + ': containPoint is not supported');\n                }\n            }\n        }, this);\n    }, this);\n\n    return !!result;\n};\n\n/**\n * Get visual from series or data.\n * @param {string|Object} 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 {string} visualType 'color', 'symbol', 'symbolSize'\n */\nechartsProto.getVisual = function (finder, visualType) {\n    var ecModel = this._model;\n\n    finder = modelUtil.parseFinder(ecModel, finder, {defaultMainType: 'series'});\n\n    var seriesModel = finder.seriesModel;\n\n    if (__DEV__) {\n        if (!seriesModel) {\n            console.warn('There is no specified seires model');\n        }\n    }\n\n    var data = seriesModel.getData();\n\n    var dataIndexInside = finder.hasOwnProperty('dataIndexInside')\n        ? finder.dataIndexInside\n        : finder.hasOwnProperty('dataIndex')\n        ? data.indexOfRawIndex(finder.dataIndex)\n        : null;\n\n    return dataIndexInside != null\n        ? data.getItemVisual(dataIndexInside, visualType)\n        : data.getVisual(visualType);\n};\n\n/**\n * Get view of corresponding component model\n * @param  {module:echarts/model/Component} componentModel\n * @return {module:echarts/view/Component}\n */\nechartsProto.getViewOfComponentModel = function (componentModel) {\n    return this._componentsMap[componentModel.__viewId];\n};\n\n/**\n * Get view of corresponding series model\n * @param  {module:echarts/model/Series} seriesModel\n * @return {module:echarts/view/Chart}\n */\nechartsProto.getViewOfSeriesModel = function (seriesModel) {\n    return this._chartsMap[seriesModel.__viewId];\n};\n\nvar updateMethods = {\n\n    prepareAndUpdate: function (payload) {\n        prepare(this);\n        updateMethods.update.call(this, payload);\n    },\n\n    /**\n     * @param {Object} payload\n     * @private\n     */\n    update: function (payload) {\n        // console.profile && console.profile('update');\n\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\n        // update before setOption\n        if (!ecModel) {\n            return;\n        }\n\n        scheduler.restoreData(ecModel, payload);\n\n        scheduler.performSeriesTasks(ecModel);\n\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\n        // Create new coordinate system each update\n        // In LineView may save the old coordinate system and use it to get the orignal point\n        coordSysMgr.create(ecModel, api);\n\n        scheduler.performDataProcessorTasks(ecModel, payload);\n\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        // deteming whether use progressive rendering.\n        updateStreamModes(this, ecModel);\n\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 requied in stream mode updater currently.\n        coordSysMgr.update(ecModel, api);\n\n        clearColorPalette(ecModel);\n        scheduler.performVisualTasks(ecModel, payload);\n\n        render(this, ecModel, api, payload);\n\n        // Set background\n        var backgroundColor = ecModel.get('backgroundColor') || 'transparent';\n\n        // In IE8\n        if (!env.canvasSupported) {\n            var colorArr = colorTool.parse(backgroundColor);\n            backgroundColor = colorTool.stringify(colorArr, 'rgb');\n            if (colorArr[3] === 0) {\n                backgroundColor = 'transparent';\n            }\n        }\n        else {\n            zr.setBackgroundColor(backgroundColor);\n        }\n\n        performPostUpdateFuncs(ecModel, api);\n\n        // console.profile && console.profileEnd('update');\n    },\n\n    /**\n     * @param {Object} payload\n     * @private\n     */\n    updateTransform: function (payload) {\n        var ecModel = this._model;\n        var ecIns = this;\n        var api = this._api;\n\n        // update before setOption\n        if (!ecModel) {\n            return;\n        }\n\n        // ChartView.markUpdateMethod(payload, 'updateTransform');\n\n        var componentDirtyList = [];\n        ecModel.eachComponent(function (componentType, componentModel) {\n            var componentView = ecIns.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                }\n                else {\n                    componentDirtyList.push(componentView);\n                }\n            }\n        });\n\n        var seriesDirtyMap = zrUtil.createHashMap();\n        ecModel.eachSeries(function (seriesModel) {\n            var chartView = ecIns._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            }\n            else {\n                seriesDirtyMap.set(seriesModel.uid, 1);\n            }\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(\n            ecModel, payload, {setDirty: true, dirtyMap: seriesDirtyMap}\n        );\n\n        // Currently, not call render of components. Geo render cost a lot.\n        // renderComponents(ecIns, ecModel, api, payload, componentDirtyList);\n        renderSeries(ecIns, ecModel, api, payload, seriesDirtyMap);\n\n        performPostUpdateFuncs(ecModel, this._api);\n    },\n\n    /**\n     * @param {Object} payload\n     * @private\n     */\n    updateView: function (payload) {\n        var ecModel = this._model;\n\n        // update before setOption\n        if (!ecModel) {\n            return;\n        }\n\n        ChartView.markUpdateMethod(payload, 'updateView');\n\n        clearColorPalette(ecModel);\n\n        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n        this._scheduler.performVisualTasks(ecModel, payload, {setDirty: true});\n\n        render(this, this._model, this._api, payload);\n\n        performPostUpdateFuncs(ecModel, this._api);\n    },\n\n    /**\n     * @param {Object} payload\n     * @private\n     */\n    updateVisual: function (payload) {\n        updateMethods.update.call(this, payload);\n\n        // var ecModel = this._model;\n\n        // // update before setOption\n        // if (!ecModel) {\n        //     return;\n        // }\n\n        // ChartView.markUpdateMethod(payload, 'updateVisual');\n\n        // clearColorPalette(ecModel);\n\n        // // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n        // this._scheduler.performVisualTasks(ecModel, payload, {visualType: 'visual', setDirty: true});\n\n        // render(this, this._model, this._api, payload);\n\n        // performPostUpdateFuncs(ecModel, this._api);\n    },\n\n    /**\n     * @param {Object} payload\n     * @private\n     */\n    updateLayout: function (payload) {\n        updateMethods.update.call(this, payload);\n\n        // var ecModel = this._model;\n\n        // // update before setOption\n        // if (!ecModel) {\n        //     return;\n        // }\n\n        // ChartView.markUpdateMethod(payload, 'updateLayout');\n\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, {setDirty: true});\n\n        // render(this, this._model, this._api, payload);\n\n        // performPostUpdateFuncs(ecModel, this._api);\n    }\n};\n\nfunction prepare(ecIns) {\n    var ecModel = ecIns._model;\n    var scheduler = ecIns._scheduler;\n\n    scheduler.restorePipelines(ecModel);\n\n    scheduler.prepareStageTasks();\n\n    prepareView(ecIns, 'component', ecModel, scheduler);\n\n    prepareView(ecIns, 'chart', ecModel, scheduler);\n\n    scheduler.plan();\n}\n\n/**\n * @private\n */\nfunction updateDirectly(ecIns, method, payload, mainType, subType) {\n    var ecModel = ecIns._model;\n\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(ecIns._componentsViews.concat(ecIns._chartsViews), callView);\n        return;\n    }\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\n    var condition = {mainType: mainType, query: query};\n    subType && (condition.subType = subType); // subType may be '' by parseClassType;\n\n    var excludeSeriesId = payload.excludeSeriesId;\n    if (excludeSeriesId != null) {\n        excludeSeriesId = zrUtil.createHashMap(modelUtil.normalizeToArray(excludeSeriesId));\n    }\n\n    // If dispatchAction before setOption, do nothing.\n    ecModel && ecModel.eachComponent(condition, function (model) {\n        if (!excludeSeriesId || excludeSeriesId.get(model.id) == null) {\n            callView(ecIns[\n                mainType === 'series' ? '_chartsMap' : '_componentsMap'\n            ][model.__viewId]);\n        }\n    }, ecIns);\n\n    function callView(view) {\n        view && view.__alive && view[method] && view[method](\n            view.__model, ecModel, ecIns._api, payload\n        );\n    }\n}\n\n/**\n * Resize the chart\n * @param {Object} opts\n * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)\n * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)\n * @param {boolean} [opts.silent=false]\n */\nechartsProto.resize = function (opts) {\n    if (__DEV__) {\n        assert(!this[IN_MAIN_PROCESS], '`resize` should not be called during main process.');\n    }\n\n    this._zr.resize(opts);\n\n    var ecModel = this._model;\n\n    // Resize loading effect\n    this._loadingFX && this._loadingFX.resize();\n\n    if (!ecModel) {\n        return;\n    }\n\n    var optionChanged = ecModel.resetOption('media');\n\n    var silent = opts && opts.silent;\n\n    this[IN_MAIN_PROCESS] = true;\n\n    optionChanged && prepare(this);\n    updateMethods.update.call(this);\n\n    this[IN_MAIN_PROCESS] = false;\n\n    flushPendingActions.call(this, silent);\n\n    triggerUpdatedEvent.call(this, silent);\n};\n\nfunction updateStreamModes(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\n/**\n * Show loading effect\n * @param  {string} [name='default']\n * @param  {Object} [cfg]\n */\nechartsProto.showLoading = function (name, cfg) {\n    if (isObject(name)) {\n        cfg = name;\n        name = '';\n    }\n    name = name || 'default';\n\n    this.hideLoading();\n    if (!loadingEffects[name]) {\n        if (__DEV__) {\n            console.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\n    zr.add(el);\n};\n\n/**\n * Hide loading effect\n */\nechartsProto.hideLoading = function () {\n    this._loadingFX && this._zr.remove(this._loadingFX);\n    this._loadingFX = null;\n};\n\n/**\n * @param {Object} eventObj\n * @return {Object}\n */\nechartsProto.makeActionFromEvent = function (eventObj) {\n    var payload = zrUtil.extend({}, eventObj);\n    payload.type = eventActionMap[eventObj.type];\n    return payload;\n};\n\n/**\n * @pubilc\n * @param {Object} payload\n * @param {string} [payload.type] Action type\n * @param {Object|boolean} [opt] If pass boolean, means opt.silent\n * @param {boolean} [opt.silent=false] Whether trigger events.\n * @param {boolean} [opt.flush=undefined]\n *                  true: Flush immediately, and then pixel in canvas can be fetched\n *                      immediately. Caution: it might affect performance.\n *                  false: Not not flush.\n *                  undefined: Auto decide whether perform flush.\n */\nechartsProto.dispatchAction = function (payload, opt) {\n    if (!isObject(opt)) {\n        opt = {silent: !!opt};\n    }\n\n    if (!actions[payload.type]) {\n        return;\n    }\n\n    // Avoid dispatch action before setOption. Especially in `connect`.\n    if (!this._model) {\n        return;\n    }\n\n    // May dispatchAction in rendering procedure\n    if (this[IN_MAIN_PROCESS]) {\n        this._pendingActions.push(payload);\n        return;\n    }\n\n    doDispatchAction.call(this, payload, opt.silent);\n\n    if (opt.flush) {\n        this._zr.flush(true);\n    }\n    else if (opt.flush !== false && env.browser.weChat) {\n        // In WeChat embeded browser, `requestAnimationFrame` and `setInterval`\n        // hang when sliding page (on touch event), which cause that zr does not\n        // refresh util 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\n    flushPendingActions.call(this, opt.silent);\n\n    triggerUpdatedEvent.call(this, opt.silent);\n};\n\nfunction doDispatchAction(payload, silent) {\n    var payloadType = payload.type;\n    var escapeConnect = payload.escapeConnect;\n    var actionWrap = actions[payloadType];\n    var actionInfo = actionWrap.actionInfo;\n\n    var cptType = (actionInfo.update || 'update').split(':');\n    var updateMethod = cptType.pop();\n    cptType = cptType[0] != null && parseClassType(cptType[0]);\n\n    this[IN_MAIN_PROCESS] = true;\n\n    var payloads = [payload];\n    var batched = false;\n    // Batch action\n    if (payload.batch) {\n        batched = true;\n        payloads = zrUtil.map(payload.batch, function (item) {\n            item = zrUtil.defaults(zrUtil.extend({}, item), payload);\n            item.batch = null;\n            return item;\n        });\n    }\n\n    var eventObjBatch = [];\n    var eventObj;\n    var isHighDown = payloadType === 'highlight' || payloadType === 'downplay';\n\n    each(payloads, function (batchItem) {\n        // Action can specify the event by return it.\n        eventObj = actionWrap.action(batchItem, this._model, this._api);\n        // Emit event outside\n        eventObj = eventObj || zrUtil.extend({}, batchItem);\n        // Convert type to eventType\n        eventObj.type = actionInfo.event || eventObj.type;\n        eventObjBatch.push(eventObj);\n\n        // light update does not perform data process, layout and visual.\n        if (isHighDown) {\n            // method, payload, mainType, subType\n            updateDirectly(this, updateMethod, batchItem, 'series');\n        }\n        else if (cptType) {\n            updateDirectly(this, updateMethod, batchItem, cptType.main, cptType.sub);\n        }\n    }, this);\n\n    if (updateMethod !== 'none' && !isHighDown && !cptType) {\n        // Still dirty\n        if (this[OPTION_UPDATED]) {\n            // FIXME Pass payload ?\n            prepare(this);\n            updateMethods.update.call(this, payload);\n            this[OPTION_UPDATED] = false;\n        }\n        else {\n            updateMethods[updateMethod].call(this, payload);\n        }\n    }\n\n    // Follow the rule of action batch\n    if (batched) {\n        eventObj = {\n            type: actionInfo.event || payloadType,\n            escapeConnect: escapeConnect,\n            batch: eventObjBatch\n        };\n    }\n    else {\n        eventObj = eventObjBatch[0];\n    }\n\n    this[IN_MAIN_PROCESS] = false;\n\n    !silent && this._messageCenter.trigger(eventObj.type, eventObj);\n}\n\nfunction flushPendingActions(silent) {\n    var pendingActions = this._pendingActions;\n    while (pendingActions.length) {\n        var payload = pendingActions.shift();\n        doDispatchAction.call(this, payload, silent);\n    }\n}\n\nfunction triggerUpdatedEvent(silent) {\n    !silent && this.trigger('updated');\n}\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 */\nfunction bindRenderedEvent(zr, ecIns) {\n    zr.on('rendered', function () {\n\n        ecIns.trigger('rendered');\n\n        // The `finished` event should not be triggered repeatly,\n        // so it should only be triggered when rendering indeed happend\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()\n            && !ecIns[OPTION_UPDATED]\n            && !ecIns._scheduler.unfinished\n            && !ecIns._pendingActions.length\n        ) {\n            ecIns.trigger('finished');\n        }\n    });\n}\n\n/**\n * @param {Object} params\n * @param {number} params.seriesIndex\n * @param {Array|TypedArray} params.data\n */\nechartsProto.appendData = function (params) {\n    var seriesIndex = params.seriesIndex;\n    var ecModel = this.getModel();\n    var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n\n    if (__DEV__) {\n        assert(params.data && seriesModel);\n    }\n\n    seriesModel.appendData(params);\n\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\n    this._scheduler.unfinished = true;\n};\n\n/**\n * Register event\n * @method\n */\nechartsProto.on = createRegisterEventWithLowercaseName('on');\nechartsProto.off = createRegisterEventWithLowercaseName('off');\nechartsProto.one = createRegisterEventWithLowercaseName('one');\n\n/**\n * Prepare view instances of charts and components\n * @param  {module:echarts/model/Global} ecModel\n * @private\n */\nfunction prepareView(ecIns, type, ecModel, scheduler) {\n    var isComponent = type === 'component';\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\n    for (var i = 0; i < viewList.length; i++) {\n        viewList[i].__alive = false;\n    }\n\n    isComponent\n        ? ecModel.eachComponent(function (componentType, model) {\n            componentType !== 'series' && doPrepare(model);\n        })\n        : ecModel.eachSeries(doPrepare);\n\n    function doPrepare(model) {\n        // Consider: id same and type changed.\n        var viewId = '_ec_' + model.id + '_' + model.type;\n        var view = viewMap[viewId];\n        if (!view) {\n            var classType = parseClassType(model.type);\n            var Clazz = isComponent\n                ? ComponentView.getClass(classType.main, classType.sub)\n                : ChartView.getClass(classType.sub);\n\n            if (__DEV__) {\n                assert(Clazz, classType.sub + ' does not exist.');\n            }\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\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\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            delete viewMap[view.__id];\n            view.__id = view.group.__ecComponentInfo = null;\n        }\n        else {\n            i++;\n        }\n    }\n}\n\n// /**\n//  * Encode visual infomation from data after data processing\n//  *\n//  * @param {module:echarts/model/Global} ecModel\n//  * @param {object} layout\n//  * @param {boolean} [layoutFilter] `true`: only layout,\n//  *                                 `false`: only not layout,\n//  *                                 `null`/`undefined`: all.\n//  * @param {string} taskBaseTag\n//  * @private\n//  */\n// function startVisualEncoding(ecIns, ecModel, api, payload, layoutFilter) {\n//     each(visualFuncs, function (visual, index) {\n//         var isLayout = visual.isLayout;\n//         if (layoutFilter == null\n//             || (layoutFilter === false && !isLayout)\n//             || (layoutFilter === true && isLayout)\n//         ) {\n//             visual.func(ecModel, api, payload);\n//         }\n//     });\n// }\n\nfunction clearColorPalette(ecModel) {\n    ecModel.clearColorPalette();\n    ecModel.eachSeries(function (seriesModel) {\n        seriesModel.clearColorPalette();\n    });\n}\n\nfunction render(ecIns, ecModel, api, payload) {\n\n    renderComponents(ecIns, ecModel, api, payload);\n\n    each(ecIns._chartsViews, function (chart) {\n        chart.__alive = false;\n    });\n\n    renderSeries(ecIns, ecModel, api, payload);\n\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\nfunction renderComponents(ecIns, ecModel, api, payload, dirtyList) {\n    each(dirtyList || ecIns._componentsViews, function (componentView) {\n        var componentModel = componentView.__model;\n        componentView.render(componentModel, ecModel, api, payload);\n\n        updateZ(componentModel, componentView);\n    });\n}\n\n/**\n * Render each chart and component\n * @private\n */\nfunction renderSeries(ecIns, ecModel, api, payload, dirtyMap) {\n    // Render all charts\n    var scheduler = ecIns._scheduler;\n    var unfinished;\n    ecModel.eachSeries(function (seriesModel) {\n        var chartView = ecIns._chartsMap[seriesModel.__viewId];\n        chartView.__alive = true;\n\n        var renderTask = chartView.renderTask;\n        scheduler.updatePayload(renderTask, payload);\n\n        if (dirtyMap && dirtyMap.get(seriesModel.uid)) {\n            renderTask.dirty();\n        }\n\n        unfinished |= renderTask.perform(scheduler.getPerformArgs(renderTask));\n\n        chartView.group.silent = !!seriesModel.get('silent');\n\n        updateZ(seriesModel, chartView);\n\n        updateBlend(seriesModel, chartView);\n    });\n    scheduler.unfinished |= unfinished;\n\n    // If use hover layer\n    updateHoverLayerStatus(ecIns, ecModel);\n\n    // Add aria\n    aria(ecIns._zr.dom, ecModel);\n}\n\nfunction performPostUpdateFuncs(ecModel, api) {\n    each(postUpdateFuncs, function (func) {\n        func(ecModel, api);\n    });\n}\n\n\nvar MOUSE_EVENT_NAMES = [\n    'click', 'dblclick', 'mouseover', 'mouseout', 'mousemove',\n    'mousedown', 'mouseup', 'globalout', 'contextmenu'\n];\n\n/**\n * @private\n */\nechartsProto._initEvents = function () {\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\n            // no e.target when 'globalout'.\n            if (isGlobalOut) {\n                params = {};\n            }\n            else if (el && el.dataIndex != null) {\n                var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);\n                params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType, el) || {};\n            }\n            // If element has custom eventData of components\n            else if (el && el.eventData) {\n                params = zrUtil.extend({}, el.eventData);\n            }\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\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'\n                    || componentType === 'markPoint'\n                    || componentType === 'markArea'\n                ) {\n                    componentType = 'series';\n                    componentIndex = params.seriesIndex;\n                }\n                var model = componentType && componentIndex != null\n                    && ecModel.getComponent(componentType, componentIndex);\n                var view = model && this[\n                    model.mainType === 'series' ? '_chartsMap' : '_componentsMap'\n                ][model.__viewId];\n\n                if (__DEV__) {\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                        console.warn('model or view can not be found by params');\n                    }\n                }\n\n                params.event = e;\n                params.type = eveName;\n\n                this._ecEventProcessor.eventInfo = {\n                    targetEl: el,\n                    packedEvent: params,\n                    model: model,\n                    view: view\n                };\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    }, this);\n\n    each(eventActionMap, function (actionType, eventType) {\n        this._messageCenter.on(eventType, function (event) {\n            this.trigger(eventType, event);\n        }, this);\n    }, this);\n};\n\n/**\n * @return {boolean}\n */\nechartsProto.isDisposed = function () {\n    return this._disposed;\n};\n\n/**\n * Clear\n */\nechartsProto.clear = function () {\n    this.setOption({ series: [] }, true);\n};\n\n/**\n * Dispose instance\n */\nechartsProto.dispose = function () {\n    if (this._disposed) {\n        if (__DEV__) {\n            console.warn('Instance ' + this.id + ' has been disposed');\n        }\n        return;\n    }\n    this._disposed = true;\n\n    modelUtil.setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, '');\n\n    var api = this._api;\n    var ecModel = this._model;\n\n    each(this._componentsViews, function (component) {\n        component.dispose(ecModel, api);\n    });\n    each(this._chartsViews, function (chart) {\n        chart.dispose(ecModel, api);\n    });\n\n    // Dispose after all views disposed\n    this._zr.dispose();\n\n    delete instances[this.id];\n};\n\nzrUtil.mixin(ECharts, Eventful);\n\nfunction updateHoverLayerStatus(ecIns, ecModel) {\n    var zr = ecIns._zr;\n    var storage = zr.storage;\n    var elCount = 0;\n\n    storage.traverse(function (el) {\n        elCount++;\n    });\n\n    if (elCount > ecModel.get('hoverLayerThreshold') && !env.node) {\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.group.traverse(function (el) {\n                    // Don't switch back.\n                    el.useHoverLayer = true;\n                });\n            }\n        });\n    }\n}\n\n/**\n * Update chart progressive and blend.\n * @param {module:echarts/model/Series|module:echarts/model/Component} model\n * @param {module:echarts/view/Component|module:echarts/view/Chart} view\n */\nfunction updateBlend(seriesModel, chartView) {\n    var blendMode = seriesModel.get('blendMode') || null;\n    if (__DEV__) {\n        if (!env.canvasSupported && blendMode && blendMode !== 'source-over') {\n            console.warn('Only canvas support blendMode');\n        }\n    }\n    chartView.group.traverse(function (el) {\n        // FIXME marker and other components\n        if (!el.isGroup) {\n            // Only set if blendMode is changed. In case element is incremental and don't wan't to rerender.\n            if (el.style.blend !== blendMode) {\n                el.setStyle('blend', blendMode);\n            }\n        }\n        if (el.eachPendingDisplayable) {\n            el.eachPendingDisplayable(function (displayable) {\n                displayable.setStyle('blend', blendMode);\n            });\n        }\n    });\n}\n\n/**\n * @param {module:echarts/model/Series|module:echarts/model/Component} model\n * @param {module:echarts/view/Component|module:echarts/view/Chart} view\n */\nfunction updateZ(model, view) {\n    var z = model.get('z');\n    var zlevel = model.get('zlevel');\n    // Set z and zlevel\n    view.group.traverse(function (el) {\n        if (el.type !== 'group') {\n            z != null && (el.z = z);\n            zlevel != null && (el.zlevel = zlevel);\n        }\n    });\n}\n\nfunction createExtensionAPI(ecInstance) {\n    var coordSysMgr = ecInstance._coordSysMgr;\n    return zrUtil.extend(new ExtensionAPI(ecInstance), {\n        // Inject methods\n        getCoordinateSystems: zrUtil.bind(\n            coordSysMgr.getCoordinateSystems, coordSysMgr\n        ),\n        getComponentByElement: function (el) {\n            while (el) {\n                var modelInfo = el.__ecComponentInfo;\n                if (modelInfo != null) {\n                    return ecInstance._model.getComponent(modelInfo.mainType, modelInfo.index);\n                }\n                el = el.parent;\n            }\n        }\n    });\n}\n\n\n/**\n * @class\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 */\nfunction EventProcessor() {\n    // These info required: targetEl, packedEvent, model, view\n    this.eventInfo;\n}\nEventProcessor.prototype = {\n    constructor: EventProcessor,\n\n    normalizeQuery: function (query) {\n        var cptQuery = {};\n        var dataQuery = {};\n        var otherQuery = {};\n\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 = ['Index', 'Name', 'Id'];\n            var dataKeys = {name: 1, dataIndex: 1, dataType: 1};\n            zrUtil.each(query, function (val, key) {\n                var reserved = false;\n                for (var i = 0; i < suffixes.length; i++) {\n                    var propSuffix = suffixes[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.hasOwnProperty(key)) {\n                    dataQuery[key] = val;\n                    reserved = true;\n                }\n                if (!reserved) {\n                    otherQuery[key] = val;\n                }\n            });\n        }\n\n        return {\n            cptQuery: cptQuery,\n            dataQuery: dataQuery,\n            otherQuery: otherQuery\n        };\n    },\n\n    filter: function (eventType, query, args) {\n        // They should be assigned before each trigger call.\n        var eventInfo = this.eventInfo;\n\n        if (!eventInfo) {\n            return true;\n        }\n\n        var targetEl = eventInfo.targetEl;\n        var packedEvent = eventInfo.packedEvent;\n        var model = eventInfo.model;\n        var view = eventInfo.view;\n\n        // For event like 'globalout'.\n        if (!model || !view) {\n            return true;\n        }\n\n        var cptQuery = query.cptQuery;\n        var dataQuery = query.dataQuery;\n\n        return check(cptQuery, model, 'mainType')\n            && check(cptQuery, model, 'subType')\n            && check(cptQuery, model, 'index', 'componentIndex')\n            && check(cptQuery, model, 'name')\n            && check(cptQuery, model, 'id')\n            && check(dataQuery, packedEvent, 'name')\n            && check(dataQuery, packedEvent, 'dataIndex')\n            && check(dataQuery, packedEvent, 'dataType')\n            && (!view.filterForExposedEvent || view.filterForExposedEvent(\n                eventType, query.otherQuery, targetEl, packedEvent\n            ));\n\n        function check(query, host, prop, propOnHost) {\n            return query[prop] == null || host[propOnHost || prop] === query[prop];\n        }\n    },\n\n    afterTrigger: function () {\n        // Make sure the eventInfo wont be used in next trigger.\n        this.eventInfo = null;\n    }\n};\n\n\n/**\n * @type {Object} key: actionType.\n * @inner\n */\nvar actions = {};\n\n/**\n * Map eventType to actionType\n * @type {Object}\n */\nvar eventActionMap = {};\n\n/**\n * Data processor functions of each stage\n * @type {Array.<Object.<string, Function>>}\n * @inner\n */\nvar dataProcessorFuncs = [];\n\n/**\n * @type {Array.<Function>}\n * @inner\n */\nvar optionPreprocessorFuncs = [];\n\n/**\n * @type {Array.<Function>}\n * @inner\n */\nvar postUpdateFuncs = [];\n\n/**\n * Visual encoding functions of each stage\n * @type {Array.<Object.<string, Function>>}\n */\nvar visualFuncs = [];\n\n/**\n * Theme storage\n * @type {Object.<key, Object>}\n */\nvar themeStorage = {};\n/**\n * Loading effects\n */\nvar loadingEffects = {};\n\nvar instances = {};\nvar connectedGroups = {};\n\nvar idBase = new Date() - 0;\nvar groupIdBase = new Date() - 0;\nvar DOM_ATTRIBUTE_KEY = '_echarts_instance_';\n\nfunction enableConnect(chart) {\n    var STATUS_PENDING = 0;\n    var STATUS_UPDATING = 1;\n    var STATUS_UPDATED = 2;\n    var STATUS_KEY = '__connectUpdateStatus';\n\n    function updateConnectedChartsStatus(charts, status) {\n        for (var i = 0; i < charts.length; i++) {\n            var otherChart = charts[i];\n            otherChart[STATUS_KEY] = status;\n        }\n    }\n\n    each(eventActionMap, function (actionType, eventType) {\n        chart._messageCenter.on(eventType, function (event) {\n            if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) {\n                if (event && event.escapeConnect) {\n                    return;\n                }\n\n                var action = chart.makeActionFromEvent(event);\n                var otherCharts = [];\n\n                each(instances, function (otherChart) {\n                    if (otherChart !== chart && otherChart.group === chart.group) {\n                        otherCharts.push(otherChart);\n                    }\n                });\n\n                updateConnectedChartsStatus(otherCharts, STATUS_PENDING);\n                each(otherCharts, function (otherChart) {\n                    if (otherChart[STATUS_KEY] !== STATUS_UPDATING) {\n                        otherChart.dispatchAction(action);\n                    }\n                });\n                updateConnectedChartsStatus(otherCharts, STATUS_UPDATED);\n            }\n        });\n    });\n}\n\n/**\n * @param {HTMLElement} dom\n * @param {Object} [theme]\n * @param {Object} opts\n * @param {number} [opts.devicePixelRatio] Use window.devicePixelRatio by default\n * @param {string} [opts.renderer] Can choose 'canvas' or 'svg' to render the chart.\n * @param {number} [opts.width] Use clientWidth of the input `dom` by default.\n *                              Can be 'auto' (the same as null/undefined)\n * @param {number} [opts.height] Use clientHeight of the input `dom` by default.\n *                               Can be 'auto' (the same as null/undefined)\n */\nexport function init(dom, theme, opts) {\n    if (__DEV__) {\n        // Check version\n        if ((zrender.version.replace('.', '') - 0) < (dependencies.zrender.replace('.', '') - 0)) {\n            throw new Error(\n                'zrender/src ' + zrender.version\n                + ' is too old for ECharts ' + version\n                + '. Current version need ZRender '\n                + dependencies.zrender + '+'\n            );\n        }\n\n        if (!dom) {\n            throw new Error('Initialize failed: invalid dom.');\n        }\n    }\n\n    var existInstance = getInstanceByDom(dom);\n    if (existInstance) {\n        if (__DEV__) {\n            console.warn('There is a chart instance already initialized on the dom.');\n        }\n        return existInstance;\n    }\n\n    if (__DEV__) {\n        if (zrUtil.isDom(dom)\n            && dom.nodeName.toUpperCase() !== 'CANVAS'\n            && (\n                (!dom.clientWidth && (!opts || opts.width == null))\n                || (!dom.clientHeight && (!opts || opts.height == null))\n            )\n        ) {\n            console.warn('Can\\'t get DOM width or height. Please check '\n                + 'dom.clientWidth and dom.clientHeight. They should not be 0.'\n                + 'For example, you may need to call this in the callback '\n                + '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\n    modelUtil.setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id);\n\n    enableConnect(chart);\n\n    return chart;\n}\n\n/**\n * @return {string|Array.<module:echarts~ECharts>} groupId\n */\nexport function connect(groupId) {\n    // Is array of charts\n    if (zrUtil.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}\n\n/**\n * @DEPRECATED\n * @return {string} groupId\n */\nexport function disConnect(groupId) {\n    connectedGroups[groupId] = false;\n}\n\n/**\n * @return {string} groupId\n */\nexport var disconnect = disConnect;\n\n/**\n * Dispose a chart instance\n * @param  {module:echarts~ECharts|HTMLDomElement|string} chart\n */\nexport function dispose(chart) {\n    if (typeof chart === 'string') {\n        chart = instances[chart];\n    }\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}\n\n/**\n * @param  {HTMLElement} dom\n * @return {echarts~ECharts}\n */\nexport function getInstanceByDom(dom) {\n    return instances[modelUtil.getAttribute(dom, DOM_ATTRIBUTE_KEY)];\n}\n\n/**\n * @param {string} key\n * @return {echarts~ECharts}\n */\nexport function getInstanceById(key) {\n    return instances[key];\n}\n\n/**\n * Register theme\n */\nexport function registerTheme(name, theme) {\n    themeStorage[name] = theme;\n}\n\n/**\n * Register option preprocessor\n * @param {Function} preprocessorFunc\n */\nexport function registerPreprocessor(preprocessorFunc) {\n    optionPreprocessorFuncs.push(preprocessorFunc);\n}\n\n/**\n * @param {number} [priority=1000]\n * @param {Object|Function} processor\n */\nexport function registerProcessor(priority, processor) {\n    normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_FILTER);\n}\n\n/**\n * Register postUpdater\n * @param {Function} postUpdateFunc\n */\nexport function registerPostUpdate(postUpdateFunc) {\n    postUpdateFuncs.push(postUpdateFunc);\n}\n\n/**\n * Usage:\n * registerAction('someAction', 'someEvent', function () { ... });\n * registerAction('someAction', function () { ... });\n * registerAction(\n *     {type: 'someAction', event: 'someEvent', update: 'updateView'},\n *     function () { ... }\n * );\n *\n * @param {(string|Object)} actionInfo\n * @param {string} actionInfo.type\n * @param {string} [actionInfo.event]\n * @param {string} [actionInfo.update]\n * @param {string} [eventName]\n * @param {Function} action\n */\nexport function registerAction(actionInfo, eventName, action) {\n    if (typeof eventName === 'function') {\n        action = eventName;\n        eventName = '';\n    }\n    var actionType = isObject(actionInfo)\n        ? actionInfo.type\n        : ([actionInfo, actionInfo = {\n            event: eventName\n        }][0]);\n\n    // Event name is all lowercase\n    actionInfo.event = (actionInfo.event || actionType).toLowerCase();\n    eventName = actionInfo.event;\n\n    // Validate action type and event name.\n    assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName));\n\n    if (!actions[actionType]) {\n        actions[actionType] = {action: action, actionInfo: actionInfo};\n    }\n    eventActionMap[eventName] = actionType;\n}\n\n/**\n * @param {string} type\n * @param {*} CoordinateSystem\n */\nexport function registerCoordinateSystem(type, CoordinateSystem) {\n    CoordinateSystemManager.register(type, CoordinateSystem);\n}\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\n                ? coordSysCreator.getDimensionsInfo()\n                : coordSysCreator.dimensions.slice();\n    }\n}\n\n/**\n * Layout is a special stage of visual encoding\n * Most visual encoding like color are common for different chart\n * But each chart has it's own layout algorithm\n *\n * @param {number} [priority=1000]\n * @param {Function} layoutTask\n */\nexport function registerLayout(priority, layoutTask) {\n    normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');\n}\n\n/**\n * @param {number} [priority=3000]\n * @param {module:echarts/stream/Task} visualTask\n */\nexport function registerVisual(priority, visualTask) {\n    normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');\n}\n\n/**\n * @param {Object|Function} fn: {seriesType, createOnAllSeries, performRawSeries, reset}\n */\nfunction normalizeRegister(targetList, priority, fn, defaultPriority, visualType) {\n    if (isFunction(priority) || isObject(priority)) {\n        fn = priority;\n        priority = defaultPriority;\n    }\n\n    if (__DEV__) {\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\n    var stageHandler = Scheduler.wrapStageHandler(fn, visualType);\n\n    stageHandler.__prio = priority;\n    stageHandler.__raw = fn;\n    targetList.push(stageHandler);\n\n    return stageHandler;\n}\n\n/**\n * @param {string} name\n */\nexport function registerLoading(name, loadingFx) {\n    loadingEffects[name] = loadingFx;\n}\n\n/**\n * @param {Object} opts\n * @param {string} [superClass]\n */\nexport function extendComponentModel(opts/*, superClass*/) {\n    // var Clazz = ComponentModel;\n    // if (superClass) {\n    //     var classType = parseClassType(superClass);\n    //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);\n    // }\n    return ComponentModel.extend(opts);\n}\n\n/**\n * @param {Object} opts\n * @param {string} [superClass]\n */\nexport function extendComponentView(opts/*, superClass*/) {\n    // var Clazz = ComponentView;\n    // if (superClass) {\n    //     var classType = parseClassType(superClass);\n    //     Clazz = ComponentView.getClass(classType.main, classType.sub, true);\n    // }\n    return ComponentView.extend(opts);\n}\n\n/**\n * @param {Object} opts\n * @param {string} [superClass]\n */\nexport function extendSeriesModel(opts/*, superClass*/) {\n    // var Clazz = SeriesModel;\n    // if (superClass) {\n    //     superClass = 'series.' + superClass.replace('series.', '');\n    //     var classType = parseClassType(superClass);\n    //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);\n    // }\n    return SeriesModel.extend(opts);\n}\n\n/**\n * @param {Object} opts\n * @param {string} [superClass]\n */\nexport function extendChartView(opts/*, superClass*/) {\n    // var Clazz = ChartView;\n    // if (superClass) {\n    //     superClass = superClass.replace('series.', '');\n    //     var classType = parseClassType(superClass);\n    //     Clazz = ChartView.getClass(classType.main, true);\n    // }\n    return ChartView.extend(opts);\n}\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 * Be careful of using it in the browser.\n *\n * @param {Function} creator\n * @example\n *     var Canvas = require('canvas');\n *     var 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    zrUtil.$override('createCanvas', creator);\n}\n\n/**\n * @param {string} mapName\n * @param {Array.<Object>|Object|string} geoJson\n * @param {Object} [specialAreas]\n *\n * @example GeoJSON\n *     $.get('USA.json', function (geoJson) {\n *         echarts.registerMap('USA', geoJson);\n *         // Or\n *         echarts.registerMap('USA', {\n *             geoJson: geoJson,\n *             specialAreas: {}\n *         })\n *     });\n *\n *     $.get('airport.svg', function (svg) {\n *         echarts.registerMap('airport', {\n *             svg: svg\n *         }\n *     });\n *\n *     echarts.registerMap('eu', [\n *         {svg: eu-topographic.svg},\n *         {geoJSON: eu.json}\n *     ])\n */\nexport function registerMap(mapName, geoJson, specialAreas) {\n    mapDataStorage.registerMap(mapName, geoJson, specialAreas);\n}\n\n/**\n * @param {string} mapName\n * @return {Object}\n */\nexport function getMap(mapName) {\n    // For backward compatibility, only return the first one.\n    var records = mapDataStorage.retrieveMap(mapName);\n    return records && records[0] && {\n        geoJson: records[0].geoJSON,\n        specialAreas: records[0].specialAreas\n    };\n}\n\nregisterVisual(PRIORITY_VISUAL_GLOBAL, seriesColor);\nregisterPreprocessor(backwardCompat);\nregisterProcessor(PRIORITY_PROCESSOR_STATISTIC, dataStack);\nregisterLoading('default', loadingDefault);\n\n// Default actions\n\nregisterAction({\n    type: 'highlight',\n    event: 'highlight',\n    update: 'highlight'\n}, zrUtil.noop);\n\nregisterAction({\n    type: 'downplay',\n    event: 'downplay',\n    update: 'downplay'\n}, zrUtil.noop);\n\n// Default theme\nregisterTheme('light', lightTheme);\nregisterTheme('dark', darkTheme);\n\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\nfunction defaultKeyGetter(item) {\n    return item;\n}\n\n/**\n * @param {Array} oldArr\n * @param {Array} newArr\n * @param {Function} oldKeyGetter\n * @param {Function} newKeyGetter\n * @param {Object} [context] Can be visited by this.context in callback.\n */\nfunction DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context) {\n    this._old = oldArr;\n    this._new = newArr;\n\n    this._oldKeyGetter = oldKeyGetter || defaultKeyGetter;\n    this._newKeyGetter = newKeyGetter || defaultKeyGetter;\n\n    this.context = context;\n}\n\nDataDiffer.prototype = {\n\n    constructor: DataDiffer,\n\n    /**\n     * Callback function when add a data\n     */\n    add: function (func) {\n        this._add = func;\n        return this;\n    },\n\n    /**\n     * Callback function when update a data\n     */\n    update: function (func) {\n        this._update = func;\n        return this;\n    },\n\n    /**\n     * Callback function when remove a data\n     */\n    remove: function (func) {\n        this._remove = func;\n        return this;\n    },\n\n    execute: function () {\n        var oldArr = this._old;\n        var newArr = this._new;\n\n        var oldDataIndexMap = {};\n        var newDataIndexMap = {};\n        var oldDataKeyArr = [];\n        var newDataKeyArr = [];\n        var i;\n\n        initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter', this);\n        initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter', this);\n\n        // Travel by inverted order to make sure order consistency\n        // when duplicate keys exists (consider newDataIndex.pop() below).\n        // For performance consideration, these code below do not look neat.\n        for (i = 0; i < oldArr.length; i++) {\n            var key = oldDataKeyArr[i];\n            var idx = newDataIndexMap[key];\n\n            // idx can never be empty array here. see 'set null' logic below.\n            if (idx != null) {\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 len = idx.length;\n                if (len) {\n                    len === 1 && (newDataIndexMap[key] = null);\n                    idx = idx.unshift();\n                }\n                else {\n                    newDataIndexMap[key] = null;\n                }\n                this._update && this._update(idx, i);\n            }\n            else {\n                this._remove && this._remove(i);\n            }\n        }\n\n        for (var i = 0; i < newDataKeyArr.length; i++) {\n            var key = newDataKeyArr[i];\n            if (newDataIndexMap.hasOwnProperty(key)) {\n                var idx = newDataIndexMap[key];\n                if (idx == null) {\n                    continue;\n                }\n                // idx can never be empty array here. see 'set null' logic above.\n                if (!idx.length) {\n                    this._add && this._add(idx);\n                }\n                else {\n                    for (var j = 0, len = idx.length; j < len; j++) {\n                        this._add && this._add(idx[j]);\n                    }\n                }\n            }\n        }\n    }\n};\n\nfunction initIndexMap(arr, map, keyArr, keyGetterName, dataDiffer) {\n    for (var i = 0; i < arr.length; i++) {\n        // Add prefix to avoid conflict with Object.prototype.\n        var key = '_ec_' + dataDiffer[keyGetterName](arr[i], i);\n        var existence = map[key];\n        if (existence == null) {\n            keyArr.push(key);\n            map[key] = i;\n        }\n        else {\n            if (!existence.length) {\n                map[key] = existence = [existence];\n            }\n            existence.push(i);\n        }\n    }\n}\n\nexport default DataDiffer;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {each, createHashMap, assert} from 'zrender/src/core/util';\nimport { __DEV__ } from '../../config';\n\nexport var OTHER_DIMENSIONS = createHashMap([\n    'tooltip', 'label', 'itemName', 'itemId', 'seriesName'\n]);\n\nexport function summarizeDimensions(data) {\n    var summary = {};\n    var encode = summary.encode = {};\n    var notExtraCoordDimMap = createHashMap();\n    var defaultedLabel = [];\n    var defaultedTooltip = [];\n\n    // See the comment of `List.js#userOutput`.\n    var userOutput = summary.userOutput = {\n        dimensionNames: data.dimensions.slice(),\n        encode: {}\n    };\n\n    each(data.dimensions, function (dimName) {\n        var dimItem = data.getDimensionInfo(dimName);\n\n        var coordDim = dimItem.coordDim;\n        if (coordDim) {\n            if (__DEV__) {\n                assert(OTHER_DIMENSIONS.get(coordDim) == null);\n            }\n\n            var coordDimIndex = dimItem.coordDimIndex;\n            getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName;\n\n            if (!dimItem.isExtraCoord) {\n                notExtraCoordDimMap.set(coordDim, 1);\n\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\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(userOutput.encode, coordDim)[coordDimIndex] = dimItem.index;\n            }\n            if (dimItem.defaultTooltip) {\n                defaultedTooltip.push(dimName);\n            }\n        }\n\n        OTHER_DIMENSIONS.each(function (v, otherDim) {\n            var encodeArr = getOrCreateEncodeArr(encode, otherDim);\n\n            var dimIndex = dimItem.otherDims[otherDim];\n            if (dimIndex != null && dimIndex !== false) {\n                encodeArr[dimIndex] = dimItem.name;\n            }\n        });\n    });\n\n    var dataDimsOnCoord = [];\n    var encodeFirstDimNotExtra = {};\n\n    notExtraCoordDimMap.each(function (v, coordDim) {\n        var dimArr = encode[coordDim];\n        // ??? FIXME extra coord should not be set in dataDimsOnCoord.\n        // But should fix the case that radar axes: simplify the logic\n        // of `completeDimension`, remove `extraPrefix`.\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\n    summary.dataDimsOnCoord = dataDimsOnCoord;\n    summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;\n\n    var encodeLabel = encode.label;\n    // FIXME `encode.label` is not recommanded, because formatter can not be set\n    // in this way. Use label.formatter instead. May be remove this approach someday.\n    if (encodeLabel && encodeLabel.length) {\n        defaultedLabel = encodeLabel.slice();\n    }\n\n    var encodeTooltip = encode.tooltip;\n    if (encodeTooltip && encodeTooltip.length) {\n        defaultedTooltip = encodeTooltip.slice();\n    }\n    else if (!defaultedTooltip.length) {\n        defaultedTooltip = defaultedLabel.slice();\n    }\n\n    encode.defaultedLabel = defaultedLabel;\n    encode.defaultedTooltip = defaultedTooltip;\n\n    return summary;\n}\n\nfunction getOrCreateEncodeArr(encode, dim) {\n    if (!encode.hasOwnProperty(dim)) {\n        encode[dim] = [];\n    }\n    return encode[dim];\n}\n\nexport function getDimensionTypeByAxis(axisType) {\n    return axisType === 'category'\n        ? 'ordinal'\n        : axisType === 'time'\n        ? 'time'\n        : 'float';\n}\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\n// function findTheLastDimMayLabel(data) {\n//     // Get last value dim\n//     var dimensions = data.dimensions.slice();\n//     var valueType;\n//     var 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/* global Float64Array, Int32Array, Uint32Array, Uint16Array */\n\n/**\n * List for data storage\n * @module echarts/data/List\n */\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport Model from '../model/Model';\nimport DataDiffer from './DataDiffer';\nimport Source from './Source';\nimport {defaultDimValueGetters, DefaultDataProvider} from './helper/dataProvider';\nimport {summarizeDimensions} from './helper/dimensionHelper';\n\nvar isObject = zrUtil.isObject;\n\nvar UNDEFINED = 'undefined';\nvar INDEX_NOT_FOUND = -1;\n\n// Use prefix to avoid index to be the same as otherIdList[idx],\n// which will cause weird udpate animation.\nvar ID_PREFIX = 'e\\0\\0';\n\nvar dataCtors = {\n    'float': typeof Float64Array === UNDEFINED\n        ? Array : Float64Array,\n    'int': typeof Int32Array === UNDEFINED\n        ? Array : Int32Array,\n    // Ordinal data type can be string or int\n    'ordinal': Array,\n    'number': Array,\n    'time': Array\n};\n\n// Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is\n// different from the Ctor of typed array.\nvar CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array;\nvar CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array;\nvar CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array;\n\nfunction getIndicesCtor(list) {\n    // The possible max value in this._indicies is always this._rawCount despite of filtering.\n    return list._rawCount > 65535 ? CtorUint32Array : CtorUint16Array;\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}\n\nvar TRANSFERABLE_PROPERTIES = [\n    'hasItemOption', '_nameList', '_idList', '_invertedIndicesMap',\n    '_rawData', '_chunkSize', '_chunkCount', '_dimValueGetter',\n    '_count', '_rawCount', '_nameDimIdx', '_idDimIdx'\n];\nvar CLONE_PROPERTIES = [\n    '_extent', '_approximateExtent', '_rawExtent'\n];\n\nfunction transferProperties(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\n    target.__wrappedMethods = source.__wrappedMethods;\n\n    zrUtil.each(CLONE_PROPERTIES, function (propName) {\n        target[propName] = zrUtil.clone(source[propName]);\n    });\n\n    target._calculationInfo = zrUtil.extend(source._calculationInfo);\n}\n\n\n\n\n\n/**\n * @constructor\n * @alias module:echarts/data/List\n *\n * @param {Array.<string|Object>} dimensions\n *      For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].\n *      Dimensions should be concrete names like x, y, z, lng, lat, angle, radius\n *      Spetial fields: {\n *          ordinalMeta: <module:echarts/data/OrdinalMeta>\n *          createInvertedIndices: <boolean>\n *      }\n * @param {module:echarts/model/Model} hostModel\n */\nvar List = function (dimensions, hostModel) {\n\n    dimensions = dimensions || ['x', 'y'];\n\n    var dimensionInfos = {};\n    var dimensionNames = [];\n    var invertedIndicesMap = {};\n\n    for (var i = 0; i < dimensions.length; i++) {\n        // Use the original dimensions[i], where other flag props may exists.\n        var dimensionInfo = dimensions[i];\n\n        if (zrUtil.isString(dimensionInfo)) {\n            dimensionInfo = {name: dimensionInfo};\n        }\n\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\n        dimensionInfo.otherDims = dimensionInfo.otherDims || {};\n        dimensionNames.push(dimensionName);\n        dimensionInfos[dimensionName] = dimensionInfo;\n\n        dimensionInfo.index = i;\n\n        if (dimensionInfo.createInvertedIndices) {\n            invertedIndicesMap[dimensionName] = [];\n        }\n    }\n\n    /**\n     * @readOnly\n     * @type {Array.<string>}\n     */\n    this.dimensions = dimensionNames;\n\n    /**\n     * Infomation of each data dimension, like data type.\n     * @type {Object}\n     */\n    this._dimensionInfos = dimensionInfos;\n\n    /**\n     * @type {module:echarts/model/Model}\n     */\n    this.hostModel = hostModel;\n\n    /**\n     * @type {module:echarts/model/Model}\n     */\n    this.dataType;\n\n    /**\n     * Indices stores the indices of data subset after filtered.\n     * This data subset will be used in chart.\n     * @type {Array.<number>}\n     * @readOnly\n     */\n    this._indices = null;\n\n    this._count = 0;\n    this._rawCount = 0;\n\n    /**\n     * Data storage\n     * @type {Object.<key, Array.<TypedArray|Array>>}\n     * @private\n     */\n    this._storage = {};\n\n    /**\n     * @type {Array.<string>}\n     */\n    this._nameList = [];\n    /**\n     * @type {Array.<string>}\n     */\n    this._idList = [];\n\n    /**\n     * Models of data option is stored sparse for optimizing memory cost\n     * @type {Array.<module:echarts/model/Model>}\n     * @private\n     */\n    this._optionModels = [];\n\n    /**\n     * Global visual properties after visual coding\n     * @type {Object}\n     * @private\n     */\n    this._visual = {};\n\n    /**\n     * Globel layout properties.\n     * @type {Object}\n     * @private\n     */\n    this._layout = {};\n\n    /**\n     * Item visual properties after visual coding\n     * @type {Array.<Object>}\n     * @private\n     */\n    this._itemVisuals = [];\n\n    /**\n     * Key: visual type, Value: boolean\n     * @type {Object}\n     * @readOnly\n     */\n    this.hasItemVisual = {};\n\n    /**\n     * Item layout properties after layout\n     * @type {Array.<Object>}\n     * @private\n     */\n    this._itemLayouts = [];\n\n    /**\n     * Graphic elemnents\n     * @type {Array.<module:zrender/Element>}\n     * @private\n     */\n    this._graphicEls = [];\n\n    /**\n     * Max size of each chunk.\n     * @type {number}\n     * @private\n     */\n    this._chunkSize = 1e5;\n\n    /**\n     * @type {number}\n     * @private\n     */\n    this._chunkCount = 0;\n\n    /**\n     * @type {Array.<Array|Object>}\n     * @private\n     */\n    this._rawData;\n\n    /**\n     * Raw extent will not be cloned, but only transfered.\n     * It will not be calculated util needed.\n     * key: dim,\n     * value: {end: number, extent: Array.<number>}\n     * @type {Object}\n     * @private\n     */\n    this._rawExtent = {};\n\n    /**\n     * @type {Object}\n     * @private\n     */\n    this._extent = {};\n\n    /**\n     * key: dim\n     * value: extent\n     * @type {Object}\n     * @private\n     */\n    this._approximateExtent = {};\n\n    /**\n     * Cache summary info for fast visit. See \"dimensionHelper\".\n     * @type {Object}\n     * @private\n     */\n    this._dimensionsSummary = summarizeDimensions(this);\n\n    /**\n     * @type {Object.<Array|TypedArray>}\n     * @private\n     */\n    this._invertedIndicesMap = invertedIndicesMap;\n\n    /**\n     * @type {Object}\n     * @private\n     */\n    this._calculationInfo = {};\n\n    /**\n     * User output info of this data.\n     * DO NOT use it in other places!\n     *\n     * When preparing user params for user callbacks, we have\n     * to clone these inner data structures to prevent users\n     * from modifying them to effect built-in logic. And for\n     * performance consideration we make this `userOutput` to\n     * avoid clone them too many times.\n     *\n     * @type {Object}\n     * @readOnly\n     */\n    this.userOutput = this._dimensionsSummary.userOutput;\n};\n\nvar listProto = List.prototype;\n\nlistProto.type = 'list';\n\n/**\n * If each data item has it's own option\n * @type {boolean}\n */\nlistProto.hasItemOption = true;\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 `this.dimensions`, 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 compatbility. 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 * Get dimension name\n * @param {string|number} dim See above.\n * @return {string} Concrete dim name.\n */\nlistProto.getDimension = function (dim) {\n    if (typeof dim === 'number'\n        // If being a number-like string but not being defined a dimension name.\n        || (!isNaN(dim) && !this._dimensionInfos.hasOwnProperty(dim))\n    ) {\n        dim = this.dimensions[dim];\n    }\n    return dim;\n};\n\n/**\n * Get type and calculation info of particular dimension\n * @param {string|number} 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 */\nlistProto.getDimensionInfo = function (dim) {\n    // Do not clone, because there may be categories in dimInfo.\n    return this._dimensionInfos[this.getDimension(dim)];\n};\n\n/**\n * @return {Array.<string>} concrete dimension name list on coord.\n */\nlistProto.getDimensionsOnCoord = function () {\n    return this._dimensionsSummary.dataDimsOnCoord.slice();\n};\n\n/**\n * @param {string} coordDim\n * @param {number} [idx] A coordDim may map to more than one data dim.\n *        If idx is `true`, return a array of all mapped dims.\n *        If idx is not specified, return the first dim not extra.\n * @return {string|Array.<string>} concrete data dim.\n *        If idx is number, and not found, return null/undefined.\n *        If idx is `true`, and not found, return empty array (always return array).\n */\nlistProto.mapDimension = function (coordDim, idx) {\n    var dimensionsSummary = this._dimensionsSummary;\n\n    if (idx == null) {\n        return dimensionsSummary.encodeFirstDimNotExtra[coordDim];\n    }\n\n    var dims = dimensionsSummary.encode[coordDim];\n    return idx === true\n        // always return array if idx is `true`\n        ? (dims || []).slice()\n        : (dims && dims[idx]);\n};\n\n/**\n * Initialize from data\n * @param {Array.<Object|number|Array>} data source or data or data provider.\n * @param {Array.<string>} [nameLIst] The name of a datum is used on data diff and\n *        defualt 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 * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number\n */\nlistProto.initData = function (data, nameList, dimValueGetter) {\n\n    var notProvider = Source.isInstance(data) || zrUtil.isArrayLike(data);\n    if (notProvider) {\n        data = new DefaultDataProvider(data, this.dimensions.length);\n    }\n\n    if (__DEV__) {\n        if (!notProvider && (typeof data.getItem !== 'function' || typeof data.count !== 'function')) {\n            throw new Error('Inavlid data provider.');\n        }\n    }\n\n    this._rawData = data;\n\n    // Clear\n    this._storage = {};\n    this._indices = null;\n\n    this._nameList = nameList || [];\n\n    this._idList = [];\n\n    this._nameRepeatCount = {};\n\n    if (!dimValueGetter) {\n        this.hasItemOption = false;\n    }\n\n    /**\n     * @readOnly\n     */\n    this.defaultDimValueGetter = defaultDimValueGetters[\n        this._rawData.getSource().sourceFormat\n    ];\n    // Default dim value getter\n    this._dimValueGetter = dimValueGetter = dimValueGetter\n        || this.defaultDimValueGetter;\n    this._dimValueGetterArrayRows = defaultDimValueGetters.arrayRows;\n\n    // Reset raw extent.\n    this._rawExtent = {};\n\n    this._initDataFromProvider(0, data.count());\n\n    // If data has no item option.\n    if (data.pure) {\n        this.hasItemOption = false;\n    }\n};\n\nlistProto.getProvider = function () {\n    return this._rawData;\n};\n\n/**\n * Caution: Can be only called on raw data (before `this._indices` created).\n */\nlistProto.appendData = function (data) {\n    if (__DEV__) {\n        zrUtil.assert(!this._indices, 'appendData can only be called on raw data.');\n    }\n\n    var rawData = this._rawData;\n    var start = this.count();\n    rawData.appendData(data);\n    var end = rawData.count();\n    if (!rawData.persistent) {\n        end += start;\n    }\n    this._initDataFromProvider(start, end);\n};\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 storage.\n *\n * The final count will be increased by `Math.max(values.length, names.length)`.\n *\n * @param {Array.<Array.<*>>} values That is the SourceType: 'arrayRows', like\n *        [\n *            [12, 33, 44],\n *            [NaN, 43, 1],\n *            ['-', 'asdf', 0]\n *        ]\n *        Each item is exaclty cooresponding to a dimension.\n * @param {Array.<string>} [names]\n */\nlistProto.appendValues = function (values, names) {\n    var chunkSize = this._chunkSize;\n    var storage = this._storage;\n    var dimensions = this.dimensions;\n    var dimLen = dimensions.length;\n    var rawExtent = this._rawExtent;\n\n    var start = this.count();\n    var end = start + Math.max(values.length, names ? names.length : 0);\n    var originalChunkCount = this._chunkCount;\n\n    for (var i = 0; i < dimLen; i++) {\n        var dim = dimensions[i];\n        if (!rawExtent[dim]) {\n            rawExtent[dim] = getInitialExtent();\n        }\n        if (!storage[dim]) {\n            storage[dim] = [];\n        }\n        prepareChunks(storage, this._dimensionInfos[dim], chunkSize, originalChunkCount, end);\n        this._chunkCount = storage[dim].length;\n    }\n\n    var emptyDataItem = new Array(dimLen);\n    for (var idx = start; idx < end; idx++) {\n        var sourceIdx = idx - start;\n        var chunkIndex = Math.floor(idx / chunkSize);\n        var chunkOffset = idx % chunkSize;\n\n        // Store the data by dimensions\n        for (var k = 0; k < dimLen; k++) {\n            var dim = dimensions[k];\n            var val = this._dimValueGetterArrayRows(\n                values[sourceIdx] || emptyDataItem, dim, sourceIdx, k\n            );\n            storage[dim][chunkIndex][chunkOffset] = val;\n\n            var dimRawExtent = rawExtent[dim];\n            val < dimRawExtent[0] && (dimRawExtent[0] = val);\n            val > dimRawExtent[1] && (dimRawExtent[1] = val);\n        }\n\n        if (names) {\n            this._nameList[idx] = names[sourceIdx];\n        }\n    }\n\n    this._rawCount = this._count = end;\n\n    // Reset data extent\n    this._extent = {};\n\n    prepareInvertedIndex(this);\n};\n\nlistProto._initDataFromProvider = function (start, end) {\n    // Optimize.\n    if (start >= end) {\n        return;\n    }\n\n    var chunkSize = this._chunkSize;\n    var rawData = this._rawData;\n    var storage = this._storage;\n    var dimensions = this.dimensions;\n    var dimLen = dimensions.length;\n    var dimensionInfoMap = this._dimensionInfos;\n    var nameList = this._nameList;\n    var idList = this._idList;\n    var rawExtent = this._rawExtent;\n    var nameRepeatCount = this._nameRepeatCount = {};\n    var nameDimIdx;\n\n    var originalChunkCount = this._chunkCount;\n    for (var i = 0; i < dimLen; i++) {\n        var dim = dimensions[i];\n        if (!rawExtent[dim]) {\n            rawExtent[dim] = getInitialExtent();\n        }\n\n        var dimInfo = dimensionInfoMap[dim];\n        if (dimInfo.otherDims.itemName === 0) {\n            nameDimIdx = this._nameDimIdx = i;\n        }\n        if (dimInfo.otherDims.itemId === 0) {\n            this._idDimIdx = i;\n        }\n\n        if (!storage[dim]) {\n            storage[dim] = [];\n        }\n\n        prepareChunks(storage, dimInfo, chunkSize, originalChunkCount, end);\n\n        this._chunkCount = storage[dim].length;\n    }\n\n    var dataItem = new Array(dimLen);\n    for (var idx = start; idx < end; idx++) {\n        // NOTICE: Try not to write things into dataItem\n        dataItem = rawData.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        var chunkIndex = Math.floor(idx / chunkSize);\n        var chunkOffset = idx % chunkSize;\n\n        // Store the data by dimensions\n        for (var k = 0; k < dimLen; k++) {\n            var dim = dimensions[k];\n            var dimStorage = storage[dim][chunkIndex];\n            // PENDING NULL is empty or zero\n            var val = this._dimValueGetter(dataItem, dim, idx, k);\n            dimStorage[chunkOffset] = val;\n\n            var dimRawExtent = rawExtent[dim];\n            val < dimRawExtent[0] && (dimRawExtent[0] = val);\n            val > dimRawExtent[1] && (dimRawExtent[1] = val);\n        }\n\n        // ??? FIXME not check by pure but sourceFormat?\n        // TODO refactor these logic.\n        if (!rawData.pure) {\n            var name = nameList[idx];\n\n            if (dataItem && name == null) {\n                // If dataItem is {name: ...}, it has highest priority.\n                // That is appropriate for many common cases.\n                if (dataItem.name != null) {\n                    // There is no other place to persistent dataItem.name,\n                    // so save it to nameList.\n                    nameList[idx] = name = dataItem.name;\n                }\n                else if (nameDimIdx != null) {\n                    var nameDim = dimensions[nameDimIdx];\n                    var nameDimChunk = storage[nameDim][chunkIndex];\n                    if (nameDimChunk) {\n                        name = nameDimChunk[chunkOffset];\n                        var ordinalMeta = dimensionInfoMap[nameDim].ordinalMeta;\n                        if (ordinalMeta && ordinalMeta.categories.length) {\n                            name = ordinalMeta.categories[name];\n                        }\n                    }\n                }\n            }\n\n            // Try using the id in option\n            // id or name is used on dynamical data, mapping old and new items.\n            var id = dataItem == null ? null : dataItem.id;\n\n            if (id == null && name != null) {\n                // Use name as id and add counter to avoid same name\n                nameRepeatCount[name] = nameRepeatCount[name] || 0;\n                id = name;\n                if (nameRepeatCount[name] > 0) {\n                    id += '__ec__' + nameRepeatCount[name];\n                }\n                nameRepeatCount[name]++;\n            }\n            id != null && (idList[idx] = id);\n        }\n    }\n\n    if (!rawData.persistent && rawData.clean) {\n        // Clean unused data if data source is typed array.\n        rawData.clean();\n    }\n\n    this._rawCount = this._count = end;\n\n    // Reset data extent\n    this._extent = {};\n\n    prepareInvertedIndex(this);\n};\n\nfunction prepareChunks(storage, dimInfo, chunkSize, chunkCount, end) {\n    var DataCtor = dataCtors[dimInfo.type];\n    var lastChunkIndex = chunkCount - 1;\n    var dim = dimInfo.name;\n    var resizeChunkArray = storage[dim][lastChunkIndex];\n    if (resizeChunkArray && resizeChunkArray.length < chunkSize) {\n        var newStore = new DataCtor(Math.min(end - lastChunkIndex * chunkSize, chunkSize));\n        // The cost of the copy is probably inconsiderable\n        // within the initial chunkSize.\n        for (var j = 0; j < resizeChunkArray.length; j++) {\n            newStore[j] = resizeChunkArray[j];\n        }\n        storage[dim][lastChunkIndex] = newStore;\n    }\n\n    // Create new chunks.\n    for (var k = chunkCount * chunkSize; k < end; k += chunkSize) {\n        storage[dim].push(new DataCtor(Math.min(end - k, chunkSize)));\n    }\n}\n\nfunction prepareInvertedIndex(list) {\n    var invertedIndicesMap = list._invertedIndicesMap;\n    zrUtil.each(invertedIndicesMap, function (invertedIndices, dim) {\n        var dimInfo = list._dimensionInfos[dim];\n\n        // Currently, only dimensions that has ordinalMeta can create inverted indices.\n        var ordinalMeta = dimInfo.ordinalMeta;\n        if (ordinalMeta) {\n            invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(\n                ordinalMeta.categories.length\n            );\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 < list._count; i++) {\n                // Only support the case that all values are distinct.\n                invertedIndices[list.get(dim, i)] = i;\n            }\n        }\n    });\n}\n\nfunction getRawValueFromStore(list, dimIndex, rawIndex) {\n    var val;\n    if (dimIndex != null) {\n        var chunkSize = list._chunkSize;\n        var chunkIndex = Math.floor(rawIndex / chunkSize);\n        var chunkOffset = rawIndex % chunkSize;\n        var dim = list.dimensions[dimIndex];\n        var chunk = list._storage[dim][chunkIndex];\n        if (chunk) {\n            val = chunk[chunkOffset];\n            var ordinalMeta = list._dimensionInfos[dim].ordinalMeta;\n            if (ordinalMeta && ordinalMeta.categories.length) {\n                val = ordinalMeta.categories[val];\n            }\n        }\n    }\n    return val;\n}\n\n/**\n * @return {number}\n */\nlistProto.count = function () {\n    return this._count;\n};\n\nlistProto.getIndices = function () {\n    var newIndices;\n\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        }\n        else {\n            newIndices = new Ctor(indices.buffer, 0, thisCount);\n        }\n    }\n    else {\n        var Ctor = getIndicesCtor(this);\n        var newIndices = new Ctor(this.count());\n        for (var i = 0; i < newIndices.length; i++) {\n            newIndices[i] = i;\n        }\n    }\n\n    return newIndices;\n};\n\n/**\n * Get value. Return NaN if idx is out of range.\n * @param {string} dim Dim must be concrete name.\n * @param {number} idx\n * @param {boolean} stack\n * @return {number}\n */\nlistProto.get = function (dim, idx /*, stack */) {\n    if (!(idx >= 0 && idx < this._count)) {\n        return NaN;\n    }\n    var storage = this._storage;\n    if (!storage[dim]) {\n        // TODO Warn ?\n        return NaN;\n    }\n\n    idx = this.getRawIndex(idx);\n\n    var chunkIndex = Math.floor(idx / this._chunkSize);\n    var chunkOffset = idx % this._chunkSize;\n\n    var chunkStore = storage[dim][chunkIndex];\n    var value = chunkStore[chunkOffset];\n    // FIXME ordinal data type is not stackable\n    // if (stack) {\n    //     var dimensionInfo = this._dimensionInfos[dim];\n    //     if (dimensionInfo && dimensionInfo.stackable) {\n    //         var stackedOn = this.stackedOn;\n    //         while (stackedOn) {\n    //             // Get no stacked data of stacked on\n    //             var stackedValue = stackedOn.get(dim, idx);\n    //             // Considering positive stack, negative stack and empty data\n    //             if ((value >= 0 && stackedValue > 0)  // Positive stack\n    //                 || (value <= 0 && stackedValue < 0) // Negative stack\n    //             ) {\n    //                 value += stackedValue;\n    //             }\n    //             stackedOn = stackedOn.stackedOn;\n    //         }\n    //     }\n    // }\n\n    return value;\n};\n\n/**\n * @param {string} dim concrete dim\n * @param {number} rawIndex\n * @return {number|string}\n */\nlistProto.getByRawIndex = function (dim, rawIdx) {\n    if (!(rawIdx >= 0 && rawIdx < this._rawCount)) {\n        return NaN;\n    }\n    var dimStore = this._storage[dim];\n    if (!dimStore) {\n        // TODO Warn ?\n        return NaN;\n    }\n\n    var chunkIndex = Math.floor(rawIdx / this._chunkSize);\n    var chunkOffset = rawIdx % this._chunkSize;\n    var chunkStore = dimStore[chunkIndex];\n    return chunkStore[chunkOffset];\n};\n\n/**\n * FIXME Use `get` on chrome maybe slow(in filterSelf and selectRange).\n * Hack a much simpler _getFast\n * @private\n */\nlistProto._getFast = function (dim, rawIdx) {\n    var chunkIndex = Math.floor(rawIdx / this._chunkSize);\n    var chunkOffset = rawIdx % this._chunkSize;\n    var chunkStore = this._storage[dim][chunkIndex];\n    return chunkStore[chunkOffset];\n};\n\n/**\n * Get value for multi dimensions.\n * @param {Array.<string>} [dimensions] If ignored, using all dimensions.\n * @param {number} idx\n * @return {number}\n */\nlistProto.getValues = function (dimensions, idx /*, stack */) {\n    var values = [];\n\n    if (!zrUtil.isArray(dimensions)) {\n        // stack = idx;\n        idx = dimensions;\n        dimensions = this.dimensions;\n    }\n\n    for (var i = 0, len = dimensions.length; i < len; i++) {\n        values.push(this.get(dimensions[i], idx /*, stack */));\n    }\n\n    return values;\n};\n\n/**\n * If value is NaN. Inlcuding '-'\n * Only check the coord dimensions.\n * @param {string} dim\n * @param {number} idx\n * @return {number}\n */\nlistProto.hasValue = function (idx) {\n    var dataDimsOnCoord = this._dimensionsSummary.dataDimsOnCoord;\n    for (var i = 0, len = dataDimsOnCoord.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.get(dataDimsOnCoord[i], idx))) {\n            return false;\n        }\n    }\n    return true;\n};\n\n/**\n * Get extent of data in one dimension\n * @param {string} dim\n * @param {boolean} stack\n */\nlistProto.getDataExtent = function (dim /*, stack */) {\n    // Make sure use concrete dim as cache name.\n    dim = this.getDimension(dim);\n    var dimData = this._storage[dim];\n    var initialExtent = getInitialExtent();\n\n    // stack = !!((stack || false) && this.getCalculationInfo(dim));\n\n    if (!dimData) {\n        return initialExtent;\n    }\n\n    // Make more strict checkings to ensure hitting cache.\n    var currEnd = this.count();\n    // var cacheName = [dim, !!stack].join('_');\n    // var cacheName = dim;\n\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; // && !stack;\n    var dimExtent;\n\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\n    var min = dimExtent[0];\n    var max = dimExtent[1];\n\n    for (var i = 0; i < currEnd; i++) {\n        // var value = stack ? this.get(dim, i, true) : this._getFast(dim, this.getRawIndex(i));\n        var value = this._getFast(dim, this.getRawIndex(i));\n        value < min && (min = value);\n        value > max && (max = value);\n    }\n\n    dimExtent = [min, max];\n\n    this._extent[dim] = dimExtent;\n\n    return dimExtent;\n};\n\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 */\nlistProto.getApproximateExtent = function (dim /*, stack */) {\n    dim = this.getDimension(dim);\n    return this._approximateExtent[dim] || this.getDataExtent(dim /*, stack */);\n};\n\nlistProto.setApproximateExtent = function (extent, dim /*, stack */) {\n    dim = this.getDimension(dim);\n    this._approximateExtent[dim] = extent.slice();\n};\n\n/**\n * @param {string} key\n * @return {*}\n */\nlistProto.getCalculationInfo = function (key) {\n    return this._calculationInfo[key];\n};\n\n/**\n * @param {string|Object} key or k-v object\n * @param {*} [value]\n */\nlistProto.setCalculationInfo = function (key, value) {\n    isObject(key)\n        ? zrUtil.extend(this._calculationInfo, key)\n        : (this._calculationInfo[key] = value);\n};\n\n/**\n * Get sum of data in one dimension\n * @param {string} dim\n */\nlistProto.getSum = function (dim /*, stack */) {\n    var dimData = this._storage[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 /*, stack */);\n            if (!isNaN(value)) {\n                sum += value;\n            }\n        }\n    }\n    return sum;\n};\n\n/**\n * Get median of data in one dimension\n * @param {string} dim\n */\nlistProto.getMedian = function (dim /*, stack */) {\n    var dimDataArray = [];\n    // map all data of one dimension\n    this.each(dim, function (val, idx) {\n        if (!isNaN(val)) {\n            dimDataArray.push(val);\n        }\n    });\n\n    // TODO\n    // Use quick select?\n\n    // immutability & sort\n    var sortedDimDataArray = [].concat(dimDataArray).sort(function (a, b) {\n        return a - b;\n    });\n    var len = this.count();\n    // calculate median\n    return len === 0\n        ? 0\n        : len % 2 === 1\n        ? sortedDimDataArray[(len - 1) / 2]\n        : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2;\n};\n\n// /**\n//  * Retreive the index with given value\n//  * @param {string} dim Concrete dimension.\n//  * @param {number} value\n//  * @return {number}\n//  */\n// Currently incorrect: should return dataIndex but not rawIndex.\n// Do not fix it until this method is to be used somewhere.\n// FIXME Precision of float value\n// listProto.indexOf = function (dim, value) {\n//     var storage = this._storage;\n//     var dimData = storage[dim];\n//     var chunkSize = this._chunkSize;\n//     if (dimData) {\n//         for (var i = 0, len = this.count(); i < len; i++) {\n//             var chunkIndex = Math.floor(i / chunkSize);\n//             var chunkOffset = i % chunkSize;\n//             if (dimData[chunkIndex][chunkOffset] === value) {\n//                 return i;\n//             }\n//         }\n//     }\n//     return -1;\n// };\n\n/**\n * Only support the dimension which inverted index created.\n * Do not support other cases until required.\n * @param {string} concrete dim\n * @param {number|string} value\n * @return {number} rawIndex\n */\nlistProto.rawIndexOf = function (dim, value) {\n    var invertedIndices = dim && this._invertedIndicesMap[dim];\n    if (__DEV__) {\n        if (!invertedIndices) {\n            throw new Error('Do not supported yet');\n        }\n    }\n    var rawIndex = invertedIndices[value];\n    if (rawIndex == null || isNaN(rawIndex)) {\n        return INDEX_NOT_FOUND;\n    }\n    return rawIndex;\n};\n\n/**\n * Retreive the index with given name\n * @param {number} idx\n * @param {number} name\n * @return {number}\n */\nlistProto.indexOfName = function (name) {\n    for (var i = 0, len = this.count(); i < len; i++) {\n        if (this.getName(i) === name) {\n            return i;\n        }\n    }\n\n    return -1;\n};\n\n/**\n * Retreive the index with given raw data index\n * @param {number} idx\n * @param {number} name\n * @return {number}\n */\nlistProto.indexOfRawIndex = function (rawIndex) {\n    if (!this._indices) {\n        return rawIndex;\n    }\n\n    if (rawIndex >= this._rawCount || rawIndex < 0) {\n        return -1;\n    }\n\n    // Indices are ascending\n    var indices = this._indices;\n\n    // If rawIndex === dataIndex\n    var rawDataIndex = indices[rawIndex];\n    if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) {\n        return rawIndex;\n    }\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        }\n        else if (indices[mid] > rawIndex) {\n            right = mid - 1;\n        }\n        else {\n            return mid;\n        }\n    }\n    return -1;\n};\n\n/**\n * Retreive the index of nearest value\n * @param {string} dim\n * @param {number} value\n * @param {number} [maxDistance=Infinity]\n * @return {Array.<number>} Considere multiple points has the same value.\n */\nlistProto.indicesOfNearest = function (dim, value, maxDistance) {\n    var storage = this._storage;\n    var dimData = storage[dim];\n    var nearestIndices = [];\n\n    if (!dimData) {\n        return nearestIndices;\n    }\n\n    if (maxDistance == null) {\n        maxDistance = Infinity;\n    }\n\n    var minDist = Number.MAX_VALUE;\n    var minDiff = -1;\n    for (var i = 0, len = this.count(); i < len; i++) {\n        var diff = value - this.get(dim, i /*, stack */);\n        var dist = Math.abs(diff);\n        if (diff <= maxDistance && dist <= minDist) {\n            // For the case of two data are same on xAxis, which has sequence data.\n            // Show the nearest index\n            // https://github.com/ecomfe/echarts/issues/2869\n            if (dist < minDist || (diff >= 0 && minDiff < 0)) {\n                minDist = dist;\n                minDiff = diff;\n                nearestIndices.length = 0;\n            }\n            nearestIndices.push(i);\n        }\n    }\n    return nearestIndices;\n};\n\n/**\n * Get raw data index\n * @param {number} idx\n * @return {number}\n */\nlistProto.getRawIndex = getRawIndexWithoutIndices;\n\nfunction getRawIndexWithoutIndices(idx) {\n    return idx;\n}\n\nfunction getRawIndexWithIndices(idx) {\n    if (idx < this._count && idx >= 0) {\n        return this._indices[idx];\n    }\n    return -1;\n}\n\n/**\n * Get raw data item\n * @param {number} idx\n * @return {number}\n */\nlistProto.getRawDataItem = function (idx) {\n    if (!this._rawData.persistent) {\n        var val = [];\n        for (var i = 0; i < this.dimensions.length; i++) {\n            var dim = this.dimensions[i];\n            val.push(this.get(dim, idx));\n        }\n        return val;\n    }\n    else {\n        return this._rawData.getItem(this.getRawIndex(idx));\n    }\n};\n\n/**\n * @param {number} idx\n * @param {boolean} [notDefaultIdx=false]\n * @return {string}\n */\nlistProto.getName = function (idx) {\n    var rawIndex = this.getRawIndex(idx);\n    return this._nameList[rawIndex]\n        || getRawValueFromStore(this, this._nameDimIdx, rawIndex)\n        || '';\n};\n\n/**\n * @param {number} idx\n * @param {boolean} [notDefaultIdx=false]\n * @return {string}\n */\nlistProto.getId = function (idx) {\n    return getId(this, this.getRawIndex(idx));\n};\n\nfunction getId(list, rawIndex) {\n    var id = list._idList[rawIndex];\n    if (id == null) {\n        id = getRawValueFromStore(list, list._idDimIdx, rawIndex);\n    }\n    if (id == null) {\n        // FIXME Check the usage in graph, should not use prefix.\n        id = ID_PREFIX + rawIndex;\n    }\n    return id;\n}\n\nfunction normalizeDimensions(dimensions) {\n    if (!zrUtil.isArray(dimensions)) {\n        dimensions = [dimensions];\n    }\n    return dimensions;\n}\n\nfunction validateDimensions(list, dims) {\n    for (var i = 0; i < dims.length; i++) {\n        // stroage may be empty when no data, so use\n        // dimensionInfos to check.\n        if (!list._dimensionInfos[dims[i]]) {\n            console.error('Unkown dimension ' + dims[i]);\n        }\n    }\n}\n\n/**\n * Data iteration\n * @param {string|Array.<string>}\n * @param {Function} cb\n * @param {*} [context=this]\n *\n * @example\n *  list.each('x', function (x, idx) {});\n *  list.each(['x', 'y'], function (x, y, idx) {});\n *  list.each(function (idx) {})\n */\nlistProto.each = function (dims, cb, context, contextCompat) {\n    'use strict';\n\n    if (!this._count) {\n        return;\n    }\n\n    if (typeof dims === 'function') {\n        contextCompat = context;\n        context = cb;\n        cb = dims;\n        dims = [];\n    }\n\n    // contextCompat just for compat echarts3\n    context = context || contextCompat || this;\n\n    dims = zrUtil.map(normalizeDimensions(dims), this.getDimension, this);\n\n    if (__DEV__) {\n        validateDimensions(this, dims);\n    }\n\n    var dimSize = dims.length;\n\n    for (var i = 0; i < this.count(); i++) {\n        // Simple optimization\n        switch (dimSize) {\n            case 0:\n                cb.call(context, i);\n                break;\n            case 1:\n                cb.call(context, this.get(dims[0], i), i);\n                break;\n            case 2:\n                cb.call(context, this.get(dims[0], i), this.get(dims[1], i), i);\n                break;\n            default:\n                var k = 0;\n                var value = [];\n                for (; k < dimSize; k++) {\n                    value[k] = this.get(dims[k], i);\n                }\n                // Index\n                value[k] = i;\n                cb.apply(context, value);\n        }\n    }\n};\n\n/**\n * Data filter\n * @param {string|Array.<string>}\n * @param {Function} cb\n * @param {*} [context=this]\n */\nlistProto.filterSelf = function (dimensions, cb, context, contextCompat) {\n    'use strict';\n\n    if (!this._count) {\n        return;\n    }\n\n    if (typeof dimensions === 'function') {\n        contextCompat = context;\n        context = cb;\n        cb = dimensions;\n        dimensions = [];\n    }\n\n    // contextCompat just for compat echarts3\n    context = context || contextCompat || this;\n\n    dimensions = zrUtil.map(\n        normalizeDimensions(dimensions), this.getDimension, this\n    );\n\n    if (__DEV__) {\n        validateDimensions(this, dimensions);\n    }\n\n\n    var count = this.count();\n    var Ctor = getIndicesCtor(this);\n    var newIndices = new Ctor(count);\n    var value = [];\n    var dimSize = dimensions.length;\n\n    var offset = 0;\n    var dim0 = dimensions[0];\n\n    for (var i = 0; i < count; i++) {\n        var keep;\n        var rawIdx = this.getRawIndex(i);\n        // Simple optimization\n        if (dimSize === 0) {\n            keep = cb.call(context, i);\n        }\n        else if (dimSize === 1) {\n            var val = this._getFast(dim0, rawIdx);\n            keep = cb.call(context, val, i);\n        }\n        else {\n            for (var k = 0; k < dimSize; k++) {\n                value[k] = this._getFast(dim0, rawIdx);\n            }\n            value[k] = i;\n            keep = cb.apply(context, value);\n        }\n        if (keep) {\n            newIndices[offset++] = rawIdx;\n        }\n    }\n\n    // Set indices after filtered.\n    if (offset < count) {\n        this._indices = newIndices;\n    }\n    this._count = offset;\n    // Reset data extent\n    this._extent = {};\n\n    this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;\n\n    return this;\n};\n\n/**\n * Select data in range. (For optimization of filter)\n * (Manually inline code, support 5 million data filtering in data zoom.)\n */\nlistProto.selectRange = function (range) {\n    'use strict';\n\n    if (!this._count) {\n        return;\n    }\n\n    var dimensions = [];\n    for (var dim in range) {\n        if (range.hasOwnProperty(dim)) {\n            dimensions.push(dim);\n        }\n    }\n\n    if (__DEV__) {\n        validateDimensions(this, dimensions);\n    }\n\n    var dimSize = dimensions.length;\n    if (!dimSize) {\n        return;\n    }\n\n    var originalCount = this.count();\n    var Ctor = getIndicesCtor(this);\n    var newIndices = new Ctor(originalCount);\n\n    var offset = 0;\n    var dim0 = dimensions[0];\n\n    var min = range[dim0][0];\n    var max = range[dim0][1];\n\n    var quickFinished = false;\n    if (!this._indices) {\n        // Extreme optimization for common case. About 2x faster in chrome.\n        var idx = 0;\n        if (dimSize === 1) {\n            var dimStorage = this._storage[dimensions[0]];\n            for (var k = 0; k < this._chunkCount; k++) {\n                var chunkStorage = dimStorage[k];\n                var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);\n                for (var i = 0; i < len; i++) {\n                    var val = chunkStorage[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 (\n                        (val >= min && val <= max) || isNaN(val)\n                    ) {\n                        newIndices[offset++] = idx;\n                    }\n                    idx++;\n                }\n            }\n            quickFinished = true;\n        }\n        else if (dimSize === 2) {\n            var dimStorage = this._storage[dim0];\n            var dimStorage2 = this._storage[dimensions[1]];\n            var min2 = range[dimensions[1]][0];\n            var max2 = range[dimensions[1]][1];\n            for (var k = 0; k < this._chunkCount; k++) {\n                var chunkStorage = dimStorage[k];\n                var chunkStorage2 = dimStorage2[k];\n                var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);\n                for (var i = 0; i < len; i++) {\n                    var val = chunkStorage[i];\n                    var val2 = chunkStorage2[i];\n                    // Do not filter NaN, see comment above.\n                    if ((\n                            (val >= min && val <= max) || isNaN(val)\n                        )\n                        && (\n                            (val2 >= min2 && val2 <= max2) || isNaN(val2)\n                        )\n                    ) {\n                        newIndices[offset++] = idx;\n                    }\n                    idx++;\n                }\n            }\n            quickFinished = true;\n        }\n    }\n    if (!quickFinished) {\n        if (dimSize === 1) {\n            for (var i = 0; i < originalCount; i++) {\n                var rawIndex = this.getRawIndex(i);\n                var val = this._getFast(dim0, rawIndex);\n                // Do not filter NaN, see comment above.\n                if (\n                    (val >= min && val <= max) || isNaN(val)\n                ) {\n                    newIndices[offset++] = rawIndex;\n                }\n            }\n        }\n        else {\n            for (var i = 0; i < originalCount; i++) {\n                var keep = true;\n                var rawIndex = this.getRawIndex(i);\n                for (var k = 0; k < dimSize; k++) {\n                    var dimk = dimensions[k];\n                    var val = this._getFast(dim, 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++] = this.getRawIndex(i);\n                }\n            }\n        }\n    }\n\n    // Set indices after filtered.\n    if (offset < originalCount) {\n        this._indices = newIndices;\n    }\n    this._count = offset;\n    // Reset data extent\n    this._extent = {};\n\n    this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;\n\n    return this;\n};\n\n/**\n * Data mapping to a plain array\n * @param {string|Array.<string>} [dimensions]\n * @param {Function} cb\n * @param {*} [context=this]\n * @return {Array}\n */\nlistProto.mapArray = function (dimensions, cb, context, contextCompat) {\n    'use strict';\n\n    if (typeof dimensions === 'function') {\n        contextCompat = context;\n        context = cb;\n        cb = dimensions;\n        dimensions = [];\n    }\n\n    // contextCompat just for compat echarts3\n    context = context || contextCompat || this;\n\n    var result = [];\n    this.each(dimensions, function () {\n        result.push(cb && cb.apply(this, arguments));\n    }, context);\n    return result;\n};\n\n// Data in excludeDimensions is copied, otherwise transfered.\nfunction cloneListForMapAndSample(original, excludeDimensions) {\n    var allDimensions = original.dimensions;\n    var list = new List(\n        zrUtil.map(allDimensions, original.getDimensionInfo, original),\n        original.hostModel\n    );\n    // FIXME If needs stackedOn, value may already been stacked\n    transferProperties(list, original);\n\n    var storage = list._storage = {};\n    var originalStorage = original._storage;\n\n    // Init storage\n    for (var i = 0; i < allDimensions.length; i++) {\n        var dim = allDimensions[i];\n        if (originalStorage[dim]) {\n            // Notice that we do not reset invertedIndicesMap here, becuase\n            // there is no scenario of mapping or sampling ordinal dimension.\n            if (zrUtil.indexOf(excludeDimensions, dim) >= 0) {\n                storage[dim] = cloneDimStore(originalStorage[dim]);\n                list._rawExtent[dim] = getInitialExtent();\n                list._extent[dim] = null;\n            }\n            else {\n                // Direct reference for other dimensions\n                storage[dim] = originalStorage[dim];\n            }\n        }\n    }\n    return list;\n}\n\nfunction cloneDimStore(originalDimStore) {\n    var newDimStore = new Array(originalDimStore.length);\n    for (var j = 0; j < originalDimStore.length; j++) {\n        newDimStore[j] = cloneChunk(originalDimStore[j]);\n    }\n    return newDimStore;\n}\n\nfunction getInitialExtent() {\n    return [Infinity, -Infinity];\n}\n\n/**\n * Data mapping to a new List with given dimensions\n * @param {string|Array.<string>} dimensions\n * @param {Function} cb\n * @param {*} [context=this]\n * @return {Array}\n */\nlistProto.map = function (dimensions, cb, context, contextCompat) {\n    'use strict';\n\n    // contextCompat just for compat echarts3\n    context = context || contextCompat || this;\n\n    dimensions = zrUtil.map(\n        normalizeDimensions(dimensions), this.getDimension, this\n    );\n\n    if (__DEV__) {\n        validateDimensions(this, dimensions);\n    }\n\n    var list = cloneListForMapAndSample(this, dimensions);\n\n    // Following properties are all immutable.\n    // So we can reference to the same value\n    list._indices = this._indices;\n    list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;\n\n    var storage = list._storage;\n\n    var tmpRetValue = [];\n    var chunkSize = this._chunkSize;\n    var dimSize = dimensions.length;\n    var dataCount = this.count();\n    var values = [];\n    var rawExtent = list._rawExtent;\n\n    for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) {\n        for (var dimIndex = 0; dimIndex < dimSize; dimIndex++) {\n            values[dimIndex] = this.get(dimensions[dimIndex], dataIndex /*, stack */);\n        }\n        values[dimSize] = dataIndex;\n\n        var retValue = cb && cb.apply(context, 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\n            var rawIndex = this.getRawIndex(dataIndex);\n            var chunkIndex = Math.floor(rawIndex / chunkSize);\n            var chunkOffset = rawIndex % chunkSize;\n\n            for (var i = 0; i < retValue.length; i++) {\n                var dim = dimensions[i];\n                var val = retValue[i];\n                var rawExtentOnDim = rawExtent[dim];\n\n                var dimStore = storage[dim];\n                if (dimStore) {\n                    dimStore[chunkIndex][chunkOffset] = val;\n                }\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    return list;\n};\n\n/**\n * Large data down sampling on given dimension\n * @param {string} dimension\n * @param {number} rate\n * @param {Function} sampleValue\n * @param {Function} sampleIndex Sample index for name and id\n */\nlistProto.downSample = function (dimension, rate, sampleValue, sampleIndex) {\n    var list = cloneListForMapAndSample(this, [dimension]);\n    var targetStorage = list._storage;\n\n    var frameValues = [];\n    var frameSize = Math.floor(1 / rate);\n\n    var dimStore = targetStorage[dimension];\n    var len = this.count();\n    var chunkSize = this._chunkSize;\n    var rawExtentOnDim = list._rawExtent[dimension];\n\n    var newIndices = new (getIndicesCtor(this))(len);\n\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            var originalChunkIndex = Math.floor(dataIdx / chunkSize);\n            var originalChunkOffset = dataIdx % chunkSize;\n            frameValues[k] = dimStore[originalChunkIndex][originalChunkOffset];\n        }\n        var value = sampleValue(frameValues);\n        var sampleFrameIdx = this.getRawIndex(\n            Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)\n        );\n        var sampleChunkIndex = Math.floor(sampleFrameIdx / chunkSize);\n        var sampleChunkOffset = sampleFrameIdx % chunkSize;\n        // Only write value on the filtered data\n        dimStore[sampleChunkIndex][sampleChunkOffset] = value;\n\n        if (value < rawExtentOnDim[0]) {\n            rawExtentOnDim[0] = value;\n        }\n        if (value > rawExtentOnDim[1]) {\n            rawExtentOnDim[1] = value;\n        }\n\n        newIndices[offset++] = sampleFrameIdx;\n    }\n\n    list._count = offset;\n    list._indices = newIndices;\n\n    list.getRawIndex = getRawIndexWithIndices;\n\n    return list;\n};\n\n/**\n * Get model of one data item.\n *\n * @param {number} idx\n */\n// FIXME Model proxy ?\nlistProto.getItemModel = function (idx) {\n    var hostModel = this.hostModel;\n    return new Model(this.getRawDataItem(idx), hostModel, hostModel && hostModel.ecModel);\n};\n\n/**\n * Create a data differ\n * @param {module:echarts/data/List} otherList\n * @return {module:echarts/data/DataDiffer}\n */\nlistProto.diff = function (otherList) {\n    var thisList = this;\n\n    return new DataDiffer(\n        otherList ? otherList.getIndices() : [],\n        this.getIndices(),\n        function (idx) {\n            return getId(otherList, idx);\n        },\n        function (idx) {\n            return getId(thisList, idx);\n        }\n    );\n};\n/**\n * Get visual property.\n * @param {string} key\n */\nlistProto.getVisual = function (key) {\n    var visual = this._visual;\n    return visual && visual[key];\n};\n\n/**\n * Set visual property\n * @param {string|Object} key\n * @param {*} [value]\n *\n * @example\n *  setVisual('color', color);\n *  setVisual({\n *      'color': color\n *  });\n */\nlistProto.setVisual = function (key, val) {\n    if (isObject(key)) {\n        for (var name in key) {\n            if (key.hasOwnProperty(name)) {\n                this.setVisual(name, key[name]);\n            }\n        }\n        return;\n    }\n    this._visual = this._visual || {};\n    this._visual[key] = val;\n};\n\n/**\n * Set layout property.\n * @param {string|Object} key\n * @param {*} [val]\n */\nlistProto.setLayout = function (key, val) {\n    if (isObject(key)) {\n        for (var name in key) {\n            if (key.hasOwnProperty(name)) {\n                this.setLayout(name, key[name]);\n            }\n        }\n        return;\n    }\n    this._layout[key] = val;\n};\n\n/**\n * Get layout property.\n * @param  {string} key.\n * @return {*}\n */\nlistProto.getLayout = function (key) {\n    return this._layout[key];\n};\n\n/**\n * Get layout of single data item\n * @param {number} idx\n */\nlistProto.getItemLayout = function (idx) {\n    return this._itemLayouts[idx];\n};\n\n/**\n * Set layout of single data item\n * @param {number} idx\n * @param {Object} layout\n * @param {boolean=} [merge=false]\n */\nlistProto.setItemLayout = function (idx, layout, merge) {\n    this._itemLayouts[idx] = merge\n        ? zrUtil.extend(this._itemLayouts[idx] || {}, layout)\n        : layout;\n};\n\n/**\n * Clear all layout of single data item\n */\nlistProto.clearItemLayouts = function () {\n    this._itemLayouts.length = 0;\n};\n\n/**\n * Get visual property of single data item\n * @param {number} idx\n * @param {string} key\n * @param {boolean} [ignoreParent=false]\n */\nlistProto.getItemVisual = function (idx, key, ignoreParent) {\n    var itemVisual = this._itemVisuals[idx];\n    var val = itemVisual && itemVisual[key];\n    if (val == null && !ignoreParent) {\n        // Use global visual property\n        return this.getVisual(key);\n    }\n    return val;\n};\n\n/**\n * Set visual property of single data item\n *\n * @param {number} idx\n * @param {string|Object} key\n * @param {*} [value]\n *\n * @example\n *  setItemVisual(0, 'color', color);\n *  setItemVisual(0, {\n *      'color': color\n *  });\n */\nlistProto.setItemVisual = function (idx, key, value) {\n    var itemVisual = this._itemVisuals[idx] || {};\n    var hasItemVisual = this.hasItemVisual;\n    this._itemVisuals[idx] = itemVisual;\n\n    if (isObject(key)) {\n        for (var name in key) {\n            if (key.hasOwnProperty(name)) {\n                itemVisual[name] = key[name];\n                hasItemVisual[name] = true;\n            }\n        }\n        return;\n    }\n    itemVisual[key] = value;\n    hasItemVisual[key] = true;\n};\n\n/**\n * Clear itemVisuals and list visual.\n */\nlistProto.clearAllVisual = function () {\n    this._visual = {};\n    this._itemVisuals = [];\n    this.hasItemVisual = {};\n};\n\nvar setItemDataAndSeriesIndex = function (child) {\n    child.seriesIndex = this.seriesIndex;\n    child.dataIndex = this.dataIndex;\n    child.dataType = this.dataType;\n};\n/**\n * Set graphic element relative to data. It can be set as null\n * @param {number} idx\n * @param {module:zrender/Element} [el]\n */\nlistProto.setItemGraphicEl = function (idx, el) {\n    var hostModel = this.hostModel;\n\n    if (el) {\n        // Add data index and series index for indexing the data by element\n        // Useful in tooltip\n        el.dataIndex = idx;\n        el.dataType = this.dataType;\n        el.seriesIndex = hostModel && hostModel.seriesIndex;\n        if (el.type === 'group') {\n            el.traverse(setItemDataAndSeriesIndex, el);\n        }\n    }\n\n    this._graphicEls[idx] = el;\n};\n\n/**\n * @param {number} idx\n * @return {module:zrender/Element}\n */\nlistProto.getItemGraphicEl = function (idx) {\n    return this._graphicEls[idx];\n};\n\n/**\n * @param {Function} cb\n * @param {*} context\n */\nlistProto.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/**\n * Shallow clone a new list except visual and layout properties, and graph elements.\n * New list only change the indices.\n */\nlistProto.cloneShallow = function (list) {\n    if (!list) {\n        var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this);\n        list = new List(dimensionInfoList, this.hostModel);\n    }\n\n    // FIXME\n    list._storage = this._storage;\n\n    transferProperties(list, this);\n\n    // Clone will not change the data extent and indices\n    if (this._indices) {\n        var Ctor = this._indices.constructor;\n        list._indices = new Ctor(this._indices);\n    }\n    else {\n        list._indices = null;\n    }\n    list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;\n\n    return list;\n};\n\n/**\n * Wrap some method to add more feature\n * @param {string} methodName\n * @param {Function} injectFunction\n */\nlistProto.wrapMethod = function (methodName, injectFunction) {\n    var originalMethod = this[methodName];\n    if (typeof originalMethod !== 'function') {\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// Methods that create a new list based on this list should be listed here.\n// Notice that those method should `RETURN` the new list.\nlistProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'];\n// Methods that change indices of this list should be listed here.\nlistProto.CHANGABLE_METHODS = ['filterSelf', 'selectRange'];\n\nexport default List;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @deprecated\n * Use `echarts/data/helper/createDimensions` instead.\n */\n\nimport {createHashMap, each, isString, defaults, extend, isObject, clone} from 'zrender/src/core/util';\nimport {normalizeToArray} from '../../util/model';\nimport {guessOrdinal} from './sourceHelper';\nimport Source from '../Source';\nimport {OTHER_DIMENSIONS} from './dimensionHelper';\n\n/**\n * @see {module:echarts/test/ut/spec/data/completeDimensions}\n *\n * Complete the dimensions array, by user defined `dimension` and `encode`,\n * and guessing from the data structure.\n * If no 'value' dimension specified, the first no-named dimension will be\n * named as 'value'.\n *\n * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which\n *      provides not only dim template, but also default order.\n *      properties: 'name', 'type', 'displayName'.\n *      `name` of each item provides default coord name.\n *      [{dimsDef: [string|Object, ...]}, ...] dimsDef of sysDim item provides default dim name, and\n *                                    provide dims count that the sysDim required.\n *      [{ordinalMeta}] can be specified.\n * @param {module:echarts/data/Source|Array|Object} source or data (for compatibal with pervious)\n * @param {Object} [opt]\n * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions\n *      For example: ['asdf', {name, type}, ...].\n * @param {Object|HashMap} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}\n * @param {string} [opt.generateCoord] Generate coord dim with the given name.\n *                 If not specified, extra dim names will be:\n *                 'value', 'value0', 'value1', ...\n * @param {number} [opt.generateCoordCount] By default, the generated dim name is `generateCoord`.\n *                 If `generateCoordCount` specified, the generated dim names will be:\n *                 `generateCoord` + 0, `generateCoord` + 1, ...\n *                 can be Infinity, indicate that use all of the remain columns.\n * @param {number} [opt.dimCount] If not specified, guess by the first data item.\n * @param {number} [opt.encodeDefaulter] If not specified, auto find the next available data dim.\n * @return {Array.<Object>} [{\n *      name: string mandatory,\n *      displayName: string, the origin name in dimsDef, see source helper.\n *                 If displayName given, the tooltip will displayed vertically.\n *      coordDim: string mandatory,\n *      coordDimIndex: number mandatory,\n *      type: string optional,\n *      otherDims: { never null/undefined\n *          tooltip: number optional,\n *          label: number optional,\n *          itemName: number optional,\n *          seriesName: number optional,\n *      },\n *      isExtraCoord: boolean true if coord is generated\n *          (not specified in encode and not series specified)\n *      other props ...\n * }]\n */\nfunction completeDimensions(sysDims, source, opt) {\n    if (!Source.isInstance(source)) {\n        source = Source.seriesDataToSource(source);\n    }\n\n    opt = opt || {};\n    sysDims = (sysDims || []).slice();\n    var dimsDef = (opt.dimsDef || []).slice();\n    var encodeDef = createHashMap(opt.encodeDef);\n    var dataDimNameMap = createHashMap();\n    var coordDimNameMap = createHashMap();\n    // var valueCandidate;\n    var result = [];\n\n    var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimCount);\n\n    // Apply user defined dims (`name` and `type`) and init result.\n    for (var i = 0; i < dimCount; i++) {\n        var dimDefItem = dimsDef[i] = extend(\n            {}, isObject(dimsDef[i]) ? dimsDef[i] : {name: dimsDef[i]}\n        );\n        var userDimName = dimDefItem.name;\n        var resultItem = result[i] = {otherDims: {}};\n        // Name will be applied later for avoiding duplication.\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 diplayed vertically in\n            // tooltip by default.\n            resultItem.name = resultItem.displayName = userDimName;\n            dataDimNameMap.set(userDimName, i);\n        }\n        dimDefItem.type != null && (resultItem.type = dimDefItem.type);\n        dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName);\n    }\n\n    // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.\n    encodeDef.each(function (dataDims, coordDim) {\n        dataDims = normalizeToArray(dataDims).slice();\n\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            encodeDef.set(coordDim, false);\n            return;\n        }\n\n        var validDataDims = encodeDef.set(coordDim, []);\n        each(dataDims, function (resultDimIdx, idx) {\n            // The input resultDimIdx can be dim name or index.\n            isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));\n            if (resultDimIdx != null && resultDimIdx < dimCount) {\n                validDataDims[idx] = resultDimIdx;\n                applyDim(result[resultDimIdx], coordDim, idx);\n            }\n        });\n    });\n\n    // Apply templetes and default order from `sysDims`.\n    var availDimIdx = 0;\n    each(sysDims, function (sysDimItem, sysDimIndex) {\n        var coordDim;\n        var sysDimItem;\n        var sysDimItemDimsDef;\n        var sysDimItemOtherDims;\n        if (isString(sysDimItem)) {\n            coordDim = sysDimItem;\n            sysDimItem = {};\n        }\n        else {\n            coordDim = sysDimItem.name;\n            var ordinalMeta = sysDimItem.ordinalMeta;\n            sysDimItem.ordinalMeta = null;\n            sysDimItem = clone(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\n                = sysDimItem.dimsDef = sysDimItem.otherDims = null;\n        }\n\n        var dataDims = encodeDef.get(coordDim);\n\n        // negative resultDimIdx means no need to mapping.\n        if (dataDims === false) {\n            return;\n        }\n\n        var dataDims = normalizeToArray(dataDims);\n\n        // dimensions provides default dim sequences.\n        if (!dataDims.length) {\n            for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {\n                while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {\n                    availDimIdx++;\n                }\n                availDimIdx < result.length && dataDims.push(availDimIdx++);\n            }\n        }\n\n        // Apply templates.\n        each(dataDims, function (resultDimIdx, coordDimIndex) {\n            var resultItem = result[resultDimIdx];\n            applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);\n            if (resultItem.name == null && sysDimItemDimsDef) {\n                var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex];\n                !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = {name: sysDimItemDimsDefItem});\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\n    function applyDim(resultItem, coordDim, coordDimIndex) {\n        if (OTHER_DIMENSIONS.get(coordDim) != null) {\n            resultItem.otherDims[coordDim] = coordDimIndex;\n        }\n        else {\n            resultItem.coordDim = coordDim;\n            resultItem.coordDimIndex = coordDimIndex;\n            coordDimNameMap.set(coordDim, true);\n        }\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\n    // Set dim `name` and other `coordDim` and other props.\n    for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {\n        var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};\n        var coordDim = resultItem.coordDim;\n\n        if (coordDim == null) {\n            resultItem.coordDim = genName(\n                extra, coordDimNameMap, fromZero\n            );\n            resultItem.coordDimIndex = 0;\n            if (!generateCoord || generateCoordCount <= 0) {\n                resultItem.isExtraCoord = true;\n            }\n            generateCoordCount--;\n        }\n\n        resultItem.name == null && (resultItem.name = genName(\n            resultItem.coordDim,\n            dataDimNameMap\n        ));\n\n        if (resultItem.type == null && guessOrdinal(source, resultDimIdx, resultItem.name)) {\n            resultItem.type = 'ordinal';\n        }\n    }\n\n    return result;\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 calcualte 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 storage?\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(\n        source.dimensionsDetectCount || 1,\n        sysDims.length,\n        dimsDef.length,\n        optDimCount || 0\n    );\n    each(sysDims, function (sysDimItem) {\n        var sysDimItemDimsDef = sysDimItem.dimsDef;\n        sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));\n    });\n    return dimCount;\n}\n\nfunction genName(name, map, fromZero) {\n    if (fromZero || map.get(name) != null) {\n        var i = 0;\n        while (map.get(name + i) != null) {\n            i++;\n        }\n        name += i;\n    }\n    map.set(name, true);\n    return name;\n}\n\nexport default completeDimensions;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Substitute `completeDimensions`.\n * `completeDimensions` is to be deprecated.\n */\nimport completeDimensions from './completeDimensions';\n\n/**\n * @param {module:echarts/data/Source|module:echarts/data/List} source or data.\n * @param {Object|Array} [opt]\n * @param {Array.<string|Object>} [opt.coordDimensions=[]]\n * @param {number} [opt.dimensionsCount]\n * @param {string} [opt.generateCoord]\n * @param {string} [opt.generateCoordCount]\n * @param {Array.<string|Object>} [opt.dimensionsDefine=source.dimensionsDefine] Overwrite source define.\n * @param {Object|HashMap} [opt.encodeDefine=source.encodeDefine] Overwrite source define.\n * @return {Array.<Object>} dimensionsInfo\n */\nexport default function (source, opt) {\n    opt = opt || {};\n    return completeDimensions(opt.coordDimensions || [], source, {\n        dimsDef: opt.dimensionsDefine || source.dimensionsDefine,\n        encodeDef: opt.encodeDefine || source.encodeDefine,\n        dimCount: opt.dimensionsCount,\n        generateCoord: opt.generateCoord,\n        generateCoordCount: opt.generateCoordCount\n    });\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {each, isString} from 'zrender/src/core/util';\n\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 {module:echarts/model/Series} seriesModel\n * @param {Array.<string|Object>} dimensionInfoList The same as the input of <module:echarts/data/List>.\n *        The input dimensionInfoList will be modified.\n * @param {Object} [opt]\n * @param {boolean} [opt.stackedCoordDimension=''] Specify a coord dimension if needed.\n * @param {boolean} [opt.byIndex=false]\n * @return {Object} calculationInfo\n * {\n *     stackedDimension: string\n *     stackedByDimension: string\n *     isStackedByIndex: boolean\n *     stackedOverDimension: string\n *     stackResultDimension: string\n * }\n */\nexport function enableDataStack(seriesModel, dimensionInfoList, opt) {\n    opt = opt || {};\n    var byIndex = opt.byIndex;\n    var stackedCoordDimension = opt.stackedCoordDimension;\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\n    each(dimensionInfoList, function (dimensionInfo, index) {\n        if (isString(dimensionInfo)) {\n            dimensionInfoList[index] = dimensionInfo = {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\n                && dimensionInfo.type !== 'ordinal'\n                && dimensionInfo.type !== 'time'\n                && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)\n            ) {\n                stackedDimInfo = dimensionInfo;\n            }\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\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        stackResultDimension = '__\\0ecstackresult';\n        stackedOverDimension = '__\\0ecstackedover';\n\n        // Create inverted index to fast query index by value.\n        if (stackedByDimInfo) {\n            stackedByDimInfo.createInvertedIndices = true;\n        }\n\n        var stackedDimCoordDim = stackedDimInfo.coordDim;\n        var stackedDimType = stackedDimInfo.type;\n        var stackedDimCoordIndex = 0;\n\n        each(dimensionInfoList, function (dimensionInfo) {\n            if (dimensionInfo.coordDim === stackedDimCoordDim) {\n                stackedDimCoordIndex++;\n            }\n        });\n\n        dimensionInfoList.push({\n            name: stackResultDimension,\n            coordDim: stackedDimCoordDim,\n            coordDimIndex: stackedDimCoordIndex,\n            type: stackedDimType,\n            isExtraCoord: true,\n            isCalculationCoord: true\n        });\n\n        stackedDimCoordIndex++;\n\n        dimensionInfoList.push({\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,\n            type: stackedDimType,\n            isExtraCoord: true,\n            isCalculationCoord: true\n        });\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}\n\n/**\n * @param {module:echarts/data/List} data\n * @param {string} stackedDim\n */\nexport function isDimensionStacked(data, stackedDim /*, stackedByDim*/) {\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        // && (\n        //     stackedByDim != null\n        //         ? stackedByDim === data.getCalculationInfo('stackedByDimension')\n        //         : data.getCalculationInfo('isStackedByIndex')\n        // );\n}\n\n/**\n * @param {module:echarts/data/List} data\n * @param {string} targetDim\n * @param {string} [stackedByDim] If not input this parameter, check whether\n *                                stacked by index.\n * @return {string} dimension\n */\nexport function getStackedDimension(data, targetDim) {\n    return isDimensionStacked(data, targetDim)\n        ? data.getCalculationInfo('stackResultDimension')\n        : 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\nimport * as zrUtil from 'zrender/src/core/util';\nimport List from '../../data/List';\nimport createDimensions from '../../data/helper/createDimensions';\nimport {SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceType';\nimport {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper';\nimport {getDataItemValue} from '../../util/model';\nimport CoordinateSystem from '../../CoordinateSystem';\nimport {getCoordSysDefineBySeries} from '../../model/referHelper';\nimport Source from '../../data/Source';\nimport {enableDataStack} from '../../data/helper/dataStackHelper';\n\n/**\n * @param {module:echarts/data/Source|Array} source Or raw data.\n * @param {module:echarts/model/Series} seriesModel\n * @param {Object} [opt]\n * @param {string} [opt.generateCoord]\n */\nfunction createListFromArray(source, seriesModel, opt) {\n    opt = opt || {};\n\n    if (!Source.isInstance(source)) {\n        source = Source.seriesDataToSource(source);\n    }\n\n    var coordSysName = seriesModel.get('coordinateSystem');\n    var registeredCoordSys = CoordinateSystem.get(coordSysName);\n\n    var coordSysDefine = getCoordSysDefineBySeries(seriesModel);\n\n    var coordSysDimDefs;\n\n    if (coordSysDefine) {\n        coordSysDimDefs = zrUtil.map(coordSysDefine.coordSysDims, function (dim) {\n            var dimInfo = {name: dim};\n            var axisModel = coordSysDefine.axisMap.get(dim);\n            if (axisModel) {\n                var axisType = axisModel.get('type');\n                dimInfo.type = getDimensionTypeByAxis(axisType);\n                // dimInfo.stackable = isStackable(axisType);\n            }\n            return dimInfo;\n        });\n    }\n\n    if (!coordSysDimDefs) {\n        // Get dimensions from registered coordinate system\n        coordSysDimDefs = (registeredCoordSys && (\n            registeredCoordSys.getDimensionsInfo\n                ? registeredCoordSys.getDimensionsInfo()\n                : registeredCoordSys.dimensions.slice()\n        )) || ['x', 'y'];\n    }\n\n    var dimInfoList = createDimensions(source, {\n        coordDimensions: coordSysDimDefs,\n        generateCoord: opt.generateCoord\n    });\n\n    var firstCategoryDimIndex;\n    var hasNameEncode;\n    coordSysDefine && zrUtil.each(dimInfoList, function (dimInfo, dimIndex) {\n        var coordDim = dimInfo.coordDim;\n        var categoryAxisModel = coordSysDefine.categoryAxisMap.get(coordDim);\n        if (categoryAxisModel) {\n            if (firstCategoryDimIndex == null) {\n                firstCategoryDimIndex = dimIndex;\n            }\n            dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta();\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\n    var stackCalculationInfo = enableDataStack(seriesModel, dimInfoList);\n\n    var list = new List(dimInfoList, seriesModel);\n\n    list.setCalculationInfo(stackCalculationInfo);\n\n    var dimValueGetter = (firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source))\n        ? function (itemOpt, dimName, dataIndex, dimIndex) {\n            // Use dataIndex as ordinal value in categoryAxis\n            return dimIndex === firstCategoryDimIndex\n                ? dataIndex\n                : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex);\n        }\n        : null;\n\n    list.hasItemOption = false;\n    list.initData(source, null, dimValueGetter);\n\n    return list;\n}\n\nfunction isNeedCompleteOrdinalData(source) {\n    if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n        var sampleItem = firstDataNotNull(source.data || []);\n        return sampleItem != null\n            && !zrUtil.isArray(getDataItemValue(sampleItem));\n    }\n}\n\nfunction firstDataNotNull(data) {\n    var i = 0;\n    while (i < data.length && data[i] == null) {\n        i++;\n    }\n    return data[i];\n}\n\nexport default createListFromArray;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * // Scale class management\n * @module echarts/scale/Scale\n */\n\nimport * as clazzUtil from '../util/clazz';\n\n/**\n * @param {Object} [setting]\n */\nfunction Scale(setting) {\n    this._setting = setting || {};\n\n    /**\n     * Extent\n     * @type {Array.<number>}\n     * @protected\n     */\n    this._extent = [Infinity, -Infinity];\n\n    /**\n     * Step is calculated in adjustExtent\n     * @type {Array.<number>}\n     * @protected\n     */\n    this._interval = 0;\n\n    this.init && this.init.apply(this, arguments);\n}\n\n/**\n * Parse input val to valid inner number.\n * @param {*} val\n * @return {number}\n */\nScale.prototype.parse = function (val) {\n    // Notice: This would be a trap here, If the implementation\n    // of this method depends on extent, and this method is used\n    // before extent set (like in dataZoom), it would be wrong.\n    // Nevertheless, parse does not depend on extent generally.\n    return val;\n};\n\nScale.prototype.getSetting = function (name) {\n    return this._setting[name];\n};\n\nScale.prototype.contain = function (val) {\n    var extent = this._extent;\n    return val >= extent[0] && val <= extent[1];\n};\n\n/**\n * Normalize value to linear [0, 1], return 0.5 if extent span is 0\n * @param {number} val\n * @return {number}\n */\nScale.prototype.normalize = function (val) {\n    var extent = this._extent;\n    if (extent[1] === extent[0]) {\n        return 0.5;\n    }\n    return (val - extent[0]) / (extent[1] - extent[0]);\n};\n\n/**\n * Scale normalized value\n * @param {number} val\n * @return {number}\n */\nScale.prototype.scale = function (val) {\n    var extent = this._extent;\n    return val * (extent[1] - extent[0]) + extent[0];\n};\n\n/**\n * Set extent from data\n * @param {Array.<number>} other\n */\nScale.prototype.unionExtent = function (other) {\n    var extent = this._extent;\n    other[0] < extent[0] && (extent[0] = other[0]);\n    other[1] > extent[1] && (extent[1] = other[1]);\n    // not setExtent because in log axis it may transformed to power\n    // this.setExtent(extent[0], extent[1]);\n};\n\n/**\n * Set extent from data\n * @param {module:echarts/data/List} data\n * @param {string} dim\n */\nScale.prototype.unionExtentFromData = function (data, dim) {\n    this.unionExtent(data.getApproximateExtent(dim));\n};\n\n/**\n * Get extent\n * @return {Array.<number>}\n */\nScale.prototype.getExtent = function () {\n    return this._extent.slice();\n};\n\n/**\n * Set extent\n * @param {number} start\n * @param {number} end\n */\nScale.prototype.setExtent = 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};\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 */\nScale.prototype.isBlank = function () {\n    return this._isBlank;\n},\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 */\nScale.prototype.setBlank = function (isBlank) {\n    this._isBlank = isBlank;\n};\n\n/**\n * @abstract\n * @param {*} tick\n * @return {string} label of the tick.\n */\nScale.prototype.getLabel = null;\n\n\nclazzUtil.enableClassExtend(Scale);\nclazzUtil.enableClassManagement(Scale, {\n    registerWhenExtend: true\n});\n\nexport default Scale;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {createHashMap, isObject, map} from 'zrender/src/core/util';\n\n/**\n * @constructor\n * @param {Object} [opt]\n * @param {Object} [opt.categories=[]]\n * @param {Object} [opt.needCollect=false]\n * @param {Object} [opt.deduplication=false]\n */\nfunction OrdinalMeta(opt) {\n\n    /**\n     * @readOnly\n     * @type {Array.<string>}\n     */\n    this.categories = opt.categories || [];\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._needCollect = opt.needCollect;\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._deduplication = opt.deduplication;\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._map;\n}\n\n/**\n * @param {module:echarts/model/Model} axisModel\n * @return {module:echarts/data/OrdinalMeta}\n */\nOrdinalMeta.createByAxisModel = function (axisModel) {\n    var option = axisModel.option;\n    var data = option.data;\n    var categories = data && map(data, getName);\n\n    return new OrdinalMeta({\n        categories: categories,\n        needCollect: !categories,\n        // deduplication is default in axis.\n        deduplication: option.dedplication !== false\n    });\n};\n\nvar proto = OrdinalMeta.prototype;\n\n/**\n * @param {string} category\n * @return {number} ordinal\n */\nproto.getOrdinal = function (category) {\n    return getOrCreateMap(this).get(category);\n};\n\n/**\n * @param {*} category\n * @return {number} The ordinal. If not found, return NaN.\n */\nproto.parseAndCollect = function (category) {\n    var index;\n    var needCollect = this._needCollect;\n\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 (typeof category !== 'string' && !needCollect) {\n        return category;\n    }\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        return index;\n    }\n\n    var map = getOrCreateMap(this);\n    index = map.get(category);\n\n    if (index == null) {\n        if (needCollect) {\n            index = this.categories.length;\n            this.categories[index] = category;\n            map.set(category, index);\n        }\n        else {\n            index = NaN;\n        }\n    }\n\n    return index;\n};\n\n// Consider big data, do not create map until needed.\nfunction getOrCreateMap(ordinalMeta) {\n    return ordinalMeta._map || (\n        ordinalMeta._map = createHashMap(ordinalMeta.categories)\n    );\n}\n\nfunction getName(obj) {\n    if (isObject(obj) && obj.value != null) {\n        return obj.value;\n    }\n    else {\n        return obj + '';\n    }\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 * Linear continuous scale\n * @module echarts/coord/scale/Ordinal\n *\n * http://en.wikipedia.org/wiki/Level_of_measurement\n */\n\n// FIXME only one data\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Scale from './Scale';\nimport OrdinalMeta from '../data/OrdinalMeta';\n\nvar scaleProto = Scale.prototype;\n\nvar OrdinalScale = Scale.extend({\n\n    type: 'ordinal',\n\n    /**\n     * @param {module:echarts/data/OrdianlMeta|Array.<string>} ordinalMeta\n     */\n    init: function (ordinalMeta, extent) {\n        // Caution: Should not use instanceof, consider ec-extensions using\n        // import approach to get OrdinalMeta class.\n        if (!ordinalMeta || zrUtil.isArray(ordinalMeta)) {\n            ordinalMeta = new OrdinalMeta({categories: ordinalMeta});\n        }\n        this._ordinalMeta = ordinalMeta;\n        this._extent = extent || [0, ordinalMeta.categories.length - 1];\n    },\n\n    parse: function (val) {\n        return typeof val === 'string'\n            ? this._ordinalMeta.getOrdinal(val)\n            // val might be float.\n            : Math.round(val);\n    },\n\n    contain: function (rank) {\n        rank = this.parse(rank);\n        return scaleProto.contain.call(this, rank)\n            && this._ordinalMeta.categories[rank] != null;\n    },\n\n    /**\n     * Normalize given rank or name to linear [0, 1]\n     * @param {number|string} [val]\n     * @return {number}\n     */\n    normalize: function (val) {\n        return scaleProto.normalize.call(this, this.parse(val));\n    },\n\n    scale: function (val) {\n        return Math.round(scaleProto.scale.call(this, val));\n    },\n\n    /**\n     * @return {Array}\n     */\n    getTicks: function () {\n        var ticks = [];\n        var extent = this._extent;\n        var rank = extent[0];\n\n        while (rank <= extent[1]) {\n            ticks.push(rank);\n            rank++;\n        }\n\n        return ticks;\n    },\n\n    /**\n     * Get item on rank n\n     * @param {number} n\n     * @return {string}\n     */\n    getLabel: function (n) {\n        if (!this.isBlank()) {\n            // Note that if no data, ordinalMeta.categories is an empty array.\n            return this._ordinalMeta.categories[n];\n        }\n    },\n\n    /**\n     * @return {number}\n     */\n    count: function () {\n        return this._extent[1] - this._extent[0] + 1;\n    },\n\n    /**\n     * @override\n     */\n    unionExtentFromData: function (data, dim) {\n        this.unionExtent(data.getApproximateExtent(dim));\n    },\n\n    getOrdinalMeta: function () {\n        return this._ordinalMeta;\n    },\n\n    niceTicks: zrUtil.noop,\n    niceExtent: zrUtil.noop\n});\n\n/**\n * @return {module:echarts/scale/Time}\n */\nOrdinalScale.create = function () {\n    return new OrdinalScale();\n};\n\nexport default OrdinalScale;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * For testable.\n */\n\nimport * as numberUtil from '../util/number';\n\nvar roundNumber = numberUtil.round;\n\n/**\n * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.\n *                                Should be extent[0] < extent[1].\n * @param {number} splitNumber splitNumber should be >= 1.\n * @param {number} [minInterval]\n * @param {number} [maxInterval]\n * @return {Object} {interval, intervalPrecision, niceTickExtent}\n */\nexport function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) {\n    var result = {};\n    var span = extent[1] - extent[0];\n\n    var interval = result.interval = numberUtil.nice(span / 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 = [\n        roundNumber(Math.ceil(extent[0] / interval) * interval, precision),\n        roundNumber(Math.floor(extent[1] / interval) * interval, precision)\n    ];\n\n    fixExtent(niceTickExtent, extent);\n\n    return result;\n}\n\n/**\n * @param {number} interval\n * @return {number} interval precision\n */\nexport function getIntervalPrecision(interval) {\n    // Tow more digital for tick.\n    return numberUtil.getPrecisionSafe(interval) + 2;\n}\n\nfunction clamp(niceTickExtent, idx, extent) {\n    niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);\n}\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}\n\nexport function intervalScaleGetTicks(interval, extent, niceTickExtent, intervalPrecision) {\n    var ticks = [];\n\n    // If interval is 0, return [];\n    if (!interval) {\n        return ticks;\n    }\n\n    // Consider this case: using dataZoom toolbox, zoom and zoom.\n    var safeLimit = 10000;\n\n    if (extent[0] < niceTickExtent[0]) {\n        ticks.push(extent[0]);\n    }\n    var tick = niceTickExtent[0];\n\n    while (tick <= niceTickExtent[1]) {\n        ticks.push(tick);\n        // Avoid rounding error\n        tick = roundNumber(tick + interval, intervalPrecision);\n        if (tick === ticks[ticks.length - 1]) {\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    if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {\n        ticks.push(extent[1]);\n    }\n\n    return ticks;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Interval scale\n * @module echarts/scale/Interval\n */\n\n\nimport * as numberUtil from '../util/number';\nimport * as formatUtil from '../util/format';\nimport Scale from './Scale';\nimport * as helper from './helper';\n\nvar roundNumber = numberUtil.round;\n\n/**\n * @alias module:echarts/coord/scale/Interval\n * @constructor\n */\nvar IntervalScale = Scale.extend({\n\n    type: 'interval',\n\n    _interval: 0,\n\n    _intervalPrecision: 2,\n\n    setExtent: function (start, end) {\n        var thisExtent = this._extent;\n        //start,end may be a Number like '25',so...\n        if (!isNaN(start)) {\n            thisExtent[0] = parseFloat(start);\n        }\n        if (!isNaN(end)) {\n            thisExtent[1] = parseFloat(end);\n        }\n    },\n\n    unionExtent: function (other) {\n        var extent = this._extent;\n        other[0] < extent[0] && (extent[0] = other[0]);\n        other[1] > extent[1] && (extent[1] = other[1]);\n\n        // unionExtent may called by it's sub classes\n        IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);\n    },\n    /**\n     * Get interval\n     */\n    getInterval: function () {\n        return this._interval;\n    },\n\n    /**\n     * Set interval\n     */\n    setInterval: function (interval) {\n        this._interval = interval;\n        // Dropped auto calculated niceExtent and use user setted extent\n        // We assume user wan't to set both interval, min, max to get a better result\n        this._niceExtent = this._extent.slice();\n\n        this._intervalPrecision = helper.getIntervalPrecision(interval);\n    },\n\n    /**\n     * @return {Array.<number>}\n     */\n    getTicks: function () {\n        return helper.intervalScaleGetTicks(\n            this._interval, this._extent, this._niceExtent, this._intervalPrecision\n        );\n    },\n\n    /**\n     * @param {number} data\n     * @param {Object} [opt]\n     * @param {number|string} [opt.precision] If 'auto', use nice presision.\n     * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.\n     * @return {string}\n     */\n    getLabel: function (data, opt) {\n        if (data == null) {\n            return '';\n        }\n\n        var precision = opt && opt.precision;\n\n        if (precision == null) {\n            precision = numberUtil.getPrecisionSafe(data) || 0;\n        }\n        else if (precision === 'auto') {\n            // Should be more precise then tick.\n            precision = this._intervalPrecision;\n        }\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        data = roundNumber(data, precision, true);\n\n        return formatUtil.addCommas(data);\n    },\n\n    /**\n     * Update interval and extent of intervals for nice ticks\n     *\n     * @param {number} [splitNumber = 5] Desired number of ticks\n     * @param {number} [minInterval]\n     * @param {number} [maxInterval]\n     */\n    niceTicks: function (splitNumber, minInterval, maxInterval) {\n        splitNumber = splitNumber || 5;\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\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        }\n\n        var result = helper.intervalScaleNiceTicks(\n            extent, splitNumber, minInterval, maxInterval\n        );\n\n        this._intervalPrecision = result.intervalPrecision;\n        this._interval = result.interval;\n        this._niceExtent = result.niceTickExtent;\n    },\n\n    /**\n     * Nice extent.\n     * @param {Object} opt\n     * @param {number} [opt.splitNumber = 5] Given approx tick number\n     * @param {boolean} [opt.fixMin=false]\n     * @param {boolean} [opt.fixMax=false]\n     * @param {boolean} [opt.minInterval]\n     * @param {boolean} [opt.maxInterval]\n     */\n    niceExtent: function (opt) {\n        var extent = this._extent;\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                var expandSize = 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                }\n                else {\n                    extent[0] -= expandSize / 2;\n                }\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\n        this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n\n        // var extent = this._extent;\n        var interval = this._interval;\n\n        if (!opt.fixMin) {\n            extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);\n        }\n        if (!opt.fixMax) {\n            extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);\n        }\n    }\n});\n\n/**\n * @return {module:echarts/scale/Time}\n */\nIntervalScale.create = function () {\n    return new IntervalScale();\n};\n\nexport default IntervalScale;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/* global Float32Array */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {parsePercent} from '../util/number';\nimport {isDimensionStacked} from '../data/helper/dataStackHelper';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner';\n\nvar STACK_PREFIX = '__ec_stack_';\nvar LARGE_BAR_MIN_WIDTH = 0.5;\n\nvar LargeArr = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nfunction getSeriesStackId(seriesModel) {\n    return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;\n}\n\nfunction getAxisKey(axis) {\n    return axis.dim + axis.index;\n}\n\n/**\n * @param {Object} opt\n * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently.\n * @param {number} opt.count Positive interger.\n * @param {number} [opt.barWidth]\n * @param {number} [opt.barMaxWidth]\n * @param {number} [opt.barGap]\n * @param {number} [opt.barCategoryGap]\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\n    if (baseAxis.type !== 'category') {\n        return;\n    }\n    var bandWidth = baseAxis.getBandWidth();\n\n    for (var i = 0; i < opt.count || 0; i++) {\n        params.push(zrUtil.defaults({\n            bandWidth: bandWidth,\n            axisKey: axisKey,\n            stackId: STACK_PREFIX + i\n        }, opt));\n    }\n    var widthAndOffsets = doCalBarWidthAndOffset(params);\n\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\n    return result;\n}\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) && !isInLargeMode(seriesModel)) {\n            seriesModels.push(seriesModel);\n        }\n    });\n    return seriesModels;\n}\n\nexport function makeColumnLayout(barSeries) {\n    var seriesInfoList = [];\n    zrUtil.each(barSeries, function (seriesModel) {\n        var data = seriesModel.getData();\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var axisExtent = baseAxis.getExtent();\n        var bandWidth = baseAxis.type === 'category'\n            ? baseAxis.getBandWidth()\n            : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());\n\n        var barWidth = parsePercent(\n            seriesModel.get('barWidth'), bandWidth\n        );\n        var barMaxWidth = parsePercent(\n            seriesModel.get('barMaxWidth'), bandWidth\n        );\n        var barGap = seriesModel.get('barGap');\n        var barCategoryGap = seriesModel.get('barCategoryGap');\n\n        seriesInfoList.push({\n            bandWidth: bandWidth,\n            barWidth: barWidth,\n            barMaxWidth: barMaxWidth,\n            barGap: barGap,\n            barCategoryGap: barCategoryGap,\n            axisKey: getAxisKey(baseAxis),\n            stackId: getSeriesStackId(seriesModel)\n        });\n    });\n\n    return doCalBarWidthAndOffset(seriesInfoList);\n}\n\nfunction doCalBarWidthAndOffset(seriesInfoList) {\n    // Columns info on each category axis. Key is cartesian name\n    var columnsMap = {};\n\n    zrUtil.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: '20%',\n            gap: '30%',\n            stacks: {}\n        };\n        var stacks = columnsOnAxis.stacks;\n        columnsMap[axisKey] = columnsOnAxis;\n\n        var stackId = seriesInfo.stackId;\n\n        if (!stacks[stackId]) {\n            columnsOnAxis.autoWidthCount++;\n        }\n        stacks[stackId] = stacks[stackId] || {\n            width: 0,\n            maxWidth: 0\n        };\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\n        // TODO\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\n        var barMaxWidth = seriesInfo.barMaxWidth;\n        barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n        var barGap = seriesInfo.barGap;\n        (barGap != null) && (columnsOnAxis.gap = barGap);\n        var barCategoryGap = seriesInfo.barCategoryGap;\n        (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);\n    });\n\n    var result = {};\n\n    zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) {\n\n        result[coordSysName] = {};\n\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\n        var remainedWidth = columnsOnAxis.remainedWidth;\n        var autoWidthCount = columnsOnAxis.autoWidthCount;\n        var autoWidth = (remainedWidth - categoryGap)\n            / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n\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\n        // Recalculate width again\n        autoWidth = (remainedWidth - categoryGap)\n            / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n\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\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\n            offset += column.width * (1 + barGapPercent);\n        });\n    });\n\n    return result;\n}\n\n/**\n * @param {Object} barWidthAndOffset The result of makeColumnLayout\n * @param {module:echarts/coord/Axis} axis\n * @param {module:echarts/model/Series} [seriesModel] If not provided, return all.\n * @return {Object} {stackId: {offset, width}} or {offset, width} if seriesModel provided.\n */\nexport function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) {\n    if (barWidthAndOffset && axis) {\n        var result = barWidthAndOffset[getAxisKey(axis)];\n        if (result != null && seriesModel != null) {\n            result = result[getSeriesStackId(seriesModel)];\n        }\n        return result;\n    }\n}\n\n/**\n * @param {string} seriesType\n * @param {module:echarts/model/Global} ecModel\n */\nexport function layout(seriesType, ecModel) {\n\n    var seriesModels = prepareLayoutBarSeries(seriesType, ecModel);\n    var barWidthAndOffset = makeColumnLayout(seriesModels);\n\n    var lastStackCoords = {};\n    var lastStackCoordsOrigin = {};\n\n    zrUtil.each(seriesModels, function (seriesModel) {\n\n        var data = seriesModel.getData();\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n\n        var stackId = getSeriesStackId(seriesModel);\n        var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId];\n        var columnOffset = columnLayoutInfo.offset;\n        var columnWidth = columnLayoutInfo.width;\n        var valueAxis = cartesian.getOtherAxis(baseAxis);\n\n        var barMinHeight = seriesModel.get('barMinHeight') || 0;\n\n        lastStackCoords[stackId] = lastStackCoords[stackId] || [];\n        lastStackCoordsOrigin[stackId] = lastStackCoordsOrigin[stackId] || []; // Fix #4243\n\n        data.setLayout({\n            offset: columnOffset,\n            size: columnWidth\n        });\n\n        var valueDim = data.mapDimension(valueAxis.dim);\n        var baseDim = data.mapDimension(baseAxis.dim);\n        var stacked = isDimensionStacked(data, valueDim /*, baseDim*/);\n        var isValueAxisH = valueAxis.isHorizontal();\n\n        var valueAxisStart = getValueAxisStart(baseAxis, valueAxis, stacked);\n\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\n            // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in \"axisProxy\".\n            if (isNaN(value) || isNaN(baseValue)) {\n                continue;\n            }\n\n            var sign = value >= 0 ? 'p' : 'n';\n            var baseCoord = valueAxisStart;\n\n            // Because of the barMinHeight, we can not use the value in\n            // stackResultDimension directly.\n            if (stacked) {\n                // Only ordinal axis can be stacked.\n                if (!lastStackCoords[stackId][baseValue]) {\n                    lastStackCoords[stackId][baseValue] = {\n                        p: valueAxisStart, // Positive stack\n                        n: valueAxisStart  // Negative stack\n                    };\n                }\n                // Should also consider #4243\n                baseCoord = lastStackCoords[stackId][baseValue][sign];\n            }\n\n            var x;\n            var y;\n            var width;\n            var height;\n\n            if (isValueAxisH) {\n                var coord = cartesian.dataToPoint([value, baseValue]);\n                x = baseCoord;\n                y = coord[1] + columnOffset;\n                width = coord[0] - valueAxisStart;\n                height = columnWidth;\n\n                if (Math.abs(width) < barMinHeight) {\n                    width = (width < 0 ? -1 : 1) * barMinHeight;\n                }\n                stacked && (lastStackCoords[stackId][baseValue][sign] += width);\n            }\n            else {\n                var coord = cartesian.dataToPoint([baseValue, value]);\n                x = coord[0] + columnOffset;\n                y = baseCoord;\n                width = columnWidth;\n                height = coord[1] - valueAxisStart;\n\n                if (Math.abs(height) < barMinHeight) {\n                    // Include zero to has a positive bar\n                    height = (height <= 0 ? -1 : 1) * barMinHeight;\n                }\n                stacked && (lastStackCoords[stackId][baseValue][sign] += height);\n            }\n\n            data.setItemLayout(idx, {\n                x: x,\n                y: y,\n                width: width,\n                height: height\n            });\n        }\n\n    }, this);\n}\n\n// TODO: Do not support stack in large mode yet.\nexport var largeLayout = {\n\n    seriesType: 'bar',\n\n    plan: createRenderPlanner(),\n\n    reset: function (seriesModel) {\n        if (!isOnCartesian(seriesModel) || !isInLargeMode(seriesModel)) {\n            return;\n        }\n\n        var data = seriesModel.getData();\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var valueAxis = cartesian.getOtherAxis(baseAxis);\n        var valueDim = data.mapDimension(valueAxis.dim);\n        var baseDim = data.mapDimension(baseAxis.dim);\n        var valueAxisHorizontal = valueAxis.isHorizontal();\n        var valueDimIdx = valueAxisHorizontal ? 0 : 1;\n\n        var barWidth = retrieveColumnLayout(\n            makeColumnLayout([seriesModel]), baseAxis, seriesModel\n        ).width;\n        if (!(barWidth > LARGE_BAR_MIN_WIDTH)) { // jshint ignore:line\n            barWidth = LARGE_BAR_MIN_WIDTH;\n        }\n\n        return {progress: progress};\n\n        function progress(params, data) {\n            var count = params.count;\n            var largePoints = new LargeArr(count * 2);\n            var largeDataIndices = new LargeArr(count);\n            var dataIndex;\n            var coord = [];\n            var valuePair = [];\n            var pointsOffset = 0;\n            var idxOffset = 0;\n\n            while ((dataIndex = params.next()) != null) {\n                valuePair[valueDimIdx] = data.get(valueDim, dataIndex);\n                valuePair[1 - valueDimIdx] = data.get(baseDim, dataIndex);\n\n                coord = cartesian.dataToPoint(valuePair, null, coord);\n                // Data index might not be in order, depends on `progressiveChunkMode`.\n                largePoints[pointsOffset++] = coord[0];\n                largePoints[pointsOffset++] = coord[1];\n                largeDataIndices[idxOffset++] = dataIndex;\n            }\n\n            data.setLayout({\n                largePoints: largePoints,\n                largeDataIndices: largeDataIndices,\n                barWidth: barWidth,\n                valueAxisStart: getValueAxisStart(baseAxis, valueAxis, false),\n                valueAxisHorizontal: valueAxisHorizontal\n            });\n        }\n    }\n};\n\nfunction isOnCartesian(seriesModel) {\n    return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d';\n}\n\nfunction isInLargeMode(seriesModel) {\n    return seriesModel.pipelineContext && seriesModel.pipelineContext.large;\n}\n\n// See cases in `test/bar-start.html` and `#7412`, `#8747`.\nfunction getValueAxisStart(baseAxis, valueAxis, stacked) {\n    var extent = valueAxis.getGlobalExtent();\n    var min;\n    var max;\n    if (extent[0] > extent[1]) {\n        min = extent[1];\n        max = extent[0];\n    }\n    else {\n        min = extent[0];\n        max = extent[1];\n    }\n\n    var valueStart = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));\n    valueStart < min && (valueStart = min);\n    valueStart > max && (valueStart = max);\n\n    return valueStart;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/*\n* A third-party license is embeded 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\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 have\n// concidered these common case:\n// (1) Time that is persistent in server is in UTC, but it is needed to be diplayed\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.\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as numberUtil from '../util/number';\nimport * as formatUtil from '../util/format';\nimport * as scaleHelper from './helper';\nimport IntervalScale from './Interval';\n\nvar intervalScaleProto = IntervalScale.prototype;\n\nvar mathCeil = Math.ceil;\nvar mathFloor = Math.floor;\nvar ONE_SECOND = 1000;\nvar ONE_MINUTE = ONE_SECOND * 60;\nvar ONE_HOUR = ONE_MINUTE * 60;\nvar ONE_DAY = ONE_HOUR * 24;\n\n// FIXME 公用？\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        }\n        else {\n            hi = mid;\n        }\n    }\n    return lo;\n};\n\n/**\n * @alias module:echarts/coord/scale/Time\n * @constructor\n */\nvar TimeScale = IntervalScale.extend({\n    type: 'time',\n\n    /**\n     * @override\n     */\n    getLabel: function (val) {\n        var stepLvl = this._stepLvl;\n\n        var date = new Date(val);\n\n        return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));\n    },\n\n    /**\n     * @override\n     */\n    niceExtent: function (opt) {\n        var extent = this._extent;\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\n        this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n\n        // var extent = this._extent;\n        var interval = this._interval;\n\n        if (!opt.fixMin) {\n            extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);\n        }\n        if (!opt.fixMax) {\n            extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);\n        }\n    },\n\n    /**\n     * @override\n     */\n    niceTicks: function (approxTickNum, minInterval, maxInterval) {\n        approxTickNum = approxTickNum || 10;\n\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\n        var approxInterval = span / approxTickNum;\n\n        if (minInterval != null && approxInterval < minInterval) {\n            approxInterval = minInterval;\n        }\n        if (maxInterval != null && approxInterval > maxInterval) {\n            approxInterval = maxInterval;\n        }\n\n        var scaleLevelsLen = scaleLevels.length;\n        var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);\n\n        var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];\n        var interval = level[1];\n        // Same with interval scale if span is much larger than 1 year\n        if (level[0] === 'year') {\n            var yearSpan = span / interval;\n\n            // From \"Nice Numbers for Graph Labels\" of Graphic Gems\n            // var niceYearSpan = numberUtil.nice(yearSpan, false);\n            var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);\n\n            interval *= yearStep;\n        }\n\n        var timezoneOffset = this.getSetting('useUTC')\n            ? 0 : (new Date(+extent[0] || +extent[1])).getTimezoneOffset() * 60 * 1000;\n        var niceExtent = [\n            Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),\n            Math.round(mathFloor((extent[1] - timezoneOffset) / interval) * interval + timezoneOffset)\n        ];\n\n        scaleHelper.fixExtent(niceExtent, extent);\n\n        this._stepLvl = level;\n        // Interval will be used in getTicks\n        this._interval = interval;\n        this._niceExtent = niceExtent;\n    },\n\n    parse: function (val) {\n        // val might be float.\n        return +numberUtil.parseDate(val);\n    }\n});\n\nzrUtil.each(['contain', 'normalize'], function (methodName) {\n    TimeScale.prototype[methodName] = function (val) {\n        return intervalScaleProto[methodName].call(this, this.parse(val));\n    };\n});\n\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 scaleLevels = [\n    // Format              interval\n    ['hh:mm:ss', ONE_SECOND],          // 1s\n    ['hh:mm:ss', ONE_SECOND * 5],      // 5s\n    ['hh:mm:ss', ONE_SECOND * 10],     // 10s\n    ['hh:mm:ss', ONE_SECOND * 15],     // 15s\n    ['hh:mm:ss', ONE_SECOND * 30],     // 30s\n    ['hh:mm\\nMM-dd', ONE_MINUTE],      // 1m\n    ['hh:mm\\nMM-dd', ONE_MINUTE * 5],  // 5m\n    ['hh:mm\\nMM-dd', ONE_MINUTE * 10], // 10m\n    ['hh:mm\\nMM-dd', ONE_MINUTE * 15], // 15m\n    ['hh:mm\\nMM-dd', ONE_MINUTE * 30], // 30m\n    ['hh:mm\\nMM-dd', ONE_HOUR],        // 1h\n    ['hh:mm\\nMM-dd', ONE_HOUR * 2],    // 2h\n    ['hh:mm\\nMM-dd', ONE_HOUR * 6],    // 6h\n    ['hh:mm\\nMM-dd', ONE_HOUR * 12],   // 12h\n    ['MM-dd\\nyyyy', ONE_DAY],          // 1d\n    ['MM-dd\\nyyyy', ONE_DAY * 2],      // 2d\n    ['MM-dd\\nyyyy', ONE_DAY * 3],      // 3d\n    ['MM-dd\\nyyyy', ONE_DAY * 4],      // 4d\n    ['MM-dd\\nyyyy', ONE_DAY * 5],      // 5d\n    ['MM-dd\\nyyyy', ONE_DAY * 6],      // 6d\n    ['week', ONE_DAY * 7],             // 7d\n    ['MM-dd\\nyyyy', ONE_DAY * 10],     // 10d\n    ['week', ONE_DAY * 14],            // 2w\n    ['week', ONE_DAY * 21],            // 3w\n    ['month', ONE_DAY * 31],           // 1M\n    ['week', ONE_DAY * 42],            // 6w\n    ['month', ONE_DAY * 62],           // 2M\n    ['week', ONE_DAY * 70],            // 10w\n    ['quarter', ONE_DAY * 95],         // 3M\n    ['month', ONE_DAY * 31 * 4],       // 4M\n    ['month', ONE_DAY * 31 * 5],       // 5M\n    ['half-year', ONE_DAY * 380 / 2],  // 6M\n    ['month', ONE_DAY * 31 * 8],       // 8M\n    ['month', ONE_DAY * 31 * 10],      // 10M\n    ['year', ONE_DAY * 380]            // 1Y\n];\n\n/**\n * @param {module:echarts/model/Model}\n * @return {module:echarts/scale/Time}\n */\nTimeScale.create = function (model) {\n    return new TimeScale({useUTC: model.ecModel.get('useUTC')});\n};\n\nexport default TimeScale;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Log scale\n * @module echarts/scale/Log\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Scale from './Scale';\nimport * as numberUtil from '../util/number';\n\n// Use some method of IntervalScale\nimport IntervalScale from './Interval';\n\nvar scaleProto = Scale.prototype;\nvar intervalScaleProto = IntervalScale.prototype;\n\nvar getPrecisionSafe = numberUtil.getPrecisionSafe;\nvar roundingErrorFix = numberUtil.round;\n\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar mathPow = Math.pow;\n\nvar mathLog = Math.log;\n\nvar LogScale = Scale.extend({\n\n    type: 'log',\n\n    base: 10,\n\n    $constructor: function () {\n        Scale.apply(this, arguments);\n        this._originalScale = new IntervalScale();\n    },\n\n    /**\n     * @return {Array.<number>}\n     */\n    getTicks: function () {\n        var originalScale = this._originalScale;\n        var extent = this._extent;\n        var originalExtent = originalScale.getExtent();\n\n        return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {\n            var powVal = numberUtil.round(mathPow(this.base, val));\n\n            // Fix #4158\n            powVal = (val === extent[0] && originalScale.__fixMin)\n                ? fixRoundingError(powVal, originalExtent[0])\n                : powVal;\n            powVal = (val === extent[1] && originalScale.__fixMax)\n                ? fixRoundingError(powVal, originalExtent[1])\n                : powVal;\n\n            return powVal;\n        }, this);\n    },\n\n    /**\n     * @param {number} val\n     * @return {string}\n     */\n    getLabel: intervalScaleProto.getLabel,\n\n    /**\n     * @param  {number} val\n     * @return {number}\n     */\n    scale: function (val) {\n        val = scaleProto.scale.call(this, val);\n        return mathPow(this.base, val);\n    },\n\n    /**\n     * @param {number} start\n     * @param {number} end\n     */\n    setExtent: function (start, end) {\n        var base = this.base;\n        start = mathLog(start) / mathLog(base);\n        end = mathLog(end) / mathLog(base);\n        intervalScaleProto.setExtent.call(this, start, end);\n    },\n\n    /**\n     * @return {number} end\n     */\n    getExtent: function () {\n        var base = this.base;\n        var extent = scaleProto.getExtent.call(this);\n        extent[0] = mathPow(base, extent[0]);\n        extent[1] = mathPow(base, extent[1]);\n\n        // Fix #4158\n        var originalScale = this._originalScale;\n        var originalExtent = originalScale.getExtent();\n        originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));\n        originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));\n\n        return extent;\n    },\n\n    /**\n     * @param  {Array.<number>} extent\n     */\n    unionExtent: function (extent) {\n        this._originalScale.unionExtent(extent);\n\n        var base = this.base;\n        extent[0] = mathLog(extent[0]) / mathLog(base);\n        extent[1] = mathLog(extent[1]) / mathLog(base);\n        scaleProto.unionExtent.call(this, extent);\n    },\n\n    /**\n     * @override\n     */\n    unionExtentFromData: function (data, dim) {\n        // TODO\n        // filter value that <= 0\n        this.unionExtent(data.getApproximateExtent(dim));\n    },\n\n    /**\n     * Update interval and extent of intervals for nice ticks\n     * @param  {number} [approxTickNum = 10] Given approx tick number\n     */\n    niceTicks: function (approxTickNum) {\n        approxTickNum = approxTickNum || 10;\n        var extent = this._extent;\n        var span = extent[1] - extent[0];\n        if (span === Infinity || span <= 0) {\n            return;\n        }\n\n        var interval = numberUtil.quantity(span);\n        var err = approxTickNum / span * interval;\n\n        // Filter ticks to get closer to the desired count.\n        if (err <= 0.5) {\n            interval *= 10;\n        }\n\n        // Interval should be integer\n        while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {\n            interval *= 10;\n        }\n\n        var niceExtent = [\n            numberUtil.round(mathCeil(extent[0] / interval) * interval),\n            numberUtil.round(mathFloor(extent[1] / interval) * interval)\n        ];\n\n        this._interval = interval;\n        this._niceExtent = niceExtent;\n    },\n\n    /**\n     * Nice extent.\n     * @override\n     */\n    niceExtent: function (opt) {\n        intervalScaleProto.niceExtent.call(this, opt);\n\n        var originalScale = this._originalScale;\n        originalScale.__fixMin = opt.fixMin;\n        originalScale.__fixMax = opt.fixMax;\n    }\n\n});\n\nzrUtil.each(['contain', 'normalize'], function (methodName) {\n    LogScale.prototype[methodName] = function (val) {\n        val = mathLog(val) / mathLog(this.base);\n        return scaleProto[methodName].call(this, val);\n    };\n});\n\nLogScale.create = function () {\n    return new LogScale();\n};\n\nfunction fixRoundingError(val, originalVal) {\n    return roundingErrorFix(val, getPrecisionSafe(originalVal));\n}\n\nexport default LogScale;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport OrdinalScale from '../scale/Ordinal';\nimport IntervalScale from '../scale/Interval';\nimport Scale from '../scale/Scale';\nimport * as numberUtil from '../util/number';\nimport {\n    prepareLayoutBarSeries,\n    makeColumnLayout,\n    retrieveColumnLayout\n} from '../layout/barGrid';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\n\nimport '../scale/Time';\nimport '../scale/Log';\n\n/**\n * Get axis scale extent before niced.\n * Item of returned array can only be number (including Infinity and NaN).\n */\nexport function getScaleExtent(scale, model) {\n    var scaleType = scale.type;\n\n    var min = model.getMin();\n    var max = model.getMax();\n    var fixMin = min != null;\n    var fixMax = max != null;\n    var originalExtent = scale.getExtent();\n\n    var axisDataLen;\n    var boundaryGap;\n    var span;\n    if (scaleType === 'ordinal') {\n        axisDataLen = model.getCategories().length;\n    }\n    else {\n        boundaryGap = model.get('boundaryGap');\n        if (!zrUtil.isArray(boundaryGap)) {\n            boundaryGap = [boundaryGap || 0, boundaryGap || 0];\n        }\n        if (typeof boundaryGap[0] === 'boolean') {\n            if (__DEV__) {\n                console.warn('Boolean type for boundaryGap is only '\n                    + 'allowed for ordinal axis. Please use string in '\n                    + 'percentage instead, e.g., \"20%\". Currently, '\n                    + 'boundaryGap is set to be 0.');\n            }\n            boundaryGap = [0, 0];\n        }\n        boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);\n        boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);\n        span = (originalExtent[1] - originalExtent[0])\n            || Math.abs(originalExtent[0]);\n    }\n\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\n    // FIXME\n    // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?\n    // (2) When `needCrossZero` and all data is positive/negative, should it be ensured\n    // that the results processed by boundaryGap are positive/negative?\n\n    if (min == null) {\n        min = scaleType === 'ordinal'\n            ? (axisDataLen ? 0 : NaN)\n            : originalExtent[0] - boundaryGap[0] * span;\n    }\n    if (max == null) {\n        max = scaleType === 'ordinal'\n            ? (axisDataLen ? axisDataLen - 1 : NaN)\n            : originalExtent[1] + boundaryGap[1] * span;\n    }\n\n    if (min === 'dataMin') {\n        min = originalExtent[0];\n    }\n    else if (typeof min === 'function') {\n        min = min({\n            min: originalExtent[0],\n            max: originalExtent[1]\n        });\n    }\n\n    if (max === 'dataMax') {\n        max = originalExtent[1];\n    }\n    else if (typeof max === 'function') {\n        max = max({\n            min: originalExtent[0],\n            max: originalExtent[1]\n        });\n    }\n\n    (min == null || !isFinite(min)) && (min = NaN);\n    (max == null || !isFinite(max)) && (max = NaN);\n\n    scale.setBlank(\n        zrUtil.eqNaN(min)\n        || zrUtil.eqNaN(max)\n        || (scaleType === 'ordinal' && !scale.getOrdinalMeta().categories.length)\n    );\n\n    // Evaluate if axis needs cross zero\n    if (model.getNeedCrossZero()) {\n        // Axis is over zero and min is not set\n        if (min > 0 && max > 0 && !fixMin) {\n            min = 0;\n        }\n        // Axis is under zero and max is not set\n        if (min < 0 && max < 0 && !fixMax) {\n            max = 0;\n        }\n    }\n\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;\n\n        zrUtil.each(barSeriesModels, function (seriesModel) {\n            isBaseAxisAndHasBarSeries |= seriesModel.getBaseAxis() === model.axis;\n        });\n\n        if (isBaseAxisAndHasBarSeries) {\n            // Calculate placement of bars on axis\n            var barWidthAndOffset = makeColumnLayout(barSeriesModels);\n\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\n    return [min, max];\n}\n\nfunction adjustScaleForOverflow(min, max, model, barWidthAndOffset) {\n\n    // Get Axis Length\n    var axisExtent = model.axis.getExtent();\n    var axisLength = axisExtent[1] - axisExtent[0];\n\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 {min: min, 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\n    // Calulate 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\n    max += overflowBuffer * (maxOverflow / totalOverFlow);\n    min -= overflowBuffer * (minOverflow / totalOverFlow);\n\n    return {min: min, max: max};\n}\n\nexport function niceScaleExtent(scale, model) {\n    var extent = getScaleExtent(scale, model);\n    var fixMin = model.getMin() != null;\n    var fixMax = model.getMax() != null;\n    var splitNumber = model.get('splitNumber');\n\n    if (scale.type === 'log') {\n        scale.base = model.get('logBase');\n    }\n\n    var scaleType = scale.type;\n    scale.setExtent(extent[0], extent[1]);\n    scale.niceExtent({\n        splitNumber: splitNumber,\n        fixMin: fixMin,\n        fixMax: fixMax,\n        minInterval: (scaleType === 'interval' || scaleType === 'time')\n            ? model.get('minInterval') : null,\n        maxInterval: (scaleType === 'interval' || scaleType === 'time')\n            ? model.get('maxInterval') : null\n    });\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    var interval = model.get('interval');\n    if (interval != null) {\n        scale.setInterval && scale.setInterval(interval);\n    }\n}\n\n/**\n * @param {module:echarts/model/Model} model\n * @param {string} [axisType] Default retrieve from model.type\n * @return {module:echarts/scale/*}\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                    model.getOrdinalMeta\n                        ? model.getOrdinalMeta()\n                        : model.getCategories(),\n                    [Infinity, -Infinity]\n                );\n            case 'value':\n                return new IntervalScale();\n            // Extended scale, like time and log\n            default:\n                return (Scale.getClass(axisType) || IntervalScale).create(model);\n        }\n    }\n}\n\n/**\n * Check if the axis corss 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/**\n * @param {module:echarts/coord/Axis} axis\n * @return {Function} Label formatter function.\n *         param: {number} tickValue,\n *         param: {number} idx, the index in all ticks.\n *                         If category axis, this param is not requied.\n *         return: {string} label string.\n */\nexport function makeLabelFormatter(axis) {\n    var labelFormatter = axis.getLabelModel().get('formatter');\n    var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null;\n\n    if (typeof labelFormatter === 'string') {\n        labelFormatter = (function (tpl) {\n            return function (val) {\n                // For category axis, get raw value; for numeric axis,\n                // get foramtted label like '1,333,444'.\n                val = axis.scale.getLabel(val);\n                return tpl.replace('{value}', val != null ? val : '');\n            };\n        })(labelFormatter);\n        // Consider empty array\n        return labelFormatter;\n    }\n    else if (typeof labelFormatter === 'function') {\n        return function (tickValue, 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            if (categoryTickStart != null) {\n                idx = tickValue - categoryTickStart;\n            }\n            return labelFormatter(getAxisRawValue(axis, tickValue), idx);\n        };\n    }\n    else {\n        return function (tick) {\n            return axis.scale.getLabel(tick);\n        };\n    }\n}\n\nexport function getAxisRawValue(axis, value) {\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(value) : value;\n}\n\n/**\n * @param {module:echarts/coord/Axis} axis\n * @return {module:zrender/core/BoundingRect} Be null/undefined if no labels.\n */\nexport function estimateLabelUnionRect(axis) {\n    var axisModel = axis.model;\n    var scale = axis.scale;\n\n    if (!axisModel.get('axisLabel.show') || scale.isBlank()) {\n        return;\n    }\n\n    var isCategory = axis.type === 'category';\n\n    var realNumberScaleTicks;\n    var tickCount;\n    var categoryScaleExtent = scale.getExtent();\n\n    // Optimize for large category data, avoid call `getTicks()`.\n    if (isCategory) {\n        tickCount = scale.count();\n    }\n    else {\n        realNumberScaleTicks = scale.getTicks();\n        tickCount = realNumberScaleTicks.length;\n    }\n\n    var axisLabelModel = axis.getLabelModel();\n    var labelFormatter = makeLabelFormatter(axis);\n\n    var rect;\n    var step = 1;\n    // Simple optimization for large amount of labels\n    if (tickCount > 40) {\n        step = Math.ceil(tickCount / 40);\n    }\n    for (var i = 0; i < tickCount; i += step) {\n        var tickValue = realNumberScaleTicks ? realNumberScaleTicks[i] : categoryScaleExtent[0] + i;\n        var label = labelFormatter(tickValue);\n        var unrotatedSingleRect = axisLabelModel.getTextRect(label);\n        var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0);\n\n        rect ? rect.union(singleRect) : (rect = singleRect);\n    }\n\n    return rect;\n}\n\nfunction rotateTextRect(textRect, rotate) {\n    var rotateRadians = rotate * Math.PI / 180;\n    var boundingBox = textRect.plain();\n    var beforeWidth = boundingBox.width;\n    var beforeHeight = boundingBox.height;\n    var afterWidth = beforeWidth * Math.cos(rotateRadians) + beforeHeight * Math.sin(rotateRadians);\n    var afterHeight = beforeWidth * Math.sin(rotateRadians) + beforeHeight * Math.cos(rotateRadians);\n    var rotatedRect = new BoundingRect(boundingBox.x, boundingBox.y, afterWidth, afterHeight);\n\n    return rotatedRect;\n}\n\n/**\n * @param {module:echarts/src/model/Model} 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/**\n * Set `categoryInterval` as 0 implicitly indicates that\n * show all labels reguardless of overlap.\n * @param {Object} axis axisModel.axis\n * @return {boolean}\n */\nexport function shouldShowAllLabels(axis) {\n    return axis.type === 'category'\n        && getOptionCategoryInterval(axis.getLabelModel()) === 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\nimport * as zrUtil from 'zrender/src/core/util';\n// import * as axisHelper from './axisHelper';\n\nexport default {\n\n    /**\n     * @param {boolean} origin\n     * @return {number|string} min value or 'dataMin' or null/undefined (means auto) or NaN\n     */\n    getMin: function (origin) {\n        var option = this.option;\n        var min = (!origin && option.rangeStart != null)\n            ? option.rangeStart : option.min;\n\n        if (this.axis\n            && min != null\n            && min !== 'dataMin'\n            && typeof min !== 'function'\n            && !zrUtil.eqNaN(min)\n        ) {\n            min = this.axis.scale.parse(min);\n        }\n        return min;\n    },\n\n    /**\n     * @param {boolean} origin\n     * @return {number|string} max value or 'dataMax' or null/undefined (means auto) or NaN\n     */\n    getMax: function (origin) {\n        var option = this.option;\n        var max = (!origin && option.rangeEnd != null)\n            ? option.rangeEnd : option.max;\n\n        if (this.axis\n            && max != null\n            && max !== 'dataMax'\n            && typeof max !== 'function'\n            && !zrUtil.eqNaN(max)\n        ) {\n            max = this.axis.scale.parse(max);\n        }\n        return max;\n    },\n\n    /**\n     * @return {boolean}\n     */\n    getNeedCrossZero: function () {\n        var option = this.option;\n        return (option.rangeStart != null || option.rangeEnd != null)\n            ? false : !option.scale;\n    },\n\n    /**\n     * Should be implemented by each axis model if necessary.\n     * @return {module:echarts/model/Component} coordinate system model\n     */\n    getCoordSysModel: zrUtil.noop,\n\n    /**\n     * @param {number} rangeStart Can only be finite number or null/undefined or NaN.\n     * @param {number} rangeEnd Can only be finite number or null/undefined or NaN.\n     */\n    setRange: function (rangeStart, rangeEnd) {\n        this.option.rangeStart = rangeStart;\n        this.option.rangeEnd = rangeEnd;\n    },\n\n    /**\n     * Reset range\n     */\n    resetRange: function () {\n        // rangeStart and rangeEnd is readonly.\n        this.option.rangeStart = this.option.rangeEnd = 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// Symbol factory\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from './graphic';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {calculateTextPosition} from 'zrender/src/contain/text';\n\n/**\n * Triangle shape\n * @inner\n */\nvar Triangle = graphic.extendShape({\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/**\n * Diamond shape\n * @inner\n */\nvar Diamond = graphic.extendShape({\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/**\n * Pin shape\n * @inner\n */\nvar Pin = graphic.extendShape({\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\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\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\n        var tanX = Math.sin(angle);\n        var tanY = Math.cos(angle);\n\n        var cpLen = r * 0.6;\n        var cpLen2 = r * 0.7;\n\n        path.moveTo(x - dx, cy + dy);\n\n        path.arc(\n            x, cy, r,\n            Math.PI - angle,\n            Math.PI * 2 + angle\n        );\n        path.bezierCurveTo(\n            x + dx - tanX * cpLen, cy + dy + tanY * cpLen,\n            x, y - cpLen2,\n            x, y\n        );\n        path.bezierCurveTo(\n            x, y - cpLen2,\n            x - dx + tanX * cpLen, cy + dy + tanY * cpLen,\n            x - dx, cy + dy\n        );\n        path.closePath();\n    }\n});\n\n/**\n * Arrow shape\n * @inner\n */\nvar Arrow = graphic.extendShape({\n\n    type: 'arrow',\n\n    shape: {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n    },\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/**\n * Map of path contructors\n * @type {Object.<string, module:zrender/graphic/Path>}\n */\nvar symbolCtors = {\n\n    line: graphic.Line,\n\n    rect: graphic.Rect,\n\n    roundRect: graphic.Rect,\n\n    square: graphic.Rect,\n\n    circle: graphic.Circle,\n\n    diamond: Diamond,\n\n    pin: Pin,\n\n    arrow: Arrow,\n\n    triangle: Triangle\n};\n\nvar symbolShapeMakers = {\n\n    line: function (x, y, w, h, shape) {\n        // FIXME\n        shape.x1 = x;\n        shape.y1 = y + h / 2;\n        shape.x2 = x + w;\n        shape.y2 = y + h / 2;\n    },\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\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\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\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\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\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\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\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};\n\nvar symbolBuildProxies = {};\nzrUtil.each(symbolCtors, function (Ctor, name) {\n    symbolBuildProxies[name] = new Ctor();\n});\n\nvar SymbolClz = graphic.extendShape({\n\n    type: 'symbol',\n\n    shape: {\n        symbolType: '',\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n    },\n\n    calculateTextPosition: function (out, style, rect) {\n        var res = calculateTextPosition(out, style, rect);\n        var shape = this.shape;\n        if (shape && shape.symbolType === 'pin' && style.textPosition === 'inside') {\n            res.y = rect.y + rect.height * 0.4;\n        }\n        return res;\n    },\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](\n                shape.x, shape.y, shape.width, shape.height, proxySymbol.shape\n            );\n            proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle);\n        }\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        var symbolShape = this.shape;\n        if (symbolShape && symbolShape.symbolType === 'line') {\n            symbolStyle.stroke = color;\n        }\n        else if (this.__isEmptyBrush) {\n            symbolStyle.stroke = color;\n            symbolStyle.fill = innerColor || '#fff';\n        }\n        else {\n            // FIXME 判断图形默认是填充还是描边，使用 onlyStroke ?\n            symbolStyle.fill && (symbolStyle.fill = color);\n            symbolStyle.stroke && (symbolStyle.stroke = color);\n        }\n        this.dirty(false);\n    }\n}\n\n/**\n * Create a symbol element with given symbol configuration: shape, x, y, width, height, color\n * @param {string} symbolType\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @param {string} color\n * @param {boolean} [keepAspect=false] whether to keep the ratio of w/h,\n *                            for path and image only.\n */\nexport function createSymbol(symbolType, x, y, w, h, color, keepAspect) {\n    // TODO Support image object, DynamicImage.\n\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\n    if (symbolType.indexOf('image://') === 0) {\n        symbolPath = graphic.makeImage(\n            symbolType.slice(8),\n            new BoundingRect(x, y, w, h),\n            keepAspect ? 'center' : 'cover'\n        );\n    }\n    else if (symbolType.indexOf('path://') === 0) {\n        symbolPath = graphic.makePath(\n            symbolType.slice(7),\n            {},\n            new BoundingRect(x, y, w, h),\n            keepAspect ? 'center' : 'cover'\n        );\n    }\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\n    symbolPath.__isEmptyBrush = isEmpty;\n\n    symbolPath.setColor = symbolPathSetColor;\n\n    symbolPath.setColor(color);\n\n    return symbolPath;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport createListFromArray from './chart/helper/createListFromArray';\n// import createGraphFromNodeEdge from './chart/helper/createGraphFromNodeEdge';\nimport * as axisHelper from './coord/axisHelper';\nimport axisModelCommonMixin from './coord/axisModelCommonMixin';\nimport Model from './model/Model';\nimport {getLayoutRect} from './util/layout';\nimport {\n    enableDataStack,\n    isDimensionStacked,\n    getStackedDimension\n} from './data/helper/dataStackHelper';\n\n/**\n * Create a muti dimension List structure from seriesModel.\n * @param  {module:echarts/model/Model} seriesModel\n * @return {module:echarts/data/List} list\n */\nexport function createList(seriesModel) {\n    return createListFromArray(seriesModel.getSource(), seriesModel);\n}\n\n// export function createGraph(seriesModel) {\n//     var nodes = seriesModel.get('data');\n//     var links = seriesModel.get('links');\n//     return createGraphFromNodeEdge(nodes, links, seriesModel);\n// }\n\nexport {getLayoutRect};\n\n/**\n * // TODO: @deprecated\n */\nexport {default as completeDimensions} from './data/helper/completeDimensions';\n\nexport {default as createDimensions} from './data/helper/createDimensions';\n\nexport var dataStack = {\n    isDimensionStacked: isDimensionStacked,\n    enableDataStack: enableDataStack,\n    getStackedDimension: getStackedDimension\n};\n\n/**\n * Create a symbol element with given symbol configuration: shape, x, y, width, height, color\n * @param {string} symbolDesc\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @param {string} color\n */\nexport {createSymbol} from './util/symbol';\n\n/**\n * Create scale\n * @param {Array.<number>} dataExtent\n * @param {Object|module:echarts/Model} option\n */\nexport function createScale(dataExtent, option) {\n    var axisModel = option;\n    if (!Model.isInstance(option)) {\n        axisModel = new Model(option);\n        zrUtil.mixin(axisModel, axisModelCommonMixin);\n    }\n\n    var scale = axisHelper.createScaleByModel(axisModel);\n    scale.setExtent(dataExtent[0], dataExtent[1]);\n\n    axisHelper.niceScaleExtent(scale, axisModel);\n    return scale;\n}\n\n/**\n * Mixin common methods to axis model,\n *\n * Inlcude methods\n * `getFormattedLabels() => Array.<string>`\n * `getCategories() => Array.<string>`\n * `getMin(origin: boolean) => number`\n * `getMax(origin: boolean) => number`\n * `getNeedCrossZero() => boolean`\n * `setRange(start: number, end: number)`\n * `resetRange()`\n */\nexport function mixinAxisModelCommonMethods(Model) {\n    zrUtil.mixin(Model, axisModelCommonMixin);\n}","import windingLine from './windingLine';\n\nvar EPSILON = 1e-8;\n\nfunction isAroundEqual(a, b) {\n    return Math.abs(a - b) < EPSILON;\n}\n\nexport function contain(points, x, y) {\n    var w = 0;\n    var p = points[0];\n\n    if (!p) {\n        return false;\n    }\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\n    // Close polygon\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\n    return w !== 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 * @module echarts/coord/geo/Region\n */\n\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport * as bbox from 'zrender/src/core/bbox';\nimport * as vec2 from 'zrender/src/core/vector';\nimport * as polygonContain from 'zrender/src/contain/polygon';\n\n/**\n * @param {string|Region} name\n * @param {Array} geometries\n * @param {Array.<number>} cp\n */\nfunction Region(name, geometries, cp) {\n\n    /**\n     * @type {string}\n     * @readOnly\n     */\n    this.name = name;\n\n    /**\n     * @type {Array.<Array>}\n     * @readOnly\n     */\n    this.geometries = geometries;\n\n    if (!cp) {\n        var rect = this.getBoundingRect();\n        cp = [\n            rect.x + rect.width / 2,\n            rect.y + rect.height / 2\n        ];\n    }\n    else {\n        cp = [cp[0], cp[1]];\n    }\n    /**\n     * @type {Array.<number>}\n     */\n    this.center = cp;\n}\n\nRegion.prototype = {\n\n    constructor: Region,\n\n    properties: null,\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getBoundingRect: function () {\n        var rect = this._rect;\n        if (rect) {\n            return rect;\n        }\n\n        var MAX_NUMBER = Number.MAX_VALUE;\n        var min = [MAX_NUMBER, MAX_NUMBER];\n        var max = [-MAX_NUMBER, -MAX_NUMBER];\n        var min2 = [];\n        var max2 = [];\n        var geometries = this.geometries;\n        for (var i = 0; i < geometries.length; i++) {\n            // Only support polygon\n            if (geometries[i].type !== 'polygon') {\n                continue;\n            }\n            // Doesn't consider hole\n            var exterior = geometries[i].exterior;\n            bbox.fromPoints(exterior, min2, max2);\n            vec2.min(min, min, min2);\n            vec2.max(max, max, max2);\n        }\n        // No data\n        if (i === 0) {\n            min[0] = min[1] = max[0] = max[1] = 0;\n        }\n\n        return (this._rect = new BoundingRect(\n            min[0], min[1], max[0] - min[0], max[1] - min[1]\n        ));\n    },\n\n    /**\n     * @param {<Array.<number>} coord\n     * @return {boolean}\n     */\n    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            // Only support polygon.\n            if (geometries[i].type !== 'polygon') {\n                continue;\n            }\n            var exterior = geometries[i].exterior;\n            var interiors = geometries[i].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])) {\n                        continue loopGeo;\n                    }\n                }\n                return true;\n            }\n        }\n        return false;\n    },\n\n    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        }\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            // Only support polygon.\n            if (geometries[i].type !== 'polygon') {\n                continue;\n            }\n            var exterior = geometries[i].exterior;\n            var interiors = geometries[i].interiors;\n            for (var p = 0; p < exterior.length; p++) {\n                vec2.applyTransform(exterior[p], exterior[p], transform);\n            }\n            for (var h = 0; h < (interiors ? interiors.length : 0); h++) {\n                for (var p = 0; p < interiors[h].length; p++) {\n                    vec2.applyTransform(interiors[h][p], interiors[h][p], transform);\n                }\n            }\n        }\n        rect = this._rect;\n        rect.copy(target);\n        // Update center\n        this.center = [\n            rect.x + rect.width / 2,\n            rect.y + rect.height / 2\n        ];\n    },\n\n    cloneShallow: function (name) {\n        name == null && (name = this.name);\n        var newRegion = new Region(name, this.geometries, this.center);\n        newRegion._rect = this._rect;\n        newRegion.transformTo = null; // Simply avoid to be called.\n        return newRegion;\n    }\n};\n\nexport default Region;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Parse and decode geo json\n * @module echarts/coord/geo/parseGeoJson\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Region from './Region';\n\nfunction decode(json) {\n    if (!json.UTF8Encoding) {\n        return json;\n    }\n    var encodeScale = json.UTF8Scale;\n    if (encodeScale == null) {\n        encodeScale = 1024;\n    }\n\n    var features = json.features;\n\n    for (var f = 0; f < features.length; f++) {\n        var feature = features[f];\n        var geometry = feature.geometry;\n        var coordinates = geometry.coordinates;\n        var encodeOffsets = geometry.encodeOffsets;\n\n        for (var c = 0; c < coordinates.length; c++) {\n            var coordinate = coordinates[c];\n\n            if (geometry.type === 'Polygon') {\n                coordinates[c] = decodePolygon(\n                    coordinate,\n                    encodeOffsets[c],\n                    encodeScale\n                );\n            }\n            else if (geometry.type === 'MultiPolygon') {\n                for (var c2 = 0; c2 < coordinate.length; c2++) {\n                    var polygon = coordinate[c2];\n                    coordinate[c2] = decodePolygon(\n                        polygon,\n                        encodeOffsets[c][c2],\n                        encodeScale\n                    );\n                }\n            }\n        }\n    }\n    // Has been decoded\n    json.UTF8Encoding = false;\n    return json;\n}\n\nfunction decodePolygon(coordinate, encodeOffsets, encodeScale) {\n    var result = [];\n    var prevX = encodeOffsets[0];\n    var prevY = encodeOffsets[1];\n\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\n        prevX = x;\n        prevY = y;\n        // Dequantize\n        result.push([x / encodeScale, y / encodeScale]);\n    }\n\n    return result;\n}\n\n/**\n * @alias module:echarts/coord/geo/parseGeoJson\n * @param {Object} geoJson\n * @return {module:zrender/container/Group}\n */\nexport default function (geoJson) {\n\n    decode(geoJson);\n\n    return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) {\n        // Output of mapshaper may have geometry null\n        return featureObj.geometry\n            && featureObj.properties\n            && featureObj.geometry.coordinates.length > 0;\n    }), function (featureObj) {\n        var properties = featureObj.properties;\n        var geo = featureObj.geometry;\n\n        var coordinates = geo.coordinates;\n\n        var geometries = [];\n        if (geo.type === 'Polygon') {\n            geometries.push({\n                type: 'polygon',\n                // According to the GeoJSON specification.\n                // First must be exterior, and the rest are all interior(holes).\n                exterior: coordinates[0],\n                interiors: coordinates.slice(1)\n            });\n        }\n        if (geo.type === 'MultiPolygon') {\n            zrUtil.each(coordinates, function (item) {\n                if (item[0]) {\n                    geometries.push({\n                        type: 'polygon',\n                        exterior: item[0],\n                        interiors: item.slice(1)\n                    });\n                }\n            });\n        }\n\n        var region = new Region(\n            properties.name,\n            geometries,\n            properties.cp\n        );\n        region.properties = properties;\n        return region;\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as textContain from 'zrender/src/contain/text';\nimport {makeInner} from '../util/model';\nimport {\n    makeLabelFormatter,\n    getOptionCategoryInterval,\n    shouldShowAllLabels\n} from './axisHelper';\n\nvar inner = makeInner();\n\n/**\n * @param {module:echats/coord/Axis} axis\n * @return {Object} {\n *     labels: [{\n *         formattedLabel: string,\n *         rawLabel: string,\n *         tickValue: number\n *     }, ...],\n *     labelCategoryInterval: number\n * }\n */\nexport function createAxisLabels(axis) {\n    // Only ordinal scale support tick interval\n    return axis.type === 'category'\n        ? makeCategoryLabels(axis)\n        : makeRealNumberLabels(axis);\n}\n\n/**\n * @param {module:echats/coord/Axis} axis\n * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea.\n * @return {Object} {\n *     ticks: Array.<number>\n *     tickCategoryInterval: number\n * }\n */\nexport function createAxisTicks(axis, tickModel) {\n    // Only ordinal scale support tick interval\n    return axis.type === 'category'\n        ? makeCategoryTicks(axis, tickModel)\n        : {ticks: axis.scale.getTicks()};\n}\n\nfunction makeCategoryLabels(axis) {\n    var labelModel = axis.getLabelModel();\n    var result = makeCategoryLabelsActually(axis, labelModel);\n\n    return (!labelModel.get('show') || axis.scale.isBlank())\n        ? {labels: [], labelCategoryInterval: result.labelCategoryInterval}\n        : result;\n}\n\nfunction makeCategoryLabelsActually(axis, labelModel) {\n    var labelsCache = getListCache(axis, 'labels');\n    var optionLabelInterval = getOptionCategoryInterval(labelModel);\n    var result = listCacheGet(labelsCache, optionLabelInterval);\n\n    if (result) {\n        return result;\n    }\n\n    var labels;\n    var numericLabelInterval;\n\n    if (zrUtil.isFunction(optionLabelInterval)) {\n        labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval);\n    }\n    else {\n        numericLabelInterval = optionLabelInterval === 'auto'\n            ? makeAutoCategoryInterval(axis) : optionLabelInterval;\n        labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval);\n    }\n\n    // Cache to avoid calling interval function repeatly.\n    return listCacheSet(labelsCache, optionLabelInterval, {\n        labels: labels, labelCategoryInterval: numericLabelInterval\n    });\n}\n\nfunction makeCategoryTicks(axis, tickModel) {\n    var ticksCache = getListCache(axis, 'ticks');\n    var optionTickInterval = getOptionCategoryInterval(tickModel);\n    var result = listCacheGet(ticksCache, optionTickInterval);\n\n    if (result) {\n        return result;\n    }\n\n    var ticks;\n    var tickCategoryInterval;\n\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\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());\n        tickCategoryInterval = labelsResult.labelCategoryInterval;\n        ticks = zrUtil.map(labelsResult.labels, function (labelItem) {\n            return labelItem.tickValue;\n        });\n    }\n    else {\n        tickCategoryInterval = optionTickInterval;\n        ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true);\n    }\n\n    // Cache to avoid calling interval function repeatly.\n    return listCacheSet(ticksCache, optionTickInterval, {\n        ticks: ticks, tickCategoryInterval: tickCategoryInterval\n    });\n}\n\nfunction makeRealNumberLabels(axis) {\n    var ticks = axis.scale.getTicks();\n    var labelFormatter = makeLabelFormatter(axis);\n    return {\n        labels: zrUtil.map(ticks, function (tickValue, idx) {\n            return {\n                formattedLabel: labelFormatter(tickValue, idx),\n                rawLabel: axis.scale.getLabel(tickValue),\n                tickValue: tickValue\n            };\n        })\n    };\n}\n\n// Large category data calculation is performence sensitive, and ticks and label\n// probably be fetched by multiple times. So we cache the result.\n// axis is created each time during a ec process, so we do not need to clear cache.\nfunction getListCache(axis, prop) {\n    // Because key can be funciton, and cache size always be small, we use array cache.\n    return inner(axis)[prop] || (inner(axis)[prop] = []);\n}\n\nfunction listCacheGet(cache, key) {\n    for (var i = 0; i < cache.length; i++) {\n        if (cache[i].key === key) {\n            return cache[i].value;\n        }\n    }\n}\n\nfunction listCacheSet(cache, key, value) {\n    cache.push({key: key, value: value});\n    return value;\n}\n\nfunction makeAutoCategoryInterval(axis) {\n    var result = inner(axis).autoInterval;\n    return result != null\n        ? result\n        : (inner(axis).autoInterval = axis.calculateCategoryInterval());\n}\n\n/**\n * Calculate interval for category axis ticks and labels.\n * To get precise result, at least one of `getRotate` and `isHorizontal`\n * should be implemented in axis.\n */\nexport function calculateCategoryInterval(axis) {\n    var params = fetchAutoCategoryIntervalCalculationParams(axis);\n    var labelFormatter = makeLabelFormatter(axis);\n    var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI;\n\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\n    if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n        return 0;\n    }\n\n    var step = 1;\n    // Simple optimization. Empirical value: tick count should less than 40.\n    if (tickCount > 40) {\n        step = Math.max(1, Math.floor(tickCount / 40));\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\n    var maxW = 0;\n    var maxH = 0;\n\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\n        // Not precise, do not consider align and vertical align\n        // and each distance from axis line yet.\n        var rect = textContain.getBoundingRect(\n            labelFormatter(tickValue), params.font, 'center', 'top'\n        );\n        // Magic number\n        width = rect.width * 1.3;\n        height = rect.height * 1.3;\n\n        // Min size, void long loop.\n        maxW = Math.max(maxW, width, 7);\n        maxH = Math.max(maxH, height, 7);\n    }\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\n    var cache = inner(axis.model);\n    var lastAutoInterval = cache.lastAutoInterval;\n    var lastTickCount = cache.lastTickCount;\n\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\n        && lastTickCount != null\n        && Math.abs(lastAutoInterval - interval) <= 1\n        && 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    ) {\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\n    return interval;\n}\n\nfunction fetchAutoCategoryIntervalCalculationParams(axis) {\n    var labelModel = axis.getLabelModel();\n    return {\n        axisRotate: axis.getRotate\n            ? axis.getRotate()\n            : (axis.isHorizontal && !axis.isHorizontal())\n            ? 90\n            : 0,\n        labelRotate: labelModel.get('rotate') || 0,\n        font: labelModel.getFont()\n    };\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\n    // TODO: axisType: ordinalTime, pick the tick from each month/day/year/...\n\n    var step = Math.max((categoryInterval || 0) + 1, 1);\n    var startTick = ordinalExtent[0];\n    var tickCount = ordinalScale.count();\n\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\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\n    if (includeMinLabel && startTick !== ordinalExtent[0]) {\n        addItem(ordinalExtent[0]);\n    }\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\n    if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) {\n        addItem(ordinalExtent[1]);\n    }\n\n    function addItem(tVal) {\n        result.push(onlyTick\n            ? tVal\n            : {\n                formattedLabel: labelFormatter(tVal),\n                rawLabel: ordinalScale.getLabel(tVal),\n                tickValue: tVal\n            }\n        );\n    }\n\n    return result;\n}\n\n// When interval is function, the result `false` means ignore the tick.\n// It is time consuming for large category data.\nfunction makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) {\n    var ordinalScale = axis.scale;\n    var labelFormatter = makeLabelFormatter(axis);\n    var result = [];\n\n    zrUtil.each(ordinalScale.getTicks(), function (tickValue) {\n        var rawLabel = ordinalScale.getLabel(tickValue);\n        if (categoryInterval(tickValue, rawLabel)) {\n            result.push(onlyTick\n                ? tickValue\n                : {\n                    formattedLabel: labelFormatter(tickValue),\n                    rawLabel: rawLabel,\n                    tickValue: tickValue\n                }\n            );\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\nimport {each, map} from 'zrender/src/core/util';\nimport {linearMap, getPixelPrecision} from '../util/number';\nimport {\n    createAxisTicks,\n    createAxisLabels,\n    calculateCategoryInterval\n} from './axisTickLabelBuilder';\n\nvar NORMALIZED_EXTENT = [0, 1];\n\n/**\n * Base class of Axis.\n * @constructor\n */\nvar Axis = function (dim, scale, extent) {\n\n    /**\n     * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius'.\n     * @type {string}\n     */\n    this.dim = dim;\n\n    /**\n     * Axis scale\n     * @type {module:echarts/coord/scale/*}\n     */\n    this.scale = scale;\n\n    /**\n     * @type {Array.<number>}\n     * @private\n     */\n    this._extent = extent || [0, 0];\n\n    /**\n     * @type {boolean}\n     */\n    this.inverse = false;\n\n    /**\n     * Usually true when axis has a ordinal scale\n     * @type {boolean}\n     */\n    this.onBand = false;\n};\n\nAxis.prototype = {\n\n    constructor: Axis,\n\n    /**\n     * If axis extent contain given coord\n     * @param {number} coord\n     * @return {boolean}\n     */\n    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    /**\n     * If axis extent contain given data\n     * @param {number} data\n     * @return {boolean}\n     */\n    containData: function (data) {\n        return this.contain(this.dataToCoord(data));\n    },\n\n    /**\n     * Get coord extent.\n     * @return {Array.<number>}\n     */\n    getExtent: function () {\n        return this._extent.slice();\n    },\n\n    /**\n     * Get precision used for formatting\n     * @param {Array.<number>} [dataExtent]\n     * @return {number}\n     */\n    getPixelPrecision: function (dataExtent) {\n        return getPixelPrecision(\n            dataExtent || this.scale.getExtent(),\n            this._extent\n        );\n    },\n\n    /**\n     * Set coord extent\n     * @param {number} start\n     * @param {number} end\n     */\n    setExtent: function (start, end) {\n        var extent = this._extent;\n        extent[0] = start;\n        extent[1] = end;\n    },\n\n    /**\n     * Convert data to coord. Data is the rank if it has an ordinal scale\n     * @param {number} data\n     * @param  {boolean} clamp\n     * @return {number}\n     */\n    dataToCoord: function (data, clamp) {\n        var extent = this._extent;\n        var scale = this.scale;\n        data = scale.normalize(data);\n\n        if (this.onBand && scale.type === 'ordinal') {\n            extent = extent.slice();\n            fixExtentWithBands(extent, scale.count());\n        }\n\n        return linearMap(data, NORMALIZED_EXTENT, extent, clamp);\n    },\n\n    /**\n     * Convert coord to data. Data is the rank if it has an ordinal scale\n     * @param {number} coord\n     * @param  {boolean} clamp\n     * @return {number}\n     */\n    coordToData: function (coord, clamp) {\n        var extent = this._extent;\n        var scale = this.scale;\n\n        if (this.onBand && scale.type === 'ordinal') {\n            extent = extent.slice();\n            fixExtentWithBands(extent, scale.count());\n        }\n\n        var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp);\n\n        return this.scale.scale(t);\n    },\n\n    /**\n     * Convert pixel point to data in axis\n     * @param {Array.<number>} point\n     * @param  {boolean} clamp\n     * @return {number} data\n     */\n    pointToData: function (point, clamp) {\n        // Should be implemented in derived class if necessary.\n    },\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 {Object} [opt]\n     * @param {number} [opt.tickModel=axis.model.getModel('axisTick')]\n     * @param {boolean} [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     * @return {Array.<Object>} [{\n     *     coord: ...,\n     *     tickValue: ...\n     * }, ...]\n     */\n    getTicksCoords: function (opt) {\n        opt = opt || {};\n\n        var tickModel = opt.tickModel || this.getTickModel();\n\n        var result = createAxisTicks(this, tickModel);\n        var ticks = result.ticks;\n\n        var ticksCoords = map(ticks, function (tickValue) {\n            return {\n                coord: this.dataToCoord(tickValue),\n                tickValue: tickValue\n            };\n        }, this);\n\n        var alignWithLabel = tickModel.get('alignWithLabel');\n        fixOnBandTicksCoords(\n            this, ticksCoords, result.tickCategoryInterval, alignWithLabel, opt.clamp\n        );\n\n        return ticksCoords;\n    },\n\n    /**\n     * @return {Array.<Object>} [{\n     *     formattedLabel: string,\n     *     rawLabel: axis.scale.getLabel(tickValue)\n     *     tickValue: number\n     * }, ...]\n     */\n    getViewLabels: function () {\n        return createAxisLabels(this).labels;\n    },\n\n    /**\n     * @return {module:echarts/coord/model/Model}\n     */\n    getLabelModel: function () {\n        return this.model.getModel('axisLabel');\n    },\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 overrided to:\n     * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`\n     * @return {module:echarts/coord/model/Model}\n     */\n    getTickModel: function () {\n        return this.model.getModel('axisTick');\n    },\n\n    /**\n     * Get width of band\n     * @return {number}\n     */\n    getBandWidth: function () {\n        var axisExtent = this._extent;\n        var dataExtent = this.scale.getExtent();\n\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\n        var size = Math.abs(axisExtent[1] - axisExtent[0]);\n\n        return Math.abs(size) / len;\n    },\n\n    /**\n     * @abstract\n     * @return {boolean} Is horizontal\n     */\n    isHorizontal: null,\n\n    /**\n     * @abstract\n     * @return {number} Get axis rotate, by degree.\n     */\n    getRotate: null,\n\n    /**\n     * Only be called in category axis.\n     * Can be overrided, consider other axes like in 3D.\n     * @return {number} Auto interval for cateogry axis tick and label\n     */\n    calculateCategoryInterval: function () {\n        return calculateCategoryInterval(this);\n    }\n\n};\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\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, tickCategoryInterval, alignWithLabel, clamp) {\n    var ticksLen = ticksCoords.length;\n\n    if (!axis.onBand || alignWithLabel || !ticksLen) {\n        return;\n    }\n\n    var axisExtent = axis.getExtent();\n    var last;\n    if (ticksLen === 1) {\n        ticksCoords[0].coord = axisExtent[0];\n        last = ticksCoords[1] = {coord: axisExtent[0]};\n    }\n    else {\n        var shift = (ticksCoords[1].coord - ticksCoords[0].coord);\n        each(ticksCoords, function (ticksItem) {\n            ticksItem.coord -= shift / 2;\n            var tickCategoryInterval = tickCategoryInterval || 0;\n            // Avoid split a single data item when odd interval.\n            if (tickCategoryInterval % 2 > 0) {\n                ticksItem.coord -= shift / ((tickCategoryInterval + 1) * 2);\n            }\n        });\n        last = {coord: ticksCoords[ticksLen - 1].coord + shift};\n        ticksCoords.push(last);\n    }\n\n    var inverse = axisExtent[0] > axisExtent[1];\n\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({coord: axisExtent[0]});\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({coord: axisExtent[1]});\n    }\n\n    function littleThan(a, b) {\n        return inverse ? a > b : a < b;\n    }\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 * Do not mount those modules on 'src/echarts' for better tree shaking.\n */\n\nimport * as zrender from 'zrender/src/zrender';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as vector from 'zrender/src/core/vector';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as colorTool from 'zrender/src/tool/color';\nimport * as graphicUtil from './util/graphic';\nimport * as numberUtil from './util/number';\nimport * as formatUtil from './util/format';\nimport {throttle} from './util/throttle';\nimport * as ecHelper from './helper';\nimport parseGeoJSON from './coord/geo/parseGeoJson';\n\n\nexport {zrender};\nexport {default as List} from './data/List';\nexport {default as Model} from './model/Model';\nexport {default as Axis} from './coord/Axis';\nexport {numberUtil as number};\nexport {formatUtil as format};\nexport {throttle};\nexport {ecHelper as helper};\nexport {matrix};\nexport {vector};\nexport {colorTool as color};\nexport {default as env} from 'zrender/src/core/env';\n\nexport {parseGeoJSON};\nexport var parseGeoJson = parseGeoJSON;\n\nvar ecUtil = {};\nzrUtil.each(\n    [\n        'map', 'each', 'filter', 'indexOf', 'inherits', 'reduce', 'filter',\n        'bind', 'curry', 'isArray', 'isString', 'isObject', 'isFunction',\n        'extend', 'defaults', 'clone', 'merge'\n    ],\n    function (name) {\n        ecUtil[name] = zrUtil[name];\n    }\n);\nexport {ecUtil as util};\n\nvar graphic = {};\nzrUtil.each(\n    [\n        'extendShape', 'extendPath', 'makePath', 'makeImage',\n        'mergePath', 'resizePath', 'createIcon',\n        'setHoverStyle', 'setLabelStyle', 'setTextStyle', 'setText',\n        'getFont', 'updateProps', 'initProps', 'getTransform',\n        'clipPointsByRect', 'clipRectByRect',\n        'Group',\n        'Image',\n        'Text',\n        'Circle',\n        'Sector',\n        'Ring',\n        'Polygon',\n        'Polyline',\n        'Rect',\n        'Line',\n        'BezierCurve',\n        'Arc',\n        'IncrementalDisplayable',\n        'CompoundPath',\n        'LinearGradient',\n        'RadialGradient',\n        'BoundingRect'\n    ],\n    function (name) {\n        graphic[name] = graphicUtil[name];\n    }\n);\nexport {graphic};\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport createListFromArray from '../helper/createListFromArray';\nimport SeriesModel from '../../model/Series';\n\nexport default SeriesModel.extend({\n\n    type: 'series.line',\n\n    dependencies: ['grid', 'polar'],\n\n    getInitialData: function (option, ecModel) {\n        if (__DEV__) {\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 createListFromArray(this.getSource(), this);\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n        // stack: null\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // polarIndex: 0,\n\n        // If clip the overflow value\n        clipOverflow: true,\n        // cursor: null,\n\n        label: {\n            position: 'top'\n        },\n        // itemStyle: {\n        // },\n\n        lineStyle: {\n            width: 2,\n            type: 'solid'\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\n        // Disabled if step is true\n        smooth: false,\n        smoothMonotone: null,\n        symbol: 'emptyCircle',\n        symbolSize: 4,\n        symbolRotate: null,\n\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\n        // Whether to connect break point.\n        connectNulls: false,\n\n        // Sampling for large data. Can be: 'average', 'max', 'min', 'sum'.\n        sampling: 'none',\n\n        animationEasing: 'linear',\n\n        // Disable progressive\n        progressive: 0,\n        hoverLayerThreshold: Infinity\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {retrieveRawValue} from '../../data/helper/dataProvider';\n\n/**\n * @param {module:echarts/data/List} data\n * @param {number} dataIndex\n * @return {string} label string. Not null/undefined\n */\nexport function getDefaultLabel(data, dataIndex) {\n    var labelDims = data.mapDimension('defaultedLabel', true);\n    var len = labelDims.length;\n\n    // Simple optimization (in lots of cases, label dims length is 1)\n    if (len === 1) {\n        return retrieveRawValue(data, dataIndex, labelDims[0]);\n    }\n    else if (len) {\n        var vals = [];\n        for (var i = 0; i < labelDims.length; i++) {\n            var val = retrieveRawValue(data, dataIndex, labelDims[i]);\n            vals.push(val);\n        }\n        return vals.join(' ');\n    }\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/chart/helper/Symbol\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {createSymbol} from '../../util/symbol';\nimport * as graphic from '../../util/graphic';\nimport {parsePercent} from '../../util/number';\nimport {getDefaultLabel} from './labelHelper';\n\n\n/**\n * @constructor\n * @alias {module:echarts/chart/helper/Symbol}\n * @param {module:echarts/data/List} data\n * @param {number} idx\n * @extends {module:zrender/graphic/Group}\n */\nfunction SymbolClz(data, idx, seriesScope) {\n    graphic.Group.call(this);\n    this.updateData(data, idx, seriesScope);\n}\n\nvar symbolProto = SymbolClz.prototype;\n\n/**\n * @public\n * @static\n * @param {module:echarts/data/List} data\n * @param {number} dataIndex\n * @return {Array.<number>} [width, height]\n */\nvar getSymbolSize = SymbolClz.getSymbolSize = function (data, idx) {\n    var symbolSize = data.getItemVisual(idx, 'symbolSize');\n    return symbolSize instanceof Array\n        ? symbolSize.slice()\n        : [+symbolSize, +symbolSize];\n};\n\nfunction getScale(symbolSize) {\n    return [symbolSize[0] / 2, symbolSize[1] / 2];\n}\n\nfunction driftSymbol(dx, dy) {\n    this.parent.drift(dx, dy);\n}\n\nsymbolProto._createSymbol = function (\n    symbolType,\n    data,\n    idx,\n    symbolSize,\n    keepAspect\n) {\n    // Remove paths created before\n    this.removeAll();\n\n    var color = data.getItemVisual(idx, 'color');\n\n    // var 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(\n        symbolType, -1, -1, 2, 2, color, keepAspect\n    );\n\n    symbolPath.attr({\n        z2: 100,\n        culling: true,\n        scale: getScale(symbolSize)\n    });\n    // Rewrite drift method\n    symbolPath.drift = driftSymbol;\n\n    this._symbolType = symbolType;\n\n    this.add(symbolPath);\n};\n\n/**\n * Stop animation\n * @param {boolean} toLastFrame\n */\nsymbolProto.stopSymbolAnimation = function (toLastFrame) {\n    this.childAt(0).stopAnimation(toLastFrame);\n};\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 */\nsymbolProto.getSymbolPath = function () {\n    return this.childAt(0);\n};\n\n/**\n * Get scale(aka, current symbol size).\n * Including the change caused by animation\n */\nsymbolProto.getScale = function () {\n    return this.childAt(0).scale;\n};\n\n/**\n * Highlight symbol\n */\nsymbolProto.highlight = function () {\n    this.childAt(0).trigger('emphasis');\n};\n\n/**\n * Downplay symbol\n */\nsymbolProto.downplay = function () {\n    this.childAt(0).trigger('normal');\n};\n\n/**\n * @param {number} zlevel\n * @param {number} z\n */\nsymbolProto.setZ = function (zlevel, z) {\n    var symbolPath = this.childAt(0);\n    symbolPath.zlevel = zlevel;\n    symbolPath.z = z;\n};\n\nsymbolProto.setDraggable = function (draggable) {\n    var symbolPath = this.childAt(0);\n    symbolPath.draggable = draggable;\n    symbolPath.cursor = draggable ? 'move' : symbolPath.cursor;\n};\n\n/**\n * Update symbol properties\n * @param {module:echarts/data/List} data\n * @param {number} idx\n * @param {Object} [seriesScope]\n * @param {Object} [seriesScope.itemStyle]\n * @param {Object} [seriesScope.hoverItemStyle]\n * @param {Object} [seriesScope.symbolRotate]\n * @param {Object} [seriesScope.symbolOffset]\n * @param {module:echarts/model/Model} [seriesScope.labelModel]\n * @param {module:echarts/model/Model} [seriesScope.hoverLabelModel]\n * @param {boolean} [seriesScope.hoverAnimation]\n * @param {Object} [seriesScope.cursorStyle]\n * @param {module:echarts/model/Model} [seriesScope.itemModel]\n * @param {string} [seriesScope.symbolInnerColor]\n * @param {Object} [seriesScope.fadeIn=false]\n */\nsymbolProto.updateData = function (data, idx, seriesScope) {\n    this.silent = false;\n\n    var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n    var seriesModel = data.hostModel;\n    var symbolSize = getSymbolSize(data, idx);\n    var isInit = symbolType !== this._symbolType;\n\n    if (isInit) {\n        var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');\n        this._createSymbol(symbolType, data, idx, symbolSize, keepAspect);\n    }\n    else {\n        var symbolPath = this.childAt(0);\n        symbolPath.silent = false;\n        graphic.updateProps(symbolPath, {\n            scale: getScale(symbolSize)\n        }, seriesModel, idx);\n    }\n\n    this._updateCommon(data, idx, symbolSize, seriesScope);\n\n    if (isInit) {\n        var symbolPath = this.childAt(0);\n        var fadeIn = seriesScope && seriesScope.fadeIn;\n\n        var target = {scale: symbolPath.scale.slice()};\n        fadeIn && (target.style = {opacity: symbolPath.style.opacity});\n\n        symbolPath.scale = [0, 0];\n        fadeIn && (symbolPath.style.opacity = 0);\n\n        graphic.initProps(symbolPath, target, seriesModel, idx);\n    }\n\n    this._seriesModel = seriesModel;\n};\n\n// Update common properties\nvar normalStyleAccessPath = ['itemStyle'];\nvar emphasisStyleAccessPath = ['emphasis', 'itemStyle'];\nvar normalLabelAccessPath = ['label'];\nvar emphasisLabelAccessPath = ['emphasis', 'label'];\n\n/**\n * @param {module:echarts/data/List} data\n * @param {number} idx\n * @param {Array.<number>} symbolSize\n * @param {Object} [seriesScope]\n */\nsymbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) {\n    var symbolPath = this.childAt(0);\n    var seriesModel = data.hostModel;\n    var color = data.getItemVisual(idx, 'color');\n\n    // Reset style\n    if (symbolPath.type !== 'image') {\n        symbolPath.useStyle({\n            strokeNoScale: true\n        });\n    }\n\n    var itemStyle = seriesScope && seriesScope.itemStyle;\n    var hoverItemStyle = seriesScope && seriesScope.hoverItemStyle;\n    var symbolRotate = seriesScope && seriesScope.symbolRotate;\n    var symbolOffset = seriesScope && seriesScope.symbolOffset;\n    var labelModel = seriesScope && seriesScope.labelModel;\n    var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel;\n    var hoverAnimation = seriesScope && seriesScope.hoverAnimation;\n    var cursorStyle = seriesScope && seriesScope.cursorStyle;\n\n    if (!seriesScope || data.hasItemOption) {\n        var itemModel = (seriesScope && seriesScope.itemModel)\n            ? seriesScope.itemModel : data.getItemModel(idx);\n\n        // Color must be excluded.\n        // Because symbol provide setColor individually to set fill and stroke\n        itemStyle = itemModel.getModel(normalStyleAccessPath).getItemStyle(['color']);\n        hoverItemStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();\n\n        symbolRotate = itemModel.getShallow('symbolRotate');\n        symbolOffset = itemModel.getShallow('symbolOffset');\n\n        labelModel = itemModel.getModel(normalLabelAccessPath);\n        hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath);\n        hoverAnimation = itemModel.getShallow('hoverAnimation');\n        cursorStyle = itemModel.getShallow('cursor');\n    }\n    else {\n        hoverItemStyle = zrUtil.extend({}, hoverItemStyle);\n    }\n\n    var elStyle = symbolPath.style;\n\n    symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);\n\n    if (symbolOffset) {\n        symbolPath.attr('position', [\n            parsePercent(symbolOffset[0], symbolSize[0]),\n            parsePercent(symbolOffset[1], symbolSize[1])\n        ]);\n    }\n\n    cursorStyle && symbolPath.attr('cursor', cursorStyle);\n\n    // PENDING setColor before setStyle!!!\n    symbolPath.setColor(color, seriesScope && seriesScope.symbolInnerColor);\n\n    symbolPath.setStyle(itemStyle);\n\n    var opacity = data.getItemVisual(idx, 'opacity');\n    if (opacity != null) {\n        elStyle.opacity = opacity;\n    }\n\n    var liftZ = data.getItemVisual(idx, 'liftZ');\n    var z2Origin = symbolPath.__z2Origin;\n    if (liftZ != null) {\n        if (z2Origin == null) {\n            symbolPath.__z2Origin = symbolPath.z2;\n            symbolPath.z2 += liftZ;\n        }\n    }\n    else if (z2Origin != null) {\n        symbolPath.z2 = z2Origin;\n        symbolPath.__z2Origin = null;\n    }\n\n    var useNameLabel = seriesScope && seriesScope.useNameLabel;\n\n    graphic.setLabelStyle(\n        elStyle, hoverItemStyle, labelModel, hoverLabelModel,\n        {\n            labelFetcher: seriesModel,\n            labelDataIndex: idx,\n            defaultText: getLabelDefaultText,\n            isRectText: true,\n            autoColor: color\n        }\n    );\n\n    // Do not execute util needed.\n    function getLabelDefaultText(idx, opt) {\n        return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx);\n    }\n\n    symbolPath.__symbolOriginalScale = getScale(symbolSize);\n    symbolPath.hoverStyle = hoverItemStyle;\n    symbolPath.highDownOnUpdate = (\n        hoverAnimation && seriesModel.isAnimationEnabled()\n    ) ? highDownOnUpdate : null;\n\n    graphic.setHoverStyle(symbolPath);\n};\n\nfunction highDownOnUpdate(fromState, toState) {\n    // Do not support this hover animation util some scenario required.\n    // Animation can only be supported in hover layer when using `el.incremetal`.\n    if (this.incremental || this.useHoverLayer) {\n        return;\n    }\n\n    if (toState === 'emphasis') {\n        var scale = this.__symbolOriginalScale;\n        var ratio = scale[1] / scale[0];\n        var emphasisOpt = {\n            scale: [\n                Math.max(scale[0] * 1.1, scale[0] + 3),\n                Math.max(scale[1] * 1.1, scale[1] + 3 * ratio)\n            ]\n        };\n        // FIXME\n        // modify it after support stop specified animation.\n        // toState === fromState\n        //     ? (this.stopAnimation(), this.attr(emphasisOpt))\n        this.animateTo(emphasisOpt, 400, 'elasticOut');\n    }\n    else if (toState === 'normal') {\n        this.animateTo({\n            scale: this.__symbolOriginalScale\n        }, 400, 'elasticOut');\n    }\n}\n\n/**\n * @param {Function} cb\n * @param {Object} [opt]\n * @param {Object} [opt.keepLabel=true]\n */\nsymbolProto.fadeOut = function (cb, opt) {\n    var symbolPath = this.childAt(0);\n    // Avoid mistaken hover when fading out\n    this.silent = symbolPath.silent = true;\n    // Not show text when animating\n    !(opt && opt.keepLabel) && (symbolPath.style.text = null);\n\n    graphic.updateProps(\n        symbolPath,\n        {\n            style: {opacity: 0},\n            scale: [0, 0]\n        },\n        this._seriesModel,\n        this.dataIndex,\n        cb\n    );\n};\n\nzrUtil.inherits(SymbolClz, graphic.Group);\n\nexport default SymbolClz;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/chart/helper/SymbolDraw\n */\n\nimport * as graphic from '../../util/graphic';\nimport SymbolClz from './Symbol';\nimport { isObject } from 'zrender/src/core/util';\n\n/**\n * @constructor\n * @alias module:echarts/chart/helper/SymbolDraw\n * @param {module:zrender/graphic/Group} [symbolCtor]\n */\nfunction SymbolDraw(symbolCtor) {\n    this.group = new graphic.Group();\n\n    this._symbolCtor = symbolCtor || SymbolClz;\n}\n\nvar symbolDrawProto = SymbolDraw.prototype;\n\nfunction symbolNeedsDraw(data, point, idx, opt) {\n    return point && !isNaN(point[0]) && !isNaN(point[1])\n        && !(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]))\n        && data.getItemVisual(idx, 'symbol') !== 'none';\n}\n\n/**\n * Update symbols draw by new data\n * @param {module:echarts/data/List} data\n * @param {Object} [opt] Or isIgnore\n * @param {Function} [opt.isIgnore]\n * @param {Object} [opt.clipShape]\n */\nsymbolDrawProto.updateData = function (data, opt) {\n    opt = normalizeUpdateOpt(opt);\n\n    var group = this.group;\n    var seriesModel = data.hostModel;\n    var oldData = this._data;\n    var SymbolCtor = this._symbolCtor;\n\n    var seriesScope = makeSeriesScope(data);\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\n    data.diff(oldData)\n        .add(function (newIdx) {\n            var point = data.getItemLayout(newIdx);\n            if (symbolNeedsDraw(data, point, newIdx, opt)) {\n                var symbolEl = new SymbolCtor(data, newIdx, seriesScope);\n                symbolEl.attr('position', point);\n                data.setItemGraphicEl(newIdx, symbolEl);\n                group.add(symbolEl);\n            }\n        })\n        .update(function (newIdx, oldIdx) {\n            var symbolEl = oldData.getItemGraphicEl(oldIdx);\n            var point = data.getItemLayout(newIdx);\n            if (!symbolNeedsDraw(data, point, newIdx, opt)) {\n                group.remove(symbolEl);\n                return;\n            }\n            if (!symbolEl) {\n                symbolEl = new SymbolCtor(data, newIdx);\n                symbolEl.attr('position', point);\n            }\n            else {\n                symbolEl.updateData(data, newIdx, seriesScope);\n                graphic.updateProps(symbolEl, {\n                    position: point\n                }, seriesModel);\n            }\n\n            // Add back\n            group.add(symbolEl);\n\n            data.setItemGraphicEl(newIdx, symbolEl);\n        })\n        .remove(function (oldIdx) {\n            var el = oldData.getItemGraphicEl(oldIdx);\n            el && el.fadeOut(function () {\n                group.remove(el);\n            });\n        })\n        .execute();\n\n    this._data = data;\n};\n\nsymbolDrawProto.isPersistent = function () {\n    return true;\n};\n\nsymbolDrawProto.updateLayout = function () {\n    var data = this._data;\n    if (data) {\n        // Not use animation\n        data.eachItemGraphicEl(function (el, idx) {\n            var point = data.getItemLayout(idx);\n            el.attr('position', point);\n        });\n    }\n};\n\nsymbolDrawProto.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 * @param {module:echarts/data/List} data\n * @param {Object} [opt] Or isIgnore\n * @param {Function} [opt.isIgnore]\n * @param {Object} [opt.clipShape]\n */\nsymbolDrawProto.incrementalUpdate = function (taskParams, data, opt) {\n    opt = normalizeUpdateOpt(opt);\n\n    function updateIncrementalAndHover(el) {\n        if (!el.isGroup) {\n            el.incremental = el.useHoverLayer = 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.attr('position', point);\n            this.group.add(el);\n            data.setItemGraphicEl(idx, el);\n        }\n    }\n};\n\nfunction normalizeUpdateOpt(opt) {\n    if (opt != null && !isObject(opt)) {\n        opt = {isIgnore: opt};\n    }\n    return opt || {};\n}\n\nsymbolDrawProto.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            });\n        });\n    }\n    else {\n        group.removeAll();\n    }\n};\n\nfunction makeSeriesScope(data) {\n    var seriesModel = data.hostModel;\n    return {\n        itemStyle: seriesModel.getModel('itemStyle').getItemStyle(['color']),\n        hoverItemStyle: seriesModel.getModel('emphasis.itemStyle').getItemStyle(),\n        symbolRotate: seriesModel.get('symbolRotate'),\n        symbolOffset: seriesModel.get('symbolOffset'),\n        hoverAnimation: seriesModel.get('hoverAnimation'),\n        labelModel: seriesModel.getModel('label'),\n        hoverLabelModel: seriesModel.getModel('emphasis.label'),\n        cursorStyle: seriesModel.get('cursor')\n    };\n}\n\nexport default SymbolDraw;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {isDimensionStacked} from '../../data/helper/dataStackHelper';\nimport {map} from 'zrender/src/core/util';\n\n/**\n * @param {Object} coordSys\n * @param {module:echarts/data/List} data\n * @param {string} valueOrigin lineSeries.option.areaStyle.origin\n */\nexport function prepareDataCoordInfo(coordSys, data, valueOrigin) {\n    var baseAxis = coordSys.getBaseAxis();\n    var valueAxis = coordSys.getOtherAxis(baseAxis);\n    var valueStart = getValueStart(valueAxis, valueOrigin);\n\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\n    var dims = map(coordSys.dimensions, function (coordDim) {\n        return data.mapDimension(coordDim);\n    });\n\n    var stacked;\n    var stackResultDim = data.getCalculationInfo('stackResultDimension');\n    if (stacked |= isDimensionStacked(data, dims[0] /*, dims[1]*/)) { // jshint ignore:line\n        dims[0] = stackResultDim;\n    }\n    if (stacked |= isDimensionStacked(data, dims[1] /*, dims[0]*/)) { // jshint ignore:line\n        dims[1] = stackResultDim;\n    }\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}\n\nfunction getValueStart(valueAxis, valueOrigin) {\n    var valueStart = 0;\n    var extent = valueAxis.scale.getExtent();\n\n    if (valueOrigin === 'start') {\n        valueStart = extent[0];\n    }\n    else if (valueOrigin === 'end') {\n        valueStart = extent[1];\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\n    return valueStart;\n}\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\n    var baseDataOffset = dataCoordInfo.baseDataOffset;\n    var stackedData = [];\n    stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);\n    stackedData[1 - baseDataOffset] = value;\n\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\nimport {prepareDataCoordInfo, getStackedOnPoint} from './helper';\n\n// var arrayDiff = require('zrender/src/core/arrayDiff');\n// 'zrender/src/core/arrayDiff' has been used before, but it did\n// not do well in performance when roam with fixed dataZoom window.\n\n// function convertToIntId(newIdList, oldIdList) {\n//     // Generate int id instead of string id.\n//     // Compare string maybe slow in score function of arrDiff\n\n//     // Assume id in idList are all unique\n//     var idIndicesMap = {};\n//     var idx = 0;\n//     for (var i = 0; i < newIdList.length; i++) {\n//         idIndicesMap[newIdList[i]] = idx;\n//         newIdList[i] = idx++;\n//     }\n//     for (var i = 0; i < oldIdList.length; i++) {\n//         var oldId = oldIdList[i];\n//         // Same with newIdList\n//         if (idIndicesMap[oldId]) {\n//             oldIdList[i] = idIndicesMap[oldId];\n//         }\n//         else {\n//             oldIdList[i] = idx++;\n//         }\n//     }\n// }\n\nfunction diffData(oldData, newData) {\n    var diffResult = [];\n\n    newData.diff(oldData)\n        .add(function (idx) {\n            diffResult.push({cmd: '+', idx: idx});\n        })\n        .update(function (newIdx, oldIdx) {\n            diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx});\n        })\n        .remove(function (idx) {\n            diffResult.push({cmd: '-', idx: idx});\n        })\n        .execute();\n\n    return diffResult;\n}\n\nexport default function (\n    oldData, newData,\n    oldStackedOnPoints, newStackedOnPoints,\n    oldCoordSys, newCoordSys,\n    oldValueOrigin, newValueOrigin\n) {\n    var diff = diffData(oldData, newData);\n\n    // var newIdList = newData.mapArray(newData.getId);\n    // var oldIdList = oldData.mapArray(oldData.getId);\n\n    // convertToIntId(newIdList, oldIdList);\n\n    // // FIXME One data ?\n    // diff = arrayDiff(oldIdList, newIdList);\n\n    var currPoints = [];\n    var nextPoints = [];\n    // Points for stacking base line\n    var currStackedPoints = [];\n    var nextStackedPoints = [];\n\n    var status = [];\n    var sortedIndices = [];\n    var rawIndices = [];\n\n    var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);\n    var oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);\n\n    for (var i = 0; i < diff.length; i++) {\n        var diffItem = diff[i];\n        var pointAdded = true;\n\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                var currentPt = oldData.getItemLayout(diffItem.idx);\n                var nextPt = newData.getItemLayout(diffItem.idx1);\n                // If previous data is NaN, use next point directly\n                if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {\n                    currentPt = nextPt.slice();\n                }\n                currPoints.push(currentPt);\n                nextPoints.push(nextPt);\n\n                currStackedPoints.push(oldStackedOnPoints[diffItem.idx]);\n                nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]);\n\n                rawIndices.push(newData.getRawIndex(diffItem.idx1));\n                break;\n            case '+':\n                var idx = diffItem.idx;\n                currPoints.push(\n                    oldCoordSys.dataToPoint([\n                        newData.get(newDataOldCoordInfo.dataDimsForPoint[0], idx),\n                        newData.get(newDataOldCoordInfo.dataDimsForPoint[1], idx)\n                    ])\n                );\n\n                nextPoints.push(newData.getItemLayout(idx).slice());\n\n                currStackedPoints.push(\n                    getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, idx)\n                );\n                nextStackedPoints.push(newStackedOnPoints[idx]);\n\n                rawIndices.push(newData.getRawIndex(idx));\n                break;\n            case '-':\n                var idx = diffItem.idx;\n                var rawIndex = oldData.getRawIndex(idx);\n                // Data is replaced. In the case of dynamic data queue\n                // FIXME FIXME FIXME\n                if (rawIndex !== idx) {\n                    currPoints.push(oldData.getItemLayout(idx));\n                    nextPoints.push(newCoordSys.dataToPoint([\n                        oldData.get(oldDataNewCoordInfo.dataDimsForPoint[0], idx),\n                        oldData.get(oldDataNewCoordInfo.dataDimsForPoint[1], idx)\n                    ]));\n\n                    currStackedPoints.push(oldStackedOnPoints[idx]);\n                    nextStackedPoints.push(\n                        getStackedOnPoint(oldDataNewCoordInfo, newCoordSys, oldData, idx)\n                    );\n\n                    rawIndices.push(rawIndex);\n                }\n                else {\n                    pointAdded = false;\n                }\n        }\n\n        // Original indices\n        if (pointAdded) {\n            status.push(diffItem);\n            sortedIndices.push(sortedIndices.length);\n        }\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\n    var sortedCurrPoints = [];\n    var sortedNextPoints = [];\n\n    var sortedCurrStackedPoints = [];\n    var sortedNextStackedPoints = [];\n\n    var sortedStatus = [];\n    for (var i = 0; i < sortedIndices.length; i++) {\n        var idx = sortedIndices[i];\n        sortedCurrPoints[i] = currPoints[idx];\n        sortedNextPoints[i] = nextPoints[idx];\n\n        sortedCurrStackedPoints[i] = currStackedPoints[idx];\n        sortedNextStackedPoints[i] = nextStackedPoints[idx];\n\n        sortedStatus[i] = status[idx];\n    }\n\n    return {\n        current: sortedCurrPoints,\n        next: sortedNextPoints,\n\n        stackedOnCurrent: sortedCurrStackedPoints,\n        stackedOnNext: sortedNextStackedPoints,\n\n        status: sortedStatus\n    };\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Poly path support NaN point\n\nimport Path from 'zrender/src/graphic/Path';\nimport * as vec2 from 'zrender/src/core/vector';\nimport fixClipWithShadow from 'zrender/src/graphic/helper/fixClipWithShadow';\n\nvar vec2Min = vec2.min;\nvar vec2Max = vec2.max;\n\nvar scaleAndAdd = vec2.scaleAndAdd;\nvar v2Copy = vec2.copy;\n\n// Temporary variable\nvar v = [];\nvar cp0 = [];\nvar cp1 = [];\n\nfunction isPointNull(p) {\n    return isNaN(p[0]) || isNaN(p[1]);\n}\n\nfunction drawSegment(\n    ctx, points, start, segLen, allLen,\n    dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls\n) {\n    // if (smoothMonotone == null) {\n    //     if (isMono(points, 'x')) {\n    //         return drawMono(ctx, points, start, segLen, allLen,\n    //             dir, smoothMin, smoothMax, smooth, 'x', connectNulls);\n    //     }\n    //     else if (isMono(points, 'y')) {\n    //         return drawMono(ctx, points, start, segLen, allLen,\n    //             dir, smoothMin, smoothMax, smooth, 'y', connectNulls);\n    //     }\n    //     else {\n    //         return drawNonMono.apply(this, arguments);\n    //     }\n    // }\n    // else if (smoothMonotone !== 'none' && isMono(points, smoothMonotone)) {\n    //     return drawMono.apply(this, arguments);\n    // }\n    // else {\n    //     return drawNonMono.apply(this, arguments);\n    // }\n    if (smoothMonotone === 'none' || !smoothMonotone) {\n        return drawNonMono.apply(this, arguments);\n    }\n    else {\n        return drawMono.apply(this, arguments);\n    }\n}\n\n/**\n * Check if points is in monotone.\n *\n * @param {number[][]} points         Array of points which is in [x, y] form\n * @param {string}     smoothMonotone 'x', 'y', or 'none', stating for which\n *                                    dimension that is checking.\n *                                    If is 'none', `drawNonMono` should be\n *                                    called.\n *                                    If is undefined, either being monotone\n *                                    in 'x' or 'y' will call `drawMono`.\n */\n// function isMono(points, smoothMonotone) {\n//     if (points.length <= 1) {\n//         return true;\n//     }\n\n//     var dim = smoothMonotone === 'x' ? 0 : 1;\n//     var last = points[0][dim];\n//     var lastDiff = 0;\n//     for (var i = 1; i < points.length; ++i) {\n//         var diff = points[i][dim] - last;\n//         if (!isNaN(diff) && !isNaN(lastDiff)\n//             && diff !== 0 && lastDiff !== 0\n//             && ((diff >= 0) !== (lastDiff >= 0))\n//         ) {\n//             return false;\n//         }\n//         if (!isNaN(diff) && diff !== 0) {\n//             lastDiff = diff;\n//             last = points[i][dim];\n//         }\n//     }\n//     return true;\n// }\n\n/**\n * Draw smoothed line in monotone, in which only vertical or horizontal bezier\n * control points will be used. This should be used when points are monotone\n * either in x or y dimension.\n */\nfunction drawMono(\n    ctx, points, start, segLen, allLen,\n    dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls\n) {\n    var prevIdx = 0;\n    var idx = start;\n    for (var k = 0; k < segLen; k++) {\n        var p = points[idx];\n        if (idx >= allLen || idx < 0) {\n            break;\n        }\n        if (isPointNull(p)) {\n            if (connectNulls) {\n                idx += dir;\n                continue;\n            }\n            break;\n        }\n\n        if (idx === start) {\n            ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);\n        }\n        else {\n            if (smooth > 0) {\n                var prevP = points[prevIdx];\n                var dim = smoothMonotone === 'y' ? 1 : 0;\n\n                // Length of control point to p, either in x or y, but not both\n                var ctrlLen = (p[dim] - prevP[dim]) * smooth;\n\n                v2Copy(cp0, prevP);\n                cp0[dim] = prevP[dim] + ctrlLen;\n\n                v2Copy(cp1, p);\n                cp1[dim] = p[dim] - ctrlLen;\n\n                ctx.bezierCurveTo(\n                    cp0[0], cp0[1],\n                    cp1[0], cp1[1],\n                    p[0], p[1]\n                );\n            }\n            else {\n                ctx.lineTo(p[0], p[1]);\n            }\n        }\n\n        prevIdx = idx;\n        idx += dir;\n    }\n\n    return k;\n}\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 drawNonMono(\n    ctx, points, start, segLen, allLen,\n    dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls\n) {\n    var prevIdx = 0;\n    var idx = start;\n    for (var k = 0; k < segLen; k++) {\n        var p = points[idx];\n        if (idx >= allLen || idx < 0) {\n            break;\n        }\n        if (isPointNull(p)) {\n            if (connectNulls) {\n                idx += dir;\n                continue;\n            }\n            break;\n        }\n\n        if (idx === start) {\n            ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);\n            v2Copy(cp0, p);\n        }\n        else {\n            if (smooth > 0) {\n                var nextIdx = idx + dir;\n                var nextP = points[nextIdx];\n                if (connectNulls) {\n                    // Find next point not null\n                    while (nextP && isPointNull(points[nextIdx])) {\n                        nextIdx += dir;\n                        nextP = points[nextIdx];\n                    }\n                }\n\n                var ratioNextSeg = 0.5;\n                var prevP = points[prevIdx];\n                var nextP = points[nextIdx];\n                // Last point\n                if (!nextP || isPointNull(nextP)) {\n                    v2Copy(cp1, p);\n                }\n                else {\n                    // If next data is null in not connect case\n                    if (isPointNull(nextP) && !connectNulls) {\n                        nextP = p;\n                    }\n\n                    vec2.sub(v, nextP, prevP);\n\n                    var lenPrevSeg;\n                    var lenNextSeg;\n                    if (smoothMonotone === 'x' || smoothMonotone === 'y') {\n                        var dim = smoothMonotone === 'x' ? 0 : 1;\n                        lenPrevSeg = Math.abs(p[dim] - prevP[dim]);\n                        lenNextSeg = Math.abs(p[dim] - nextP[dim]);\n                    }\n                    else {\n                        lenPrevSeg = vec2.dist(p, prevP);\n                        lenNextSeg = vec2.dist(p, nextP);\n                    }\n\n                    // Use ratio of seg length\n                    ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);\n\n                    scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg));\n                }\n                // Smooth constraint\n                vec2Min(cp0, cp0, smoothMax);\n                vec2Max(cp0, cp0, smoothMin);\n                vec2Min(cp1, cp1, smoothMax);\n                vec2Max(cp1, cp1, smoothMin);\n\n                ctx.bezierCurveTo(\n                    cp0[0], cp0[1],\n                    cp1[0], cp1[1],\n                    p[0], p[1]\n                );\n                // cp0 of next segment\n                scaleAndAdd(cp0, p, v, smooth * ratioNextSeg);\n            }\n            else {\n                ctx.lineTo(p[0], p[1]);\n            }\n        }\n\n        prevIdx = idx;\n        idx += dir;\n    }\n\n    return k;\n}\n\nfunction getBoundingBox(points, smoothConstraint) {\n    var ptMin = [Infinity, Infinity];\n    var ptMax = [-Infinity, -Infinity];\n    if (smoothConstraint) {\n        for (var i = 0; i < points.length; i++) {\n            var pt = points[i];\n            if (pt[0] < ptMin[0]) {\n                ptMin[0] = pt[0];\n            }\n            if (pt[1] < ptMin[1]) {\n                ptMin[1] = pt[1];\n            }\n            if (pt[0] > ptMax[0]) {\n                ptMax[0] = pt[0];\n            }\n            if (pt[1] > ptMax[1]) {\n                ptMax[1] = pt[1];\n            }\n        }\n    }\n    return {\n        min: smoothConstraint ? ptMin : ptMax,\n        max: smoothConstraint ? ptMax : ptMin\n    };\n}\n\nexport var Polyline = Path.extend({\n\n    type: 'ec-polyline',\n\n    shape: {\n        points: [],\n\n        smooth: 0,\n\n        smoothConstraint: true,\n\n        smoothMonotone: null,\n\n        connectNulls: false\n    },\n\n    style: {\n        fill: null,\n\n        stroke: '#000'\n    },\n\n    brush: fixClipWithShadow(Path.prototype.brush),\n\n    buildPath: function (ctx, shape) {\n        var points = shape.points;\n\n        var i = 0;\n        var len = points.length;\n\n        var result = getBoundingBox(points, shape.smoothConstraint);\n\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 - 1])) {\n                    break;\n                }\n            }\n            for (; i < len; i++) {\n                if (!isPointNull(points[i])) {\n                    break;\n                }\n            }\n        }\n        while (i < len) {\n            i += drawSegment(\n                ctx, points, i, len, len,\n                1, result.min, result.max, shape.smooth,\n                shape.smoothMonotone, shape.connectNulls\n            ) + 1;\n        }\n    }\n});\n\nexport var Polygon = Path.extend({\n\n    type: 'ec-polygon',\n\n    shape: {\n        points: [],\n\n        // Offset between stacked base points and points\n        stackedOnPoints: [],\n\n        smooth: 0,\n\n        stackedOnSmooth: 0,\n\n        smoothConstraint: true,\n\n        smoothMonotone: null,\n\n        connectNulls: false\n    },\n\n    brush: fixClipWithShadow(Path.prototype.brush),\n\n    buildPath: function (ctx, shape) {\n        var points = shape.points;\n        var stackedOnPoints = shape.stackedOnPoints;\n\n        var i = 0;\n        var len = points.length;\n        var smoothMonotone = shape.smoothMonotone;\n        var bbox = getBoundingBox(points, shape.smoothConstraint);\n        var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);\n\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 - 1])) {\n                    break;\n                }\n            }\n            for (; i < len; i++) {\n                if (!isPointNull(points[i])) {\n                    break;\n                }\n            }\n        }\n        while (i < len) {\n            var k = drawSegment(\n                ctx, points, i, len, len,\n                1, bbox.min, bbox.max, shape.smooth,\n                smoothMonotone, shape.connectNulls\n            );\n            drawSegment(\n                ctx, stackedOnPoints, i + k - 1, k, len,\n                -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth,\n                smoothMonotone, shape.connectNulls\n            );\n            i += k + 1;\n\n            ctx.closePath();\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// FIXME step not support polar\n\nimport {__DEV__} from '../../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport SymbolDraw from '../helper/SymbolDraw';\nimport SymbolClz from '../helper/Symbol';\nimport lineAnimationDiff from './lineAnimationDiff';\nimport * as graphic from '../../util/graphic';\nimport * as modelUtil from '../../util/model';\nimport {Polyline, Polygon} from './poly';\nimport ChartView from '../../view/Chart';\nimport {round} from '../../util/number';\nimport {prepareDataCoordInfo, getStackedOnPoint} from './helper';\n\nfunction isPointsSame(points1, points2) {\n    if (points1.length !== points2.length) {\n        return;\n    }\n    for (var i = 0; i < points1.length; i++) {\n        var p1 = points1[i];\n        var p2 = points2[i];\n        if (p1[0] !== p2[0] || p1[1] !== p2[1]) {\n            return;\n        }\n    }\n    return true;\n}\n\nfunction getSmooth(smooth) {\n    return typeof (smooth) === 'number' ? smooth : (smooth ? 0.5 : 0);\n}\n\nfunction getAxisExtentWithGap(axis) {\n    var extent = axis.getGlobalExtent();\n    if (axis.onBand) {\n        // Remove extra 1px to avoid line miter in clipped edge\n        var halfBandWidth = axis.getBandWidth() / 2 - 1;\n        var dir = extent[1] > extent[0] ? 1 : -1;\n        extent[0] += dir * halfBandWidth;\n        extent[1] -= dir * halfBandWidth;\n    }\n    return extent;\n}\n\n/**\n * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys\n * @param {module:echarts/data/List} data\n * @param {Object} dataCoordInfo\n * @param {Array.<Array.<number>>} points\n */\nfunction getStackedOnPoints(coordSys, data, dataCoordInfo) {\n    if (!dataCoordInfo.valueDim) {\n        return [];\n    }\n\n    var points = [];\n    for (var idx = 0, len = data.count(); idx < len; idx++) {\n        points.push(getStackedOnPoint(dataCoordInfo, coordSys, data, idx));\n    }\n\n    return points;\n}\n\nfunction createGridClipShape(cartesian, hasAnimation, forSymbol, seriesModel) {\n    var xExtent = getAxisExtentWithGap(cartesian.getAxis('x'));\n    var yExtent = getAxisExtentWithGap(cartesian.getAxis('y'));\n    var isHorizontal = cartesian.getBaseAxis().isHorizontal();\n\n    var x = Math.min(xExtent[0], xExtent[1]);\n    var y = Math.min(yExtent[0], yExtent[1]);\n    var width = Math.max(xExtent[0], xExtent[1]) - x;\n    var height = Math.max(yExtent[0], yExtent[1]) - y;\n\n    // Avoid float number rounding error for symbol on the edge of axis extent.\n    // See #7913 and `test/dataZoom-clip.html`.\n    if (forSymbol) {\n        x -= 0.5;\n        width += 0.5;\n        y -= 0.5;\n        height += 0.5;\n    }\n    else {\n        var lineWidth = seriesModel.get('lineStyle.width') || 2;\n        // Expand clip shape to avoid clipping when line value exceeds axis\n        var expandSize = seriesModel.get('clipOverflow') ? lineWidth / 2 : Math.max(width, height);\n        if (isHorizontal) {\n            y -= expandSize;\n            height += expandSize * 2;\n        }\n        else {\n            x -= expandSize;\n            width += expandSize * 2;\n        }\n    }\n\n    var clipPath = new graphic.Rect({\n        shape: {\n            x: x,\n            y: y,\n            width: width,\n            height: height\n        }\n    });\n\n    if (hasAnimation) {\n        clipPath.shape[isHorizontal ? 'width' : 'height'] = 0;\n        graphic.initProps(clipPath, {\n            shape: {\n                width: width,\n                height: height\n            }\n        }, seriesModel);\n    }\n\n    return clipPath;\n}\n\nfunction createPolarClipShape(polar, hasAnimation, forSymbol, seriesModel) {\n    var angleAxis = polar.getAngleAxis();\n    var radiusAxis = polar.getRadiusAxis();\n\n    var radiusExtent = radiusAxis.getExtent().slice();\n    radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse();\n    var angleExtent = angleAxis.getExtent();\n\n    var RADIAN = Math.PI / 180;\n\n    // Avoid float number rounding error for symbol on the edge of axis extent.\n    if (forSymbol) {\n        radiusExtent[0] -= 0.5;\n        radiusExtent[1] += 0.5;\n    }\n\n    var clipPath = new graphic.Sector({\n        shape: {\n            cx: round(polar.cx, 1),\n            cy: round(polar.cy, 1),\n            r0: round(radiusExtent[0], 1),\n            r: round(radiusExtent[1], 1),\n            startAngle: -angleExtent[0] * RADIAN,\n            endAngle: -angleExtent[1] * RADIAN,\n            clockwise: angleAxis.inverse\n        }\n    });\n\n    if (hasAnimation) {\n        clipPath.shape.endAngle = -angleExtent[0] * RADIAN;\n        graphic.initProps(clipPath, {\n            shape: {\n                endAngle: -angleExtent[1] * RADIAN\n            }\n        }, seriesModel);\n    }\n\n    return clipPath;\n}\n\nfunction createClipShape(coordSys, hasAnimation, forSymbol, seriesModel) {\n    return coordSys.type === 'polar'\n        ? createPolarClipShape(coordSys, hasAnimation, forSymbol, seriesModel)\n        : createGridClipShape(coordSys, hasAnimation, forSymbol, seriesModel);\n}\n\nfunction turnPointsIntoStep(points, coordSys, stepTurnAt) {\n    var baseAxis = coordSys.getBaseAxis();\n    var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;\n\n    var stepPoints = [];\n    for (var i = 0; i < points.length - 1; i++) {\n        var nextPt = points[i + 1];\n        var pt = points[i];\n        stepPoints.push(pt);\n\n        var stepPt = [];\n        switch (stepTurnAt) {\n            case 'end':\n                stepPt[baseIndex] = nextPt[baseIndex];\n                stepPt[1 - baseIndex] = pt[1 - baseIndex];\n                // default is start\n                stepPoints.push(stepPt);\n                break;\n            case 'middle':\n                // default is start\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);\n                stepPoints.push(stepPt2);\n                break;\n            default:\n                stepPt[baseIndex] = pt[baseIndex];\n                stepPt[1 - baseIndex] = nextPt[1 - baseIndex];\n                // default is start\n                stepPoints.push(stepPt);\n        }\n    }\n    // Last points\n    points[i] && stepPoints.push(points[i]);\n    return stepPoints;\n}\n\nfunction getVisualGradient(data, coordSys) {\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\n    if (coordSys.type !== 'cartesian2d') {\n        if (__DEV__) {\n            console.warn('Visual map on line style is only supported on cartesian2d.');\n        }\n        return;\n    }\n\n    var coordDim;\n    var visualMeta;\n\n    for (var i = visualMetaList.length - 1; i >= 0; i--) {\n        var dimIndex = visualMetaList[i].dimension;\n        var dimName = data.dimensions[dimIndex];\n        var dimInfo = data.getDimensionInfo(dimName);\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\n    if (!visualMeta) {\n        if (__DEV__) {\n            console.warn('Visual map on line style only support x or y dimension.');\n        }\n        return;\n    }\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\n    var axis = coordSys.getAxis(coordDim);\n\n    // dataToCoor mapping may not be linear, but must be monotonic.\n    var colorStops = zrUtil.map(visualMeta.stops, function (stop) {\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\n    if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {\n        colorStops.reverse();\n        outerColors.reverse();\n    }\n\n    var tinyExtent = 10; // Arbitrary value: 10px\n    var minCoord = colorStops[0].coord - tinyExtent;\n    var maxCoord = colorStops[stopLen - 1].coord + tinyExtent;\n    var coordSpan = maxCoord - minCoord;\n\n    if (coordSpan < 1e-3) {\n        return 'transparent';\n    }\n\n    zrUtil.each(colorStops, function (stop) {\n        stop.offset = (stop.coord - minCoord) / coordSpan;\n    });\n    colorStops.push({\n        offset: stopLen ? colorStops[stopLen - 1].offset : 0.5,\n        color: outerColors[1] || 'transparent'\n    });\n    colorStops.unshift({ // notice colorStops.length have been changed.\n        offset: stopLen ? colorStops[0].offset : 0.5,\n        color: outerColors[0] || 'transparent'\n    });\n\n    // zrUtil.each(colorStops, function (colorStop) {\n    //     // Make sure each offset has rounded px to avoid not sharp edge\n    //     colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start);\n    // });\n\n    var gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStops, true);\n    gradient[coordDim] = minCoord;\n    gradient[coordDim + '2'] = maxCoord;\n\n    return gradient;\n}\n\nfunction getIsIgnoreFunc(seriesModel, data, coordSys) {\n    var showAllSymbol = seriesModel.get('showAllSymbol');\n    var isAuto = showAllSymbol === 'auto';\n\n    if (showAllSymbol && !isAuto) {\n        return;\n    }\n\n    var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n    if (!categoryAxis) {\n        return;\n    }\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    ) {\n        return;\n    }\n\n    // Otherwise follow the label interval strategy on category axis.\n    var categoryDataDim = data.mapDimension(categoryAxis.dim);\n    var labelMap = {};\n\n    zrUtil.each(categoryAxis.getViewLabels(), function (labelItem) {\n        labelMap[labelItem.tickValue] = 1;\n    });\n\n    return function (dataIndex) {\n        return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex));\n    };\n}\n\nfunction canShowAllSymbolForCategory(categoryAxis, data) {\n    // In mose 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\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(\n                data, dataIndex\n            // Only for cartesian, where `isHorizontal` exists.\n            )[categoryAxis.isHorizontal() ? 1 : 0]\n            // Empirical number\n            * 1.5 > availSize\n        ) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport default ChartView.extend({\n\n    type: 'line',\n\n    init: function () {\n        var lineGroup = new graphic.Group();\n\n        var symbolDraw = new SymbolDraw();\n        this.group.add(symbolDraw.group);\n\n        this._symbolDraw = symbolDraw;\n        this._lineGroup = lineGroup;\n    },\n\n    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\n        var points = data.mapArray(data.getItemLayout);\n\n        var isCoordSysPolar = coordSys.type === 'polar';\n        var prevCoordSys = this._coordSys;\n\n        var symbolDraw = this._symbolDraw;\n        var polyline = this._polyline;\n        var polygon = this._polygon;\n\n        var lineGroup = this._lineGroup;\n\n        var hasAnimation = seriesModel.get('animation');\n\n        var isAreaChart = !areaStyleModel.isEmpty();\n\n        var valueOrigin = areaStyleModel.get('origin');\n        var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);\n\n        var stackedOnPoints = getStackedOnPoints(coordSys, data, dataCoordInfo);\n\n        var showSymbol = seriesModel.get('showSymbol');\n\n        var isIgnoreFunc = showSymbol && !isCoordSysPolar\n            && getIsIgnoreFunc(seriesModel, data, coordSys);\n\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\n        // Remove previous created symbols if showSymbol changed to false\n        if (!showSymbol) {\n            symbolDraw.remove();\n        }\n\n        group.add(lineGroup);\n\n        // FIXME step not support polar\n        var step = !isCoordSysPolar && seriesModel.get('step');\n        // Initialization animation or coordinate system changed\n        if (\n            !(polyline && prevCoordSys.type === coordSys.type && step === this._step)\n        ) {\n            showSymbol && symbolDraw.updateData(data, {\n                isIgnore: isIgnoreFunc,\n                clipShape: createClipShape(coordSys, false, true, seriesModel)\n            });\n\n            if (step) {\n                // TODO If stacked series is not step\n                points = turnPointsIntoStep(points, coordSys, step);\n                stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);\n            }\n\n            polyline = this._newPolyline(points, coordSys, hasAnimation);\n            if (isAreaChart) {\n                polygon = this._newPolygon(\n                    points, stackedOnPoints,\n                    coordSys, hasAnimation\n                );\n            }\n            lineGroup.setClipPath(createClipShape(coordSys, true, false, seriesModel));\n        }\n        else {\n            if (isAreaChart && !polygon) {\n                // If areaStyle is added\n                polygon = this._newPolygon(\n                    points, stackedOnPoints,\n                    coordSys, hasAnimation\n                );\n            }\n            else if (polygon && !isAreaChart) {\n                // If areaStyle is removed\n                lineGroup.remove(polygon);\n                polygon = this._polygon = null;\n            }\n\n            // Update clipPath\n            lineGroup.setClipPath(createClipShape(coordSys, false, false, 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: createClipShape(coordSys, false, true, seriesModel)\n            });\n\n            // Stop symbol animation and sync with line points\n            // FIXME performance?\n            data.eachItemGraphicEl(function (el) {\n                el.stopAnimation(true);\n            });\n\n            // In the case data zoom triggerred refreshing frequently\n            // Data may not change if line has a category axis. So it should animate nothing\n            if (!isPointsSame(this._stackedOnPoints, stackedOnPoints)\n                || !isPointsSame(this._points, points)\n            ) {\n                if (hasAnimation) {\n                    this._updateAnimation(\n                        data, stackedOnPoints, coordSys, api, step, valueOrigin\n                    );\n                }\n                else {\n                    // Not do it in update with animation\n                    if (step) {\n                        // TODO If stacked series is not step\n                        points = turnPointsIntoStep(points, coordSys, step);\n                        stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);\n                    }\n\n                    polyline.setShape({\n                        points: points\n                    });\n                    polygon && polygon.setShape({\n                        points: points,\n                        stackedOnPoints: stackedOnPoints\n                    });\n                }\n            }\n        }\n\n        var visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');\n\n        polyline.useStyle(zrUtil.defaults(\n            // Use color in lineStyle first\n            lineStyleModel.getLineStyle(),\n            {\n                fill: 'none',\n                stroke: visualColor,\n                lineJoin: 'bevel'\n            }\n        ));\n\n        var smooth = seriesModel.get('smooth');\n        smooth = getSmooth(seriesModel.get('smooth'));\n        polyline.setShape({\n            smooth: smooth,\n            smoothMonotone: seriesModel.get('smoothMonotone'),\n            connectNulls: seriesModel.get('connectNulls')\n        });\n\n        if (polygon) {\n            var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');\n            var stackedOnSmooth = 0;\n\n            polygon.useStyle(zrUtil.defaults(\n                areaStyleModel.getAreaStyle(),\n                {\n                    fill: visualColor,\n                    opacity: 0.7,\n                    lineJoin: 'bevel'\n                }\n            ));\n\n            if (stackedOnSeries) {\n                stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));\n            }\n\n            polygon.setShape({\n                smooth: smooth,\n                stackedOnSmooth: stackedOnSmooth,\n                smoothMonotone: seriesModel.get('smoothMonotone'),\n                connectNulls: seriesModel.get('connectNulls')\n            });\n        }\n\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    },\n\n    dispose: function () {},\n\n    highlight: function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n        var dataIndex = modelUtil.queryDataIndex(data, payload);\n\n        if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {\n            var symbol = data.getItemGraphicEl(dataIndex);\n            if (!symbol) {\n                // Create a temporary symbol if it is not exists\n                var pt = data.getItemLayout(dataIndex);\n                if (!pt) {\n                    // Null data\n                    return;\n                }\n                symbol = new SymbolClz(data, dataIndex);\n                symbol.position = pt;\n                symbol.setZ(\n                    seriesModel.get('zlevel'),\n                    seriesModel.get('z')\n                );\n                symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]);\n                symbol.__temp = true;\n                data.setItemGraphicEl(dataIndex, symbol);\n\n                // Stop scale animation\n                symbol.stopSymbolAnimation(true);\n\n                this.group.add(symbol);\n            }\n            symbol.highlight();\n        }\n        else {\n            // Highlight whole series\n            ChartView.prototype.highlight.call(\n                this, seriesModel, ecModel, api, payload\n            );\n        }\n    },\n\n    downplay: function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n        var dataIndex = modelUtil.queryDataIndex(data, payload);\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                }\n                else {\n                    symbol.downplay();\n                }\n            }\n        }\n        else {\n            // FIXME\n            // can not downplay completely.\n            // Downplay whole series\n            ChartView.prototype.downplay.call(\n                this, seriesModel, ecModel, api, payload\n            );\n        }\n    },\n\n    /**\n     * @param {module:zrender/container/Group} group\n     * @param {Array.<Array.<number>>} points\n     * @private\n     */\n    _newPolyline: function (points) {\n        var polyline = this._polyline;\n        // Remove previous created polyline\n        if (polyline) {\n            this._lineGroup.remove(polyline);\n        }\n\n        polyline = new Polyline({\n            shape: {\n                points: points\n            },\n            silent: true,\n            z2: 10\n        });\n\n        this._lineGroup.add(polyline);\n\n        this._polyline = polyline;\n\n        return polyline;\n    },\n\n    /**\n     * @param {module:zrender/container/Group} group\n     * @param {Array.<Array.<number>>} stackedOnPoints\n     * @param {Array.<Array.<number>>} points\n     * @private\n     */\n    _newPolygon: function (points, stackedOnPoints) {\n        var polygon = this._polygon;\n        // Remove previous created polygon\n        if (polygon) {\n            this._lineGroup.remove(polygon);\n        }\n\n        polygon = new Polygon({\n            shape: {\n                points: points,\n                stackedOnPoints: stackedOnPoints\n            },\n            silent: true\n        });\n\n        this._lineGroup.add(polygon);\n\n        this._polygon = polygon;\n        return polygon;\n    },\n\n    /**\n     * @private\n     */\n    // FIXME Two value axis\n    _updateAnimation: function (data, stackedOnPoints, coordSys, api, step, valueOrigin) {\n        var polyline = this._polyline;\n        var polygon = this._polygon;\n        var seriesModel = data.hostModel;\n\n        var diff = lineAnimationDiff(\n            this._data, data,\n            this._stackedOnPoints, stackedOnPoints,\n            this._coordSys, coordSys,\n            this._valueOrigin, valueOrigin\n        );\n\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            current = turnPointsIntoStep(diff.current, coordSys, step);\n            stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step);\n            next = turnPointsIntoStep(diff.next, coordSys, step);\n            stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step);\n        }\n        // `diff.current` is subset of `current` (which should be ensured by\n        // turnPointsIntoStep), so points in `__points` can be updated when\n        // points in `current` are update during animation.\n        polyline.shape.__points = diff.current;\n        polyline.shape.points = current;\n\n        graphic.updateProps(polyline, {\n            shape: {\n                points: next\n            }\n        }, seriesModel);\n\n        if (polygon) {\n            polygon.setShape({\n                points: current,\n                stackedOnPoints: stackedOnCurrent\n            });\n            graphic.updateProps(polygon, {\n                shape: {\n                    points: next,\n                    stackedOnPoints: stackedOnNext\n                }\n            }, seriesModel);\n        }\n\n        var updatedDataInfo = [];\n        var diffStatus = diff.status;\n\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\n        if (polyline.animators && polyline.animators.length) {\n            polyline.animators[0].during(function () {\n                for (var i = 0; i < updatedDataInfo.length; i++) {\n                    var el = updatedDataInfo[i].el;\n                    el.attr('position', polyline.shape.__points[updatedDataInfo[i].ptIdx]);\n                }\n            });\n        }\n    },\n\n    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\n        this._polyline\n            = this._polygon\n            = this._coordSys\n            = this._points\n            = this._stackedOnPoints\n            = this._data = 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\nimport {isFunction} from 'zrender/src/core/util';\n\nexport default function (seriesType, defaultSymbolType, legendSymbol) {\n    // Encoding visual for all series include which is filtered for legend drawing\n    return {\n        seriesType: seriesType,\n\n        // For legend.\n        performRawSeries: true,\n\n        reset: function (seriesModel, ecModel, api) {\n            var data = seriesModel.getData();\n\n            var symbolType = seriesModel.get('symbol');\n            var symbolSize = seriesModel.get('symbolSize');\n            var keepAspect = seriesModel.get('symbolKeepAspect');\n\n            var hasSymbolTypeCallback = isFunction(symbolType);\n            var hasSymbolSizeCallback = isFunction(symbolSize);\n            var hasCallback = hasSymbolTypeCallback || hasSymbolSizeCallback;\n            var seriesSymbol = (!hasSymbolTypeCallback && symbolType) ? symbolType : defaultSymbolType;\n            var seriesSymbolSize = !hasSymbolSizeCallback ? symbolSize : null;\n\n            data.setVisual({\n                legendSymbol: legendSymbol || seriesSymbol,\n                // If seting callback functions on `symbol` or `symbolSize`, for simplicity and avoiding\n                // to bring trouble, we do not pick a reuslt from one of its calling on data item here,\n                // but just use the default value. Callback on `symbol` or `symbolSize` is convenient in\n                // some cases but generally it is not recommanded.\n                symbol: seriesSymbol,\n                symbolSize: seriesSymbolSize,\n                symbolKeepAspect: keepAspect\n            });\n\n            // Only visible series has each data be visual encoded\n            if (ecModel.isSeriesFiltered(seriesModel)) {\n                return;\n            }\n\n            function dataEach(data, idx) {\n                if (hasCallback) {\n                    var rawValue = seriesModel.getRawValue(idx);\n                    var params = seriesModel.getDataParams(idx);\n                    hasSymbolTypeCallback && data.setItemVisual(idx, 'symbol', symbolType(rawValue, params));\n                    hasSymbolSizeCallback && data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params));\n                }\n\n                if (data.hasItemOption) {\n                    var itemModel = data.getItemModel(idx);\n                    var itemSymbolType = itemModel.getShallow('symbol', true);\n                    var itemSymbolSize = itemModel.getShallow('symbolSize', true);\n                    var itemSymbolKeepAspect = itemModel.getShallow('symbolKeepAspect', true);\n\n                    // If has item symbol\n                    if (itemSymbolType != null) {\n                        data.setItemVisual(idx, 'symbol', itemSymbolType);\n                    }\n                    if (itemSymbolSize != null) {\n                        // PENDING Transform symbolSize ?\n                        data.setItemVisual(idx, 'symbolSize', itemSymbolSize);\n                    }\n                    if (itemSymbolKeepAspect != null) {\n                        data.setItemVisual(idx, 'symbolKeepAspect', itemSymbolKeepAspect);\n                    }\n                }\n            }\n\n            return { dataEach: (data.hasItemOption || hasCallback) ? dataEach : 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/* global Float32Array */\n\nimport {map} from 'zrender/src/core/util';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner';\nimport {isDimensionStacked} from '../data/helper/dataStackHelper';\n\nexport default function (seriesType) {\n    return {\n        seriesType: seriesType,\n\n        plan: createRenderPlanner(),\n\n        reset: function (seriesModel) {\n            var data = seriesModel.getData();\n            var coordSys = seriesModel.coordinateSystem;\n            var pipelineContext = seriesModel.pipelineContext;\n            var isLargeRender = pipelineContext.large;\n\n            if (!coordSys) {\n                return;\n            }\n\n            var dims = map(coordSys.dimensions, function (dim) {\n                return data.mapDimension(dim);\n            }).slice(0, 2);\n            var dimLen = dims.length;\n\n            var stackResultDim = data.getCalculationInfo('stackResultDimension');\n            if (isDimensionStacked(data, dims[0] /*, dims[1]*/)) {\n                dims[0] = stackResultDim;\n            }\n            if (isDimensionStacked(data, dims[1] /*, dims[0]*/)) {\n                dims[1] = stackResultDim;\n            }\n\n            function progress(params, data) {\n                var segCount = params.end - params.start;\n                var points = isLargeRender && new Float32Array(segCount * dimLen);\n\n                for (var i = params.start, offset = 0, tmpIn = [], tmpOut = []; i < params.end; i++) {\n                    var point;\n\n                    if (dimLen === 1) {\n                        var x = data.get(dims[0], i);\n                        point = !isNaN(x) && coordSys.dataToPoint(x, null, tmpOut);\n                    }\n                    else {\n                        var x = tmpIn[0] = data.get(dims[0], i);\n                        var y = tmpIn[1] = data.get(dims[1], i);\n                        // Also {Array.<number>}, not undefined to avoid if...else... statement\n                        point = !isNaN(x) && !isNaN(y) && coordSys.dataToPoint(tmpIn, null, tmpOut);\n                    }\n\n                    if (isLargeRender) {\n                        points[offset++] = point ? point[0] : NaN;\n                        points[offset++] = point ? point[1] : NaN;\n                    }\n                    else {\n                        data.setItemLayout(i, (point && point.slice()) || [NaN, NaN]);\n                    }\n                }\n\n                isLargeRender && data.setLayout('symbolPoints', points);\n            }\n\n            return dimLen && {progress: progress};\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\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};\n\nvar indexSampler = function (frame, value) {\n    return Math.round(frame.length / 2);\n};\n\nexport default function (seriesType) {\n    return {\n\n        seriesType: seriesType,\n\n        modifyOutputEnd: true,\n\n        reset: function (seriesModel, ecModel, api) {\n            var data = seriesModel.getData();\n            var sampling = seriesModel.get('sampling');\n            var coordSys = seriesModel.coordinateSystem;\n            // Only cartesian2d support down sampling\n            if (coordSys.type === 'cartesian2d' && sampling) {\n                var baseAxis = coordSys.getBaseAxis();\n                var valueAxis = coordSys.getOtherAxis(baseAxis);\n                var extent = baseAxis.getExtent();\n                // Coordinste system has been resized\n                var size = extent[1] - extent[0];\n                var rate = Math.round(data.count() / size);\n                if (rate > 1) {\n                    var sampler;\n                    if (typeof sampling === 'string') {\n                        sampler = samplers[sampling];\n                    }\n                    else if (typeof sampling === 'function') {\n                        sampler = sampling;\n                    }\n                    if (sampler) {\n                        // Only support sample the first dim mapped from value axis.\n                        seriesModel.setData(data.downSample(\n                            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 * Cartesian coordinate system\n * @module  echarts/coord/Cartesian\n *\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nfunction dimAxisMapper(dim) {\n    return this._axes[dim];\n}\n\n/**\n * @alias module:echarts/coord/Cartesian\n * @constructor\n */\nvar Cartesian = function (name) {\n    this._axes = {};\n\n    this._dimList = [];\n\n    /**\n     * @type {string}\n     */\n    this.name = name || '';\n};\n\nCartesian.prototype = {\n\n    constructor: Cartesian,\n\n    type: 'cartesian',\n\n    /**\n     * Get axis\n     * @param  {number|string} dim\n     * @return {module:echarts/coord/Cartesian~Axis}\n     */\n    getAxis: function (dim) {\n        return this._axes[dim];\n    },\n\n    /**\n     * Get axes list\n     * @return {Array.<module:echarts/coord/Cartesian~Axis>}\n     */\n    getAxes: function () {\n        return zrUtil.map(this._dimList, dimAxisMapper, this);\n    },\n\n    /**\n     * Get axes list by given scale type\n     */\n    getAxesByScale: function (scaleType) {\n        scaleType = scaleType.toLowerCase();\n        return zrUtil.filter(\n            this.getAxes(),\n            function (axis) {\n                return axis.scale.type === scaleType;\n            }\n        );\n    },\n\n    /**\n     * Add axis\n     * @param {module:echarts/coord/Cartesian.Axis}\n     */\n    addAxis: function (axis) {\n        var dim = axis.dim;\n\n        this._axes[dim] = axis;\n\n        this._dimList.push(dim);\n    },\n\n    /**\n     * Convert data to coord in nd space\n     * @param {Array.<number>|Object.<string, number>} val\n     * @return {Array.<number>|Object.<string, number>}\n     */\n    dataToCoord: function (val) {\n        return this._dataCoordConvert(val, 'dataToCoord');\n    },\n\n    /**\n     * Convert coord in nd space to data\n     * @param  {Array.<number>|Object.<string, number>} val\n     * @return {Array.<number>|Object.<string, number>}\n     */\n    coordToData: function (val) {\n        return this._dataCoordConvert(val, 'coordToData');\n    },\n\n    _dataCoordConvert: function (input, method) {\n        var dimList = this._dimList;\n\n        var output = input instanceof Array ? [] : {};\n\n        for (var i = 0; i < dimList.length; i++) {\n            var dim = dimList[i];\n            var axis = this._axes[dim];\n\n            output[dim] = axis[method](input[dim]);\n        }\n\n        return output;\n    }\n};\n\nexport default Cartesian;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Cartesian from './Cartesian';\n\nfunction Cartesian2D(name) {\n\n    Cartesian.call(this, name);\n}\n\nCartesian2D.prototype = {\n\n    constructor: Cartesian2D,\n\n    type: 'cartesian2d',\n\n    /**\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    dimensions: ['x', 'y'],\n\n    /**\n     * Base axis will be used on stacking.\n     *\n     * @return {module:echarts/coord/cartesian/Axis2D}\n     */\n    getBaseAxis: function () {\n        return this.getAxesByScale('ordinal')[0]\n            || this.getAxesByScale('time')[0]\n            || this.getAxis('x');\n    },\n\n    /**\n     * If contain point\n     * @param {Array.<number>} point\n     * @return {boolean}\n     */\n    containPoint: function (point) {\n        var axisX = this.getAxis('x');\n        var axisY = this.getAxis('y');\n        return axisX.contain(axisX.toLocalCoord(point[0]))\n            && axisY.contain(axisY.toLocalCoord(point[1]));\n    },\n\n    /**\n     * If contain data\n     * @param {Array.<number>} data\n     * @return {boolean}\n     */\n    containData: function (data) {\n        return this.getAxis('x').containData(data[0])\n            && this.getAxis('y').containData(data[1]);\n    },\n\n    /**\n     * @param {Array.<number>} data\n     * @param {Array.<number>} out\n     * @return {Array.<number>}\n     */\n    dataToPoint: function (data, reserved, out) {\n        var xAxis = this.getAxis('x');\n        var yAxis = this.getAxis('y');\n        out = out || [];\n        out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(data[0]));\n        out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(data[1]));\n        return out;\n    },\n\n    /**\n     * @param {Array.<number>} data\n     * @param {Array.<number>} out\n     * @return {Array.<number>}\n     */\n    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(\n            Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x),\n            Math.max(xAxisExtent[0], xAxisExtent[1])\n        );\n        out[1] = Math.min(\n            Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y),\n            Math.max(yAxisExtent[0], yAxisExtent[1])\n        );\n\n        return out;\n    },\n\n    /**\n     * @param {Array.<number>} point\n     * @param {Array.<number>} out\n     * @return {Array.<number>}\n     */\n    pointToData: function (point, out) {\n        var xAxis = this.getAxis('x');\n        var yAxis = this.getAxis('y');\n        out = out || [];\n        out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]));\n        out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]));\n        return out;\n    },\n\n    /**\n     * Get other axis\n     * @param {module:echarts/coord/cartesian/Axis2D} axis\n     */\n    getOtherAxis: function (axis) {\n        return this.getAxis(axis.dim === 'x' ? 'y' : 'x');\n    }\n\n};\n\nzrUtil.inherits(Cartesian2D, Cartesian);\n\nexport default Cartesian2D;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../Axis';\n\n/**\n * Extend axis 2d\n * @constructor module:echarts/coord/cartesian/Axis2D\n * @extends {module:echarts/coord/cartesian/Axis}\n * @param {string} dim\n * @param {*} scale\n * @param {Array.<number>} coordExtent\n * @param {string} axisType\n * @param {string} position\n */\nvar Axis2D = function (dim, scale, coordExtent, axisType, position) {\n    Axis.call(this, dim, scale, coordExtent);\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = axisType || 'value';\n\n    /**\n     * Axis position\n     *  - 'top'\n     *  - 'bottom'\n     *  - 'left'\n     *  - 'right'\n     */\n    this.position = position || 'bottom';\n};\n\nAxis2D.prototype = {\n\n    constructor: Axis2D,\n\n    /**\n     * Index of axis, can be used as key\n     */\n    index: 0,\n\n    /**\n     * Implemented in <module:echarts/coord/cartesian/Grid>.\n     * @return {Array.<module:echarts/coord/cartesian/Axis2D>}\n     *         If not on zero of other axis, return null/undefined.\n     *         If no axes, return an empty array.\n     */\n    getAxesOnZeroOf: null,\n\n    /**\n     * Axis model\n     * @param {module:echarts/coord/cartesian/AxisModel}\n     */\n    model: null,\n\n    isHorizontal: function () {\n        var position = this.position;\n        return position === 'top' || position === 'bottom';\n    },\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    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\n    getOtherAxis: function () {\n        this.grid.getOtherAxis();\n    },\n\n    /**\n     * @override\n     */\n    pointToData: function (point, clamp) {\n        return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);\n    },\n\n    /**\n     * Transform global coord to local coord,\n     * i.e. var localCoord = axis.toLocalCoord(80);\n     * designate by module:echarts/coord/cartesian/Grid.\n     * @type {Function}\n     */\n    toLocalCoord: null,\n\n    /**\n     * Transform global coord to local coord,\n     * i.e. var globalCoord = axis.toLocalCoord(40);\n     * designate by module:echarts/coord/cartesian/Grid.\n     * @type {Function}\n     */\n    toGlobalCoord: null\n\n};\n\nzrUtil.inherits(Axis2D, Axis);\n\nexport default Axis2D;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar defaultOption = {\n    show: true,\n    zlevel: 0,\n    z: 0,\n    // Inverse the axis.\n    inverse: false,\n\n    // Axis name displayed.\n    name: '',\n    // 'start' | 'middle' | 'end'\n    nameLocation: 'end',\n    // By degree. By defualt 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    // The gap between axisName and axisLine.\n    nameGap: 15,\n\n    // Default `false` to support tooltip.\n    silent: false,\n    // Default `false` to avoid legacy user event listener fail.\n    triggerEvent: false,\n\n    tooltip: {\n        show: false\n    },\n\n    axisPointer: {},\n\n    axisLine: {\n        show: true,\n        onZero: true,\n        onZeroAxisIndex: null,\n        lineStyle: {\n            color: '#333',\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    },\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    },\n    splitLine: {\n        show: true,\n        lineStyle: {\n            color: ['#ccc'],\n            width: 1,\n            type: 'solid'\n        }\n    },\n    splitArea: {\n        show: false,\n        areaStyle: {\n            color: ['rgba(250,250,250,0.3)', 'rgba(200,200,200,0.3)']\n        }\n    }\n};\n\nvar axisDefault = {};\n\naxisDefault.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    // Only usefull in the case like: category is\n    // ['2012-01-01', '2012-01-02', ...], where the input\n    // data has been ensured not duplicate and is large data.\n    // null means \"auto\":\n    // if axis.data provided, do not deduplication,\n    // else do deduplication.\n    deduplication: null,\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    },\n    axisLabel: {\n        interval: 'auto'\n    }\n}, defaultOption);\n\naxisDefault.valueAxis = zrUtil.merge({\n    // The gap at both ends of the axis. For value axis, [GAP, GAP], where\n    // `GAP` can be an absolute pixel number (like `35`), or percent (like `'30%'`)\n    boundaryGap: [0, 0],\n\n    // TODO\n    // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60]\n\n    // Min value of the axis. can be:\n    // + a number\n    // + 'dataMin': use the min value in data.\n    // + null/undefined: auto decide min value (consider pretty look and boundaryGap).\n    // min: null,\n\n    // Max value of the axis. can be:\n    // + a number\n    // + 'dataMax': use the max value in data.\n    // + null/undefined: auto decide max value (consider pretty look and boundaryGap).\n    // max: null,\n\n    // Readonly prop, specifies start value of the range when using data zoom.\n    // rangeStart: null\n\n    // Readonly prop, specifies end value of the range when using data zoom.\n    // rangeEnd: null\n\n    // Optional value can be:\n    // + `false`: always include value 0.\n    // + `true`: the extent do not consider value 0.\n    // scale: false,\n\n    // AxisTick and axisLabel and splitLine are caculated based on splitNumber.\n    splitNumber: 5\n\n    // Interval specifies the span of the ticks is mandatorily.\n    // interval: null\n\n    // Specify min interval when auto calculate tick interval.\n    // minInterval: null\n\n    // Specify max interval when auto calculate tick interval.\n    // maxInterval: null\n\n}, defaultOption);\n\naxisDefault.timeAxis = zrUtil.defaults({\n    scale: true,\n    min: 'dataMin',\n    max: 'dataMax'\n}, axisDefault.valueAxis);\n\naxisDefault.logAxis = zrUtil.defaults({\n    scale: true,\n    logBase: 10\n}, axisDefault.valueAxis);\n\nexport default axisDefault;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport axisDefault from './axisDefault';\nimport ComponentModel from '../model/Component';\nimport {\n    getLayoutParams,\n    mergeLayoutParam\n} from '../util/layout';\nimport OrdinalMeta from '../data/OrdinalMeta';\n\n\n// FIXME axisType is fixed ?\nvar AXIS_TYPES = ['value', 'category', 'time', 'log'];\n\n/**\n * Generate sub axis model class\n * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel'\n * @param {module:echarts/model/Component} BaseAxisModelClass\n * @param {Function} axisTypeDefaulter\n * @param {Object} [extraDefaultOption]\n */\nexport default function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) {\n\n    zrUtil.each(AXIS_TYPES, function (axisType) {\n\n        BaseAxisModelClass.extend({\n\n            /**\n             * @readOnly\n             */\n            type: axisName + 'Axis.' + axisType,\n\n            mergeDefaultAndTheme: function (option, ecModel) {\n                var layoutMode = this.layoutMode;\n                var inputPositionParams = layoutMode\n                    ? getLayoutParams(option) : {};\n\n                var themeModel = ecModel.getTheme();\n                zrUtil.merge(option, themeModel.get(axisType + 'Axis'));\n                zrUtil.merge(option, this.getDefaultOption());\n\n                option.type = axisTypeDefaulter(axisName, option);\n\n                if (layoutMode) {\n                    mergeLayoutParam(option, inputPositionParams, layoutMode);\n                }\n            },\n\n            /**\n             * @override\n             */\n            optionUpdated: function () {\n                var thisOption = this.option;\n                if (thisOption.type === 'category') {\n                    this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);\n                }\n            },\n\n            /**\n             * Should not be called before all of 'getInitailData' finished.\n             * Because categories are collected during initializing data.\n             */\n            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\n            getOrdinalMeta: function () {\n                return this.__ordinalMeta;\n            },\n\n            defaultOption: zrUtil.mergeAll(\n                [\n                    {},\n                    axisDefault[axisType + 'Axis'],\n                    extraDefaultOption\n                ],\n                true\n            )\n        });\n    });\n\n    ComponentModel.registerSubTypeDefaulter(\n        axisName + 'Axis',\n        zrUtil.curry(axisTypeDefaulter, axisName)\n    );\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport axisModelCreator from '../axisModelCreator';\nimport axisModelCommonMixin from '../axisModelCommonMixin';\n\nvar AxisModel = ComponentModel.extend({\n\n    type: 'cartesian2dAxis',\n\n    /**\n     * @type {module:echarts/coord/cartesian/Axis2D}\n     */\n    axis: null,\n\n    /**\n     * @override\n     */\n    init: function () {\n        AxisModel.superApply(this, 'init', arguments);\n        this.resetRange();\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function () {\n        AxisModel.superApply(this, 'mergeOption', arguments);\n        this.resetRange();\n    },\n\n    /**\n     * @override\n     */\n    restoreData: function () {\n        AxisModel.superApply(this, 'restoreData', arguments);\n        this.resetRange();\n    },\n\n    /**\n     * @override\n     * @return {module:echarts/model/Component}\n     */\n    getCoordSysModel: function () {\n        return this.ecModel.queryComponents({\n            mainType: 'grid',\n            index: this.option.gridIndex,\n            id: this.option.gridId\n        })[0];\n    }\n\n});\n\nfunction getAxisType(axisDim, option) {\n    // Default axis with data is category axis\n    return option.type || (option.data ? 'category' : 'value');\n}\n\nzrUtil.merge(AxisModel.prototype, axisModelCommonMixin);\n\nvar extraOption = {\n    // gridIndex: 0,\n    // gridId: '',\n\n    // Offset is for multiple axis on the same position\n    offset: 0\n};\n\naxisModelCreator('x', AxisModel, getAxisType, extraOption);\naxisModelCreator('y', AxisModel, getAxisType, extraOption);\n\nexport default AxisModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* 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 是在有直角坐标系的时候必须要存在的\n// 所以这里也要被 Cartesian2D 依赖\n\nimport './AxisModel';\nimport ComponentModel from '../../model/Component';\n\nexport default ComponentModel.extend({\n\n    type: 'grid',\n\n    dependencies: ['xAxis', 'yAxis'],\n\n    layoutMode: 'box',\n\n    /**\n     * @type {module:echarts/coord/cartesian/Grid}\n     */\n    coordinateSystem: null,\n\n    defaultOption: {\n        show: false,\n        zlevel: 0,\n        z: 0,\n        left: '10%',\n        top: 60,\n        right: '10%',\n        bottom: 60,\n        // If grid size contain label\n        containLabel: false,\n        // width: {totalWidth} - left - right,\n        // height: {totalHeight} - top - bottom,\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderWidth: 1,\n        borderColor: '#ccc'\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Grid is a region which contains at most 4 cartesian systems\n *\n * TODO Default cartesian\n */\n\nimport {__DEV__} from '../../config';\nimport {isObject, each, map, indexOf, retrieve} from 'zrender/src/core/util';\nimport {getLayoutRect} from '../../util/layout';\nimport {\n    createScaleByModel,\n    ifAxisCrossZero,\n    niceScaleExtent,\n    estimateLabelUnionRect\n} from '../../coord/axisHelper';\nimport Cartesian2D from './Cartesian2D';\nimport Axis2D from './Axis2D';\nimport CoordinateSystem from '../../CoordinateSystem';\nimport {getStackedDimension} from '../../data/helper/dataStackHelper';\n\n// Depends on GridModel, AxisModel, which performs preprocess.\nimport './GridModel';\n\n/**\n * Check if the axis is used in the specified grid\n * @inner\n */\nfunction isAxisUsedInTheGrid(axisModel, gridModel, ecModel) {\n    return axisModel.getCoordSysModel() === gridModel;\n}\n\nfunction Grid(gridModel, ecModel, api) {\n    /**\n     * @type {Object.<string, module:echarts/coord/cartesian/Cartesian2D>}\n     * @private\n     */\n    this._coordsMap = {};\n\n    /**\n     * @type {Array.<module:echarts/coord/cartesian/Cartesian>}\n     * @private\n     */\n    this._coordsList = [];\n\n    /**\n     * @type {Object.<string, Array.<module:echarts/coord/cartesian/Axis2D>>}\n     * @private\n     */\n    this._axesMap = {};\n\n    /**\n     * @type {Array.<module:echarts/coord/cartesian/Axis2D>}\n     * @private\n     */\n    this._axesList = [];\n\n    this._initCartesian(gridModel, ecModel, api);\n\n    this.model = gridModel;\n}\n\nvar gridProto = Grid.prototype;\n\ngridProto.type = 'grid';\n\ngridProto.axisPointerEnabled = true;\n\ngridProto.getRect = function () {\n    return this._rect;\n};\n\ngridProto.update = function (ecModel, api) {\n\n    var axesMap = this._axesMap;\n\n    this._updateScale(ecModel, this.model);\n\n    each(axesMap.x, function (xAxis) {\n        niceScaleExtent(xAxis.scale, xAxis.model);\n    });\n    each(axesMap.y, function (yAxis) {\n        niceScaleExtent(yAxis.scale, yAxis.model);\n    });\n\n    // Key: axisDim_axisIndex, value: boolean, whether onZero target.\n    var onZeroRecords = {};\n\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\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\nfunction fixAxisOnZero(axesMap, otherAxisDim, axis, onZeroRecords) {\n\n    axis.getAxesOnZeroOf = function () {\n        // TODO: onZero of multiple axes.\n        return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : [];\n    };\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\n    var otherAxisOnZeroOf;\n    var axisModel = axis.model;\n    var onZero = axisModel.get('axisLine.onZero');\n    var onZeroAxisIndex = axisModel.get('axisLine.onZeroAxisIndex');\n\n    if (!onZero) {\n        return;\n    }\n\n    // If target axis is specified.\n    if (onZeroAxisIndex != null) {\n        if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) {\n            otherAxisOnZeroOf = otherAxes[onZeroAxisIndex];\n        }\n    }\n    else {\n        // Find the first available other axis.\n        for (var idx in otherAxes) {\n            if (otherAxes.hasOwnProperty(idx)\n                && 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            ) {\n                otherAxisOnZeroOf = otherAxes[idx];\n                break;\n            }\n        }\n    }\n\n    if (otherAxisOnZeroOf) {\n        onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true;\n    }\n\n    function getOnZeroRecordKey(axis) {\n        return axis.dim + '_' + axis.index;\n    }\n}\n\nfunction canOnZeroToAxis(axis) {\n    return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis);\n}\n\n/**\n * Resize the grid\n * @param {module:echarts/coord/cartesian/GridModel} gridModel\n * @param {module:echarts/ExtensionAPI} api\n */\ngridProto.resize = function (gridModel, api, ignoreContainLabel) {\n\n    var gridRect = getLayoutRect(\n        gridModel.getBoxLayoutParams(), {\n            width: api.getWidth(),\n            height: api.getHeight()\n        });\n\n    this._rect = gridRect;\n\n    var axesList = this._axesList;\n\n    adjustAxes();\n\n    // Minus label size\n    if (!ignoreContainLabel && gridModel.get('containLabel')) {\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                    }\n                    else if (axis.position === 'left') {\n                        gridRect.x += labelUnionRect.width + margin;\n                    }\n                }\n            }\n        });\n\n        adjustAxes();\n    }\n\n    function adjustAxes() {\n        each(axesList, function (axis) {\n            var isHorizontal = axis.isHorizontal();\n            var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height];\n            var idx = axis.inverse ? 1 : 0;\n            axis.setExtent(extent[idx], extent[1 - idx]);\n            updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y);\n        });\n    }\n};\n\n/**\n * @param {string} axisType\n * @param {number} [axisIndex]\n */\ngridProto.getAxis = function (axisType, axisIndex) {\n    var axesMapOnDim = this._axesMap[axisType];\n    if (axesMapOnDim != null) {\n        if (axisIndex == null) {\n            // Find first axis\n            for (var name in axesMapOnDim) {\n                if (axesMapOnDim.hasOwnProperty(name)) {\n                    return axesMapOnDim[name];\n                }\n            }\n        }\n        return axesMapOnDim[axisIndex];\n    }\n};\n\n/**\n * @return {Array.<module:echarts/coord/Axis>}\n */\ngridProto.getAxes = function () {\n    return this._axesList.slice();\n};\n\n/**\n * Usage:\n *      grid.getCartesian(xAxisIndex, yAxisIndex);\n *      grid.getCartesian(xAxisIndex);\n *      grid.getCartesian(null, yAxisIndex);\n *      grid.getCartesian({xAxisIndex: ..., yAxisIndex: ...});\n *\n * @param {number|Object} [xAxisIndex]\n * @param {number} [yAxisIndex]\n */\ngridProto.getCartesian = function (xAxisIndex, yAxisIndex) {\n    if (xAxisIndex != null && yAxisIndex != null) {\n        var key = 'x' + xAxisIndex + 'y' + yAxisIndex;\n        return this._coordsMap[key];\n    }\n\n    if (isObject(xAxisIndex)) {\n        yAxisIndex = xAxisIndex.yAxisIndex;\n        xAxisIndex = xAxisIndex.xAxisIndex;\n    }\n    // When only xAxisIndex or yAxisIndex given, find its first cartesian.\n    for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) {\n        if (coordList[i].getAxis('x').index === xAxisIndex\n            || coordList[i].getAxis('y').index === yAxisIndex\n        ) {\n            return coordList[i];\n        }\n    }\n};\n\ngridProto.getCartesians = function () {\n    return this._coordsList.slice();\n};\n\n/**\n * @implements\n * see {module:echarts/CoodinateSystem}\n */\ngridProto.convertToPixel = function (ecModel, finder, value) {\n    var target = this._findConvertTarget(ecModel, finder);\n\n    return target.cartesian\n        ? target.cartesian.dataToPoint(value)\n        : target.axis\n        ? target.axis.toGlobalCoord(target.axis.dataToCoord(value))\n        : null;\n};\n\n/**\n * @implements\n * see {module:echarts/CoodinateSystem}\n */\ngridProto.convertFromPixel = function (ecModel, finder, value) {\n    var target = this._findConvertTarget(ecModel, finder);\n\n    return target.cartesian\n        ? target.cartesian.pointToData(value)\n        : target.axis\n        ? target.axis.coordToData(target.axis.toLocalCoord(value))\n        : null;\n};\n\n/**\n * @inner\n */\ngridProto._findConvertTarget = function (ecModel, finder) {\n    var seriesModel = finder.seriesModel;\n    var xAxisModel = finder.xAxisModel\n        || (seriesModel && seriesModel.getReferringComponents('xAxis')[0]);\n    var yAxisModel = finder.yAxisModel\n        || (seriesModel && seriesModel.getReferringComponents('yAxis')[0]);\n    var gridModel = finder.gridModel;\n    var coordsList = this._coordsList;\n    var cartesian;\n    var axis;\n\n    if (seriesModel) {\n        cartesian = seriesModel.coordinateSystem;\n        indexOf(coordsList, cartesian) < 0 && (cartesian = null);\n    }\n    else if (xAxisModel && yAxisModel) {\n        cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n    }\n    else if (xAxisModel) {\n        axis = this.getAxis('x', xAxisModel.componentIndex);\n    }\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\n    return {cartesian: cartesian, axis: axis};\n};\n\n/**\n * @implements\n * see {module:echarts/CoodinateSystem}\n */\ngridProto.containPoint = function (point) {\n    var coord = this._coordsList[0];\n    if (coord) {\n        return coord.containPoint(point);\n    }\n};\n\n/**\n * Initialize cartesian coordinate systems\n * @private\n */\ngridProto._initCartesian = function (gridModel, ecModel, api) {\n    var axisPositionUsed = {\n        left: false,\n        right: false,\n        top: false,\n        bottom: false\n    };\n\n    var axesMap = {\n        x: {},\n        y: {}\n    };\n    var axesCount = {\n        x: 0,\n        y: 0\n    };\n\n    /// Create axis\n    ecModel.eachComponent('xAxis', createAxisCreator('x'), this);\n    ecModel.eachComponent('yAxis', createAxisCreator('y'), this);\n\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\n    this._axesMap = axesMap;\n\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\n            cartesian.grid = this;\n            cartesian.model = gridModel;\n\n            this._coordsMap[key] = cartesian;\n            this._coordsList.push(cartesian);\n\n            cartesian.addAxis(xAxis);\n            cartesian.addAxis(yAxis);\n        }, this);\n    }, this);\n\n    function createAxisCreator(axisType) {\n        return function (axisModel, idx) {\n            if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) {\n                return;\n            }\n\n            var axisPosition = axisModel.get('position');\n            if (axisType === 'x') {\n                // Fix position\n                if (axisPosition !== 'top' && axisPosition !== 'bottom') {\n                    // Default bottom of X\n                    axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom';\n                }\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\n            var axis = new Axis2D(\n                axisType, createScaleByModel(axisModel),\n                [0, 0],\n                axisModel.get('type'),\n                axisPosition\n            );\n\n            var isCategory = axis.type === 'category';\n            axis.onBand = isCategory && axisModel.get('boundaryGap');\n            axis.inverse = axisModel.get('inverse');\n\n            // Inject axis into axisModel\n            axisModel.axis = axis;\n\n            // Inject axisModel into axis\n            axis.model = axisModel;\n\n            // Inject grid info axis\n            axis.grid = this;\n\n            // Index of axis, can be used as key\n            axis.index = idx;\n\n            this._axesList.push(axis);\n\n            axesMap[axisType][idx] = axis;\n            axesCount[axisType]++;\n        };\n    }\n};\n\n/**\n * Update cartesian properties from series\n * @param  {module:echarts/model/Option} option\n * @private\n */\ngridProto._updateScale = function (ecModel, gridModel) {\n    // Reset scale\n    each(this._axesList, function (axis) {\n        axis.scale.setExtent(Infinity, -Infinity);\n    });\n    ecModel.eachSeries(function (seriesModel) {\n        if (isCartesian2D(seriesModel)) {\n            var axesModels = findAxesModels(seriesModel, ecModel);\n            var xAxisModel = axesModels[0];\n            var yAxisModel = axesModels[1];\n\n            if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel)\n                || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel)\n            ) {\n                return;\n            }\n\n            var cartesian = this.getCartesian(\n                xAxisModel.componentIndex, yAxisModel.componentIndex\n            );\n            var data = seriesModel.getData();\n            var xAxis = cartesian.getAxis('x');\n            var yAxis = cartesian.getAxis('y');\n\n            if (data.type === 'list') {\n                unionExtent(data, xAxis, seriesModel);\n                unionExtent(data, yAxis, seriesModel);\n            }\n        }\n    }, this);\n\n    function unionExtent(data, axis, seriesModel) {\n        each(data.mapDimension(axis.dim, true), function (dim) {\n            axis.scale.unionExtentFromData(\n                // For example, the extent of the orginal 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                data, getStackedDimension(data, dim)\n            );\n        });\n    }\n};\n\n/**\n * @param {string} [dim] 'x' or 'y' or 'auto' or null/undefined\n * @return {Object} {baseAxes: [], otherAxes: []}\n */\ngridProto.getTooltipAxes = function (dim) {\n    var baseAxes = [];\n    var otherAxes = [];\n\n    each(this.getCartesians(), function (cartesian) {\n        var baseAxis = (dim != null && dim !== 'auto')\n            ? 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\n    return {baseAxes: baseAxes, otherAxes: otherAxes};\n};\n\n/**\n * @inner\n */\nfunction updateAxisTransform(axis, coordBase) {\n    var axisExtent = axis.getExtent();\n    var axisExtentSum = axisExtent[0] + axisExtent[1];\n\n    // Fast transform\n    axis.toGlobalCoord = axis.dim === 'x'\n        ? function (coord) {\n            return coord + coordBase;\n        }\n        : function (coord) {\n            return axisExtentSum - coord + coordBase;\n        };\n    axis.toLocalCoord = axis.dim === 'x'\n        ? function (coord) {\n            return coord - coordBase;\n        }\n        : function (coord) {\n            return axisExtentSum - coord + coordBase;\n        };\n}\n\nvar axesTypes = ['xAxis', 'yAxis'];\n/**\n * @inner\n */\nfunction findAxesModels(seriesModel, ecModel) {\n    return map(axesTypes, function (axisType) {\n        var axisModel = seriesModel.getReferringComponents(axisType)[0];\n\n        if (__DEV__) {\n            if (!axisModel) {\n                throw new Error(axisType + ' \"' + retrieve(\n                    seriesModel.get(axisType + 'Index'),\n                    seriesModel.get(axisType + 'Id'),\n                    0\n                ) + '\" not found');\n            }\n        }\n        return axisModel;\n    });\n}\n\n/**\n * @inner\n */\nfunction isCartesian2D(seriesModel) {\n    return seriesModel.get('coordinateSystem') === 'cartesian2d';\n}\n\nGrid.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\n        gridModel.coordinateSystem = grid;\n\n        grids.push(grid);\n    });\n\n    // Inject the coordinateSystems into seriesModel\n    ecModel.eachSeries(function (seriesModel) {\n        if (!isCartesian2D(seriesModel)) {\n            return;\n        }\n\n        var axesModels = findAxesModels(seriesModel, ecModel);\n        var xAxisModel = axesModels[0];\n        var yAxisModel = axesModels[1];\n\n        var gridModel = xAxisModel.getCoordSysModel();\n\n        if (__DEV__) {\n            if (!gridModel) {\n                throw new Error(\n                    'Grid \"' + retrieve(\n                        xAxisModel.get('gridIndex'),\n                        xAxisModel.get('gridId'),\n                        0\n                    ) + '\" not found'\n                );\n            }\n            if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) {\n                throw new Error('xAxis and yAxis must use the same grid');\n            }\n        }\n\n        var grid = gridModel.coordinateSystem;\n\n        seriesModel.coordinateSystem = grid.getCartesian(\n            xAxisModel.componentIndex, yAxisModel.componentIndex\n        );\n    });\n\n    return grids;\n};\n\n// For deciding which dimensions to use when creating list data\nGrid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;\n\nCoordinateSystem.register('cartesian2d', Grid);\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\nimport {retrieve, defaults, extend, each} from 'zrender/src/core/util';\nimport * as formatUtil from '../../util/format';\nimport * as graphic from '../../util/graphic';\nimport Model from '../../model/Model';\nimport {isRadianAroundZero, remRadian} from '../../util/number';\nimport {createSymbol} from '../../util/symbol';\nimport * as matrixUtil from 'zrender/src/core/matrix';\nimport {applyTransform as v2ApplyTransform} from 'zrender/src/core/vector';\nimport {shouldShowAllLabels} from '../../coord/axisHelper';\n\n\nvar PI = Math.PI;\n\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 and axis from [0, 0] to [0, axisExtent[1]],\n * for example: (0, 0) ------------> (0, 50)\n *\n * nameDirection or tickDirection or labelDirection is 1 means tick\n * or label is below the standard axis, whereas is -1 means above\n * the standard axis. labelOffset means offset between label and axis,\n * which is useful when 'onZero', where axisLabel is in the grid and\n * label in outside grid.\n *\n * Tips: like always,\n * positive rotation represents anticlockwise, and negative rotation\n * represents clockwise.\n * The direction of position coordinate is the same as the direction\n * of screen coordinate.\n *\n * Do not need to consider axis 'inverse', which is auto processed by\n * axis extent.\n *\n * @param {module:zrender/container/Group} group\n * @param {Object} axisModel\n * @param {Object} opt Standard axis parameters.\n * @param {Array.<number>} opt.position [x, y]\n * @param {number} opt.rotation by radian\n * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle' or 'center'.\n * @param {number} [opt.tickDirection=1] 1 or -1\n * @param {number} [opt.labelDirection=1] 1 or -1\n * @param {number} [opt.labelOffset=0] Usefull when onZero.\n * @param {string} [opt.axisLabelShow] default get from axisModel.\n * @param {string} [opt.axisName] default get from axisModel.\n * @param {number} [opt.axisNameAvailableWidth]\n * @param {number} [opt.labelRotate] by degree, default get from axisModel.\n * @param {number} [opt.strokeContainThreshold] Default label interval when label\n * @param {number} [opt.nameTruncateMaxWidth]\n */\nvar AxisBuilder = function (axisModel, opt) {\n\n    /**\n     * @readOnly\n     */\n    this.opt = opt;\n\n    /**\n     * @readOnly\n     */\n    this.axisModel = axisModel;\n\n    // Default value\n    defaults(\n        opt,\n        {\n            labelOffset: 0,\n            nameDirection: 1,\n            tickDirection: 1,\n            labelDirection: 1,\n            silent: true\n        }\n    );\n\n    /**\n     * @readOnly\n     */\n    this.group = new graphic.Group();\n\n    // FIXME Not use a seperate text group?\n    var dumbGroup = new graphic.Group({\n        position: opt.position.slice(),\n        rotation: opt.rotation\n    });\n\n    // this.group.add(dumbGroup);\n    // this._dumbGroup = dumbGroup;\n\n    dumbGroup.updateTransform();\n    this._transform = dumbGroup.transform;\n\n    this._dumbGroup = dumbGroup;\n};\n\nAxisBuilder.prototype = {\n\n    constructor: AxisBuilder,\n\n    hasBuilder: function (name) {\n        return !!builders[name];\n    },\n\n    add: function (name) {\n        builders[name].call(this);\n    },\n\n    getGroup: function () {\n        return this.group;\n    }\n\n};\n\nvar builders = {\n\n    /**\n     * @private\n     */\n    axisLine: function () {\n        var opt = this.opt;\n        var axisModel = this.axisModel;\n\n        if (!axisModel.get('axisLine.show')) {\n            return;\n        }\n\n        var extent = this.axisModel.axis.getExtent();\n\n        var matrix = this._transform;\n        var pt1 = [extent[0], 0];\n        var pt2 = [extent[1], 0];\n        if (matrix) {\n            v2ApplyTransform(pt1, pt1, matrix);\n            v2ApplyTransform(pt2, pt2, matrix);\n        }\n\n        var lineStyle = extend(\n            {\n                lineCap: 'round'\n            },\n            axisModel.getModel('axisLine.lineStyle').getLineStyle()\n        );\n\n        this.group.add(new graphic.Line({\n            // Id for animation\n            anid: 'line',\n            subPixelOptimize: true,\n            shape: {\n                x1: pt1[0],\n                y1: pt1[1],\n                x2: pt2[0],\n                y2: pt2[1]\n            },\n            style: lineStyle,\n            strokeContainThreshold: opt.strokeContainThreshold || 5,\n            silent: true,\n            z2: 1\n        }));\n\n        var arrows = axisModel.get('axisLine.symbol');\n        var arrowSize = axisModel.get('axisLine.symbolSize');\n\n        var arrowOffset = axisModel.get('axisLine.symbolOffset') || 0;\n        if (typeof arrowOffset === 'number') {\n            arrowOffset = [arrowOffset, arrowOffset];\n        }\n\n        if (arrows != null) {\n            if (typeof arrows === 'string') {\n                // Use the same arrow for start and end point\n                arrows = [arrows, arrows];\n            }\n            if (typeof arrowSize === 'string'\n                || typeof arrowSize === 'number'\n            ) {\n                // Use the same size for width and height\n                arrowSize = [arrowSize, arrowSize];\n            }\n\n            var symbolWidth = arrowSize[0];\n            var symbolHeight = arrowSize[1];\n\n            each([{\n                rotate: opt.rotation + Math.PI / 2,\n                offset: arrowOffset[0],\n                r: 0\n            }, {\n                rotate: opt.rotation - Math.PI / 2,\n                offset: arrowOffset[1],\n                r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0])\n                    + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1]))\n            }], function (point, index) {\n                if (arrows[index] !== 'none' && arrows[index] != null) {\n                    var symbol = createSymbol(\n                        arrows[index],\n                        -symbolWidth / 2,\n                        -symbolHeight / 2,\n                        symbolWidth,\n                        symbolHeight,\n                        lineStyle.stroke,\n                        true\n                    );\n\n                    // Calculate arrow position with offset\n                    var r = point.r + point.offset;\n                    var pos = [\n                        pt1[0] + r * Math.cos(opt.rotation),\n                        pt1[1] - r * Math.sin(opt.rotation)\n                    ];\n\n                    symbol.attr({\n                        rotation: point.rotate,\n                        position: pos,\n                        silent: true,\n                        z2: 11\n                    });\n                    this.group.add(symbol);\n                }\n            }, this);\n        }\n    },\n\n    /**\n     * @private\n     */\n    axisTickLabel: function () {\n        var axisModel = this.axisModel;\n        var opt = this.opt;\n\n        var tickEls = buildAxisTick(this, axisModel, opt);\n        var labelEls = buildAxisLabel(this, axisModel, opt);\n\n        fixMinMaxLabelShow(axisModel, labelEls, tickEls);\n    },\n\n    /**\n     * @private\n     */\n    axisName: function () {\n        var opt = this.opt;\n        var axisModel = this.axisModel;\n        var name = retrieve(opt.axisName, axisModel.get('name'));\n\n        if (!name) {\n            return;\n        }\n\n        var nameLocation = axisModel.get('nameLocation');\n        var nameDirection = opt.nameDirection;\n        var textStyleModel = axisModel.getModel('nameTextStyle');\n        var gap = axisModel.get('nameGap') || 0;\n\n        var extent = this.axisModel.axis.getExtent();\n        var gapSignal = extent[0] > extent[1] ? -1 : 1;\n        var pos = [\n            nameLocation === 'start'\n                ? extent[0] - gapSignal * gap\n                : nameLocation === 'end'\n                ? extent[1] + gapSignal * gap\n                : (extent[0] + extent[1]) / 2, // 'middle'\n            // Reuse labelOffset.\n            isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0\n        ];\n\n        var labelLayout;\n\n        var nameRotation = axisModel.get('nameRotate');\n        if (nameRotation != null) {\n            nameRotation = nameRotation * PI / 180; // To radian.\n        }\n\n        var axisNameAvailableWidth;\n\n        if (isNameLocationCenter(nameLocation)) {\n            labelLayout = innerTextLayout(\n                opt.rotation,\n                nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis.\n                nameDirection\n            );\n        }\n        else {\n            labelLayout = endTextLayout(\n                opt, nameLocation, nameRotation || 0, extent\n            );\n\n            axisNameAvailableWidth = opt.axisNameAvailableWidth;\n            if (axisNameAvailableWidth != null) {\n                axisNameAvailableWidth = Math.abs(\n                    axisNameAvailableWidth / Math.sin(labelLayout.rotation)\n                );\n                !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null);\n            }\n        }\n\n        var textFont = textStyleModel.getFont();\n\n        var truncateOpt = axisModel.get('nameTruncate', true) || {};\n        var ellipsis = truncateOpt.ellipsis;\n        var maxWidth = retrieve(\n            opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth\n        );\n        // FIXME\n        // truncate rich text? (consider performance)\n        var truncatedText = (ellipsis != null && maxWidth != null)\n            ? formatUtil.truncateText(\n                name, maxWidth, textFont, ellipsis,\n                {minChar: 2, placeholder: truncateOpt.placeholder}\n            )\n            : name;\n\n        var tooltipOpt = axisModel.get('tooltip', true);\n\n        var mainType = axisModel.mainType;\n        var formatterParams = {\n            componentType: mainType,\n            name: name,\n            $vars: ['name']\n        };\n        formatterParams[mainType + 'Index'] = axisModel.componentIndex;\n\n        var textEl = new graphic.Text({\n            // Id for animation\n            anid: 'name',\n\n            __fullText: name,\n            __truncatedText: truncatedText,\n\n            position: pos,\n            rotation: labelLayout.rotation,\n            silent: isLabelSilent(axisModel),\n            z2: 1,\n            tooltip: (tooltipOpt && tooltipOpt.show)\n                ? extend({\n                    content: name,\n                    formatter: function () {\n                        return name;\n                    },\n                    formatterParams: formatterParams\n                }, tooltipOpt)\n                : null\n        });\n\n        graphic.setTextStyle(textEl.style, textStyleModel, {\n            text: truncatedText,\n            textFont: textFont,\n            textFill: textStyleModel.getTextColor()\n                || axisModel.get('axisLine.lineStyle.color'),\n            textAlign: textStyleModel.get('align')\n                || labelLayout.textAlign,\n            textVerticalAlign: textStyleModel.get('verticalAlign')\n                || labelLayout.textVerticalAlign\n        });\n\n        if (axisModel.get('triggerEvent')) {\n            textEl.eventData = makeAxisEventDataBase(axisModel);\n            textEl.eventData.targetType = 'axisName';\n            textEl.eventData.name = name;\n        }\n\n        // FIXME\n        this._dumbGroup.add(textEl);\n        textEl.updateTransform();\n\n        this.group.add(textEl);\n\n        textEl.decomposeTransform();\n    }\n\n};\n\nvar makeAxisEventDataBase = 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\n/**\n * @public\n * @static\n * @param {Object} opt\n * @param {number} axisRotation in radian\n * @param {number} textRotation in radian\n * @param {number} direction\n * @return {Object} {\n *  rotation, // according to axis\n *  textAlign,\n *  textVerticalAlign\n * }\n */\nvar innerTextLayout = AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) {\n    var rotationDiff = remRadian(textRotation - axisRotation);\n    var textAlign;\n    var textVerticalAlign;\n\n    if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line.\n        textVerticalAlign = direction > 0 ? 'top' : 'bottom';\n        textAlign = 'center';\n    }\n    else if (isRadianAroundZero(rotationDiff - PI)) { // Label is inverse parallel with axis line.\n        textVerticalAlign = direction > 0 ? 'bottom' : 'top';\n        textAlign = 'center';\n    }\n    else {\n        textVerticalAlign = 'middle';\n\n        if (rotationDiff > 0 && rotationDiff < PI) {\n            textAlign = direction > 0 ? 'right' : 'left';\n        }\n        else {\n            textAlign = direction > 0 ? 'left' : 'right';\n        }\n    }\n\n    return {\n        rotation: rotationDiff,\n        textAlign: textAlign,\n        textVerticalAlign: textVerticalAlign\n    };\n};\n\nfunction endTextLayout(opt, textPosition, textRotate, extent) {\n    var rotationDiff = remRadian(textRotate - opt.rotation);\n    var textAlign;\n    var textVerticalAlign;\n    var inverse = extent[0] > extent[1];\n    var onLeft = (textPosition === 'start' && !inverse)\n        || (textPosition !== 'start' && inverse);\n\n    if (isRadianAroundZero(rotationDiff - PI / 2)) {\n        textVerticalAlign = onLeft ? 'bottom' : 'top';\n        textAlign = 'center';\n    }\n    else if (isRadianAroundZero(rotationDiff - PI * 1.5)) {\n        textVerticalAlign = onLeft ? 'top' : 'bottom';\n        textAlign = 'center';\n    }\n    else {\n        textVerticalAlign = 'middle';\n        if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) {\n            textAlign = onLeft ? 'left' : 'right';\n        }\n        else {\n            textAlign = onLeft ? 'right' : 'left';\n        }\n    }\n\n    return {\n        rotation: rotationDiff,\n        textAlign: textAlign,\n        textVerticalAlign: textVerticalAlign\n    };\n}\n\nvar isLabelSilent = AxisBuilder.isLabelSilent = function (axisModel) {\n    var tooltipOpt = axisModel.get('tooltip');\n    return axisModel.get('silent')\n        // Consider mouse cursor, add these restrictions.\n        || !(\n            axisModel.get('triggerEvent') || (tooltipOpt && tooltipOpt.show)\n        );\n};\n\nfunction fixMinMaxLabelShow(axisModel, labelEls, tickEls) {\n    if (shouldShowAllLabels(axisModel.axis)) {\n        return;\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\n    // FIXME\n    // Have not consider onBand yet, where tick els is more than label els.\n\n    labelEls = labelEls || [];\n    tickEls = tickEls || [];\n\n    var firstLabel = labelEls[0];\n    var nextLabel = labelEls[1];\n    var lastLabel = labelEls[labelEls.length - 1];\n    var prevLabel = labelEls[labelEls.length - 2];\n\n    var firstTick = tickEls[0];\n    var nextTick = tickEls[1];\n    var lastTick = tickEls[tickEls.length - 1];\n    var prevTick = tickEls[tickEls.length - 2];\n\n    if (showMinLabel === false) {\n        ignoreEl(firstLabel);\n        ignoreEl(firstTick);\n    }\n    else if (isTwoLabelOverlapped(firstLabel, nextLabel)) {\n        if (showMinLabel) {\n            ignoreEl(nextLabel);\n            ignoreEl(nextTick);\n        }\n        else {\n            ignoreEl(firstLabel);\n            ignoreEl(firstTick);\n        }\n    }\n\n    if (showMaxLabel === false) {\n        ignoreEl(lastLabel);\n        ignoreEl(lastTick);\n    }\n    else if (isTwoLabelOverlapped(prevLabel, lastLabel)) {\n        if (showMaxLabel) {\n            ignoreEl(prevLabel);\n            ignoreEl(prevTick);\n        }\n        else {\n            ignoreEl(lastLabel);\n            ignoreEl(lastTick);\n        }\n    }\n}\n\nfunction ignoreEl(el) {\n    el && (el.ignore = true);\n}\n\nfunction isTwoLabelOverlapped(current, next, labelLayout) {\n    // current and next has the same rotation.\n    var firstRect = current && current.getBoundingRect().clone();\n    var nextRect = next && next.getBoundingRect().clone();\n\n    if (!firstRect || !nextRect) {\n        return;\n    }\n\n    // When checking intersect of two rotated labels, we use mRotationBack\n    // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`.\n    var mRotationBack = matrixUtil.identity([]);\n    matrixUtil.rotate(mRotationBack, mRotationBack, -current.rotation);\n\n    firstRect.applyTransform(matrixUtil.mul([], mRotationBack, current.getLocalTransform()));\n    nextRect.applyTransform(matrixUtil.mul([], mRotationBack, next.getLocalTransform()));\n\n    return firstRect.intersect(nextRect);\n}\n\nfunction isNameLocationCenter(nameLocation) {\n    return nameLocation === 'middle' || nameLocation === 'center';\n}\n\nfunction buildAxisTick(axisBuilder, axisModel, opt) {\n    var axis = axisModel.axis;\n\n    if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {\n        return;\n    }\n\n    var tickModel = axisModel.getModel('axisTick');\n\n    var lineStyleModel = tickModel.getModel('lineStyle');\n    var tickLen = tickModel.get('length');\n\n    var ticksCoords = axis.getTicksCoords();\n\n    var pt1 = [];\n    var pt2 = [];\n    var matrix = axisBuilder._transform;\n\n    var tickEls = [];\n\n    for (var i = 0; i < ticksCoords.length; i++) {\n        var tickCoord = ticksCoords[i].coord;\n\n        pt1[0] = tickCoord;\n        pt1[1] = 0;\n        pt2[0] = tickCoord;\n        pt2[1] = opt.tickDirection * tickLen;\n\n        if (matrix) {\n            v2ApplyTransform(pt1, pt1, matrix);\n            v2ApplyTransform(pt2, pt2, matrix);\n        }\n        // Tick line, Not use group transform to have better line draw\n        var tickEl = new graphic.Line({\n            // Id for animation\n            anid: 'tick_' + ticksCoords[i].tickValue,\n            subPixelOptimize: true,\n            shape: {\n                x1: pt1[0],\n                y1: pt1[1],\n                x2: pt2[0],\n                y2: pt2[1]\n            },\n            style: defaults(\n                lineStyleModel.getLineStyle(),\n                {\n                    stroke: axisModel.get('axisLine.lineStyle.color')\n                }\n            ),\n            z2: 2,\n            silent: true\n        });\n        axisBuilder.group.add(tickEl);\n        tickEls.push(tickEl);\n    }\n\n    return tickEls;\n}\n\nfunction buildAxisLabel(axisBuilder, axisModel, opt) {\n    var axis = axisModel.axis;\n    var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));\n\n    if (!show || axis.scale.isBlank()) {\n        return;\n    }\n\n    var labelModel = axisModel.getModel('axisLabel');\n    var labelMargin = labelModel.get('margin');\n    var labels = axis.getViewLabels();\n\n    // Special label rotate.\n    var labelRotation = (\n        retrieve(opt.labelRotate, labelModel.get('rotate')) || 0\n    ) * PI / 180;\n\n    var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);\n    var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true);\n\n    var labelEls = [];\n    var silent = isLabelSilent(axisModel);\n    var triggerEvent = axisModel.get('triggerEvent');\n\n    each(labels, function (labelItem, index) {\n        var tickValue = labelItem.tickValue;\n        var formattedLabel = labelItem.formattedLabel;\n        var rawLabel = labelItem.rawLabel;\n\n        var itemLabelModel = labelModel;\n        if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) {\n            itemLabelModel = new Model(\n                rawCategoryData[tickValue].textStyle, labelModel, axisModel.ecModel\n            );\n        }\n\n        var textColor = itemLabelModel.getTextColor()\n            || axisModel.get('axisLine.lineStyle.color');\n\n        var tickCoord = axis.dataToCoord(tickValue);\n        var pos = [\n            tickCoord,\n            opt.labelOffset + opt.labelDirection * labelMargin\n        ];\n\n        var textEl = new graphic.Text({\n            // Id for animation\n            anid: 'label_' + tickValue,\n            position: pos,\n            rotation: labelLayout.rotation,\n            silent: silent,\n            z2: 10\n        });\n\n        graphic.setTextStyle(textEl.style, itemLabelModel, {\n            text: formattedLabel,\n            textAlign: itemLabelModel.getShallow('align', true)\n                || labelLayout.textAlign,\n            textVerticalAlign: itemLabelModel.getShallow('verticalAlign', true)\n                || itemLabelModel.getShallow('baseline', true)\n                || labelLayout.textVerticalAlign,\n            textFill: typeof textColor === 'function'\n                ? 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 repalce ','. So we modify it to return original val but remain\n                    // it as 'string' to avoid error in replacing.\n                    axis.type === 'category'\n                        ? rawLabel\n                        : axis.type === 'value'\n                        ? tickValue + ''\n                        : tickValue,\n                    index\n                )\n                : textColor\n        });\n\n        // Pack data for mouse event\n        if (triggerEvent) {\n            textEl.eventData = makeAxisEventDataBase(axisModel);\n            textEl.eventData.targetType = 'axisLabel';\n            textEl.eventData.value = rawLabel;\n        }\n\n        // FIXME\n        axisBuilder._dumbGroup.add(textEl);\n        textEl.updateTransform();\n\n        labelEls.push(textEl);\n        axisBuilder.group.add(textEl);\n\n        textEl.decomposeTransform();\n\n    });\n\n    return labelEls;\n}\n\n\nexport default AxisBuilder;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Model from '../../model/Model';\n\nvar each = zrUtil.each;\nvar curry = zrUtil.curry;\n\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         *      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\n    collectAxesInfo(result, ecModel, api);\n\n    // Check seriesInvolved for performance, in case too many series in some chart.\n    result.seriesInvolved && collectSeriesInfo(result, ecModel);\n\n    return result;\n}\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\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\n        var coordSysKey = makeKey(coordSys.model);\n        var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {};\n        result.coordSysMap[coordSysKey] = coordSys;\n\n        // Set tooltip (like 'cross') is a convienent way to show axisPointer\n        // for user. So we enable seting tooltip on coordSys model.\n        var coordSysModel = coordSys.model;\n        var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel);\n\n        each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null));\n\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\n            && 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        ) {\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(\n                    saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis\n                ));\n            }\n            if (cross) {\n                each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false));\n            }\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\n            var axisPointerShow = axisPointerModel.get('show');\n            if (!axisPointerShow || (\n                axisPointerShow === 'auto'\n                && !fromTooltip\n                && !isHandleTrigger(axisPointerModel)\n            )) {\n                return;\n            }\n\n            if (triggerTooltip == null) {\n                triggerTooltip = axisPointerModel.get('triggerTooltip');\n            }\n\n            axisPointerModel = fromTooltip\n                ? makeAxisPointerModel(\n                    axis, baseTooltipModel, globalAxisPointerModel, ecModel,\n                    fromTooltip, triggerTooltip\n                )\n                : axisPointerModel;\n\n            var snap = axisPointerModel.get('snap');\n            var key = makeKey(axis.model);\n            var involveSeries = triggerTooltip || snap || axis.type === 'category';\n\n            // If result.axesInfo[key] exist, override it (tooltip has higher priority).\n            var axisInfo = result.axesInfo[key] = {\n                key: key,\n                axis: axis,\n                coordSys: coordSys,\n                axisPointerModel: axisPointerModel,\n                triggerTooltip: triggerTooltip,\n                involveSeries: involveSeries,\n                snap: snap,\n                useHandle: isHandleTrigger(axisPointerModel),\n                seriesModels: []\n            };\n            axesInfoInCoordSys[key] = axisInfo;\n            result.seriesInvolved |= involveSeries;\n\n            var groupIndex = getLinkGroupIndex(linksOption, axis);\n            if (groupIndex != null) {\n                var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {axesInfo: {}});\n                linkGroup.axesInfo[key] = axisInfo;\n                linkGroup.mapper = linksOption[groupIndex].mapper;\n                axisInfo.linkGroup = linkGroup;\n            }\n        }\n    });\n}\n\nfunction makeAxisPointerModel(\n    axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip\n) {\n    var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer');\n    var volatileOption = {};\n\n    each(\n        [\n            'type', 'snap', 'lineStyle', 'shadowStyle', 'label',\n            'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z'\n        ],\n        function (field) {\n            volatileOption[field] = zrUtil.clone(tooltipAxisPointerModel.get(field));\n        }\n    );\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\n    // Compatibel with previous behavior, tooltip axis do not show label by default.\n    // Only these properties can be overrided 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\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 && zrUtil.defaults(labelOption, crossStyle.textStyle);\n        }\n    }\n\n    return axis.model.getModel(\n        'axisPointer',\n        new Model(volatileOption, globalAxisPointerModel, ecModel)\n    );\n}\n\nfunction collectSeriesInfo(result, ecModel) {\n    // Prepare data for axis trigger\n    ecModel.eachSeries(function (seriesModel) {\n\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\n            || seriesTooltipTrigger === 'none'\n            || seriesTooltipTrigger === false\n            || seriesTooltipTrigger === 'item'\n            || seriesTooltipShow === false\n            || seriesModel.get('axisPointer.show', true) === false\n        ) {\n            return;\n        }\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    }, this);\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)\n            || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex)\n            || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)\n        ) {\n            return i;\n        }\n    }\n}\n\nfunction checkPropInLink(linkPropValue, axisPropValue) {\n    return linkPropValue === 'all'\n        || (zrUtil.isArray(linkPropValue) && zrUtil.indexOf(linkPropValue, axisPropValue) >= 0)\n        || linkPropValue === axisPropValue;\n}\n\nexport function fixValue(axisModel) {\n    var axisInfo = getAxisInfo(axisModel);\n    if (!axisInfo) {\n        return;\n    }\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\n    // Parse init value for category and time axis.\n    if (value != null) {\n        value = scale.parse(value);\n    }\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\n    var extent = scale.getExtent().slice();\n    extent[0] > extent[1] && extent.reverse();\n\n    if (// 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    ) {\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\n    option.value = value;\n\n    if (useHandle) {\n        option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show';\n    }\n}\n\nexport function getAxisInfo(axisModel) {\n    var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo;\n    return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)];\n}\n\nexport function getAxisPointerModel(axisModel) {\n    var axisInfo = getAxisInfo(axisModel);\n    return axisInfo && axisInfo.axisPointerModel;\n}\n\nfunction isHandleTrigger(axisPointerModel) {\n    return !!axisPointerModel.get('handle.show');\n}\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\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as axisPointerModelHelper from '../axisPointer/modelHelper';\n\n/**\n * Base class of AxisView.\n */\nvar AxisView = echarts.extendComponentView({\n\n    type: 'axis',\n\n    /**\n     * @private\n     */\n    _axisPointer: null,\n\n    /**\n     * @protected\n     * @type {string}\n     */\n    axisPointerClass: null,\n\n    /**\n     * @override\n     */\n    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\n        AxisView.superApply(this, 'render', arguments);\n\n        updateAxisPointer(this, axisModel, ecModel, api, payload, true);\n    },\n\n    /**\n     * Action handler.\n     * @public\n     * @param {module:echarts/coord/cartesian/AxisModel} axisModel\n     * @param {module:echarts/model/Global} ecModel\n     * @param {module:echarts/ExtensionAPI} api\n     * @param {Object} payload\n     */\n    updateAxisPointer: function (axisModel, ecModel, api, payload, force) {\n        updateAxisPointer(this, axisModel, ecModel, api, payload, false);\n    },\n\n    /**\n     * @override\n     */\n    remove: function (ecModel, api) {\n        var axisPointer = this._axisPointer;\n        axisPointer && axisPointer.remove(api);\n        AxisView.superApply(this, 'remove', arguments);\n    },\n\n    /**\n     * @override\n     */\n    dispose: function (ecModel, api) {\n        disposeAxisPointer(this, api);\n        AxisView.superApply(this, 'dispose', arguments);\n    }\n\n});\n\nfunction updateAxisPointer(axisView, axisModel, ecModel, api, payload, forceRender) {\n    var Clazz = AxisView.getAxisPointerClass(axisView.axisPointerClass);\n    if (!Clazz) {\n        return;\n    }\n    var axisPointerModel = axisPointerModelHelper.getAxisPointerModel(axisModel);\n    axisPointerModel\n        ? (axisView._axisPointer || (axisView._axisPointer = new Clazz()))\n            .render(axisModel, axisPointerModel, api, forceRender)\n        : disposeAxisPointer(axisView, api);\n}\n\nfunction disposeAxisPointer(axisView, ecModel, api) {\n    var axisPointer = axisView._axisPointer;\n    axisPointer && axisPointer.dispose(ecModel, api);\n    axisView._axisPointer = null;\n}\n\nvar axisPointerClazz = [];\n\nAxisView.registerAxisPointerClass = function (type, clazz) {\n    if (__DEV__) {\n        if (axisPointerClazz[type]) {\n            throw new Error('axisPointer ' + type + ' exists');\n        }\n    }\n    axisPointerClazz[type] = clazz;\n};\n\nAxisView.getAxisPointerClass = function (type) {\n    return type && axisPointerClazz[type];\n};\n\nexport default AxisView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\n/**\n * Can only be called after coordinate system creation stage.\n * (Can be called before coordinate system update stage).\n *\n * @param {Object} opt {labelInside}\n * @return {Object} {\n *  position, rotation, labelDirection, labelOffset,\n *  tickDirection, labelRotate, z2\n * }\n */\nexport function layout(gridModel, axisModel, opt) {\n    opt = opt || {};\n    var grid = gridModel.coordinateSystem;\n    var axis = axisModel.axis;\n    var layout = {};\n    var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0];\n\n    var rawAxisPosition = axis.position;\n    var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition;\n    var axisDim = axis.dim;\n\n    var rect = grid.getRect();\n    var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n    var idx = {left: 0, right: 1, top: 0, bottom: 1, onZero: 2};\n    var axisOffset = axisModel.get('offset') || 0;\n\n    var posBound = axisDim === 'x'\n        ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset]\n        : [rectBound[0] - axisOffset, rectBound[1] + axisOffset];\n\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\n    // Axis position\n    layout.position = [\n        axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0],\n        axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]\n    ];\n\n    // Axis rotation\n    layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1);\n\n    // Tick and label direction, x y is axisDim\n    var dirMap = {top: -1, bottom: 1, left: -1, right: 1};\n\n    layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];\n    layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0;\n\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\n    // Special label rotation\n    var labelRotate = axisModel.get('axisLabel.rotate');\n    layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate;\n\n    // Over splitLine and splitArea\n    layout.z2 = 1;\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport AxisBuilder from './AxisBuilder';\nimport AxisView from './AxisView';\nimport * as cartesianAxisHelper from '../../coord/cartesian/cartesianAxisHelper';\n\nvar axisBuilderAttrs = [\n    'axisLine', 'axisTickLabel', 'axisName'\n];\nvar selfBuilderAttrs = [\n    'splitArea', 'splitLine'\n];\n\n// function getAlignWithLabel(model, axisModel) {\n//     var alignWithLabel = model.get('alignWithLabel');\n//     if (alignWithLabel === 'auto') {\n//         alignWithLabel = axisModel.get('axisTick.alignWithLabel');\n//     }\n//     return alignWithLabel;\n// }\n\nvar CartesianAxisView = AxisView.extend({\n\n    type: 'cartesianAxis',\n\n    axisPointerClass: 'CartesianAxisPointer',\n\n    /**\n     * @override\n     */\n    render: function (axisModel, ecModel, api, payload) {\n\n        this.group.removeAll();\n\n        var oldAxisGroup = this._axisGroup;\n        this._axisGroup = new graphic.Group();\n\n        this.group.add(this._axisGroup);\n\n        if (!axisModel.get('show')) {\n            return;\n        }\n\n        var gridModel = axisModel.getCoordSysModel();\n\n        var layout = cartesianAxisHelper.layout(gridModel, axisModel);\n\n        var axisBuilder = new AxisBuilder(axisModel, layout);\n\n        zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\n        this._axisGroup.add(axisBuilder.getGroup());\n\n        zrUtil.each(selfBuilderAttrs, function (name) {\n            if (axisModel.get(name + '.show')) {\n                this['_' + name](axisModel, gridModel);\n            }\n        }, this);\n\n        graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n\n        CartesianAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);\n    },\n\n    remove: function () {\n        this._splitAreaColors = null;\n    },\n\n    /**\n     * @param {module:echarts/coord/cartesian/AxisModel} axisModel\n     * @param {module:echarts/coord/cartesian/GridModel} gridModel\n     * @private\n     */\n    _splitLine: function (axisModel, gridModel) {\n        var axis = axisModel.axis;\n\n        if (axis.scale.isBlank()) {\n            return;\n        }\n\n        var splitLineModel = axisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n\n        lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors];\n\n        var gridRect = gridModel.coordinateSystem.getRect();\n        var isHorizontal = axis.isHorizontal();\n\n        var lineCount = 0;\n\n        var ticksCoords = axis.getTicksCoords({\n            tickModel: splitLineModel\n        });\n\n        var p1 = [];\n        var p2 = [];\n\n        // Simple optimization\n        // Batching the lines if color are the same\n        var lineStyle = lineStyleModel.getLineStyle();\n        for (var i = 0; i < ticksCoords.length; i++) {\n            var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n\n            if (isHorizontal) {\n                p1[0] = tickCoord;\n                p1[1] = gridRect.y;\n                p2[0] = tickCoord;\n                p2[1] = gridRect.y + gridRect.height;\n            }\n            else {\n                p1[0] = gridRect.x;\n                p1[1] = tickCoord;\n                p2[0] = gridRect.x + gridRect.width;\n                p2[1] = tickCoord;\n            }\n\n            var colorIndex = (lineCount++) % lineColors.length;\n            var tickValue = ticksCoords[i].tickValue;\n            this._axisGroup.add(new graphic.Line({\n                anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null,\n                subPixelOptimize: 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        }\n    },\n\n    /**\n     * @param {module:echarts/coord/cartesian/AxisModel} axisModel\n     * @param {module:echarts/coord/cartesian/GridModel} gridModel\n     * @private\n     */\n    _splitArea: function (axisModel, gridModel) {\n        var axis = axisModel.axis;\n\n        if (axis.scale.isBlank()) {\n            return;\n        }\n\n        var splitAreaModel = axisModel.getModel('splitArea');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var areaColors = areaStyleModel.get('color');\n\n        var gridRect = gridModel.coordinateSystem.getRect();\n\n        var ticksCoords = axis.getTicksCoords({\n            tickModel: splitAreaModel,\n            clamp: true\n        });\n\n        if (!ticksCoords.length) {\n            return;\n        }\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 = this._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\n        var prev = axis.toGlobalCoord(ticksCoords[0].coord);\n\n        var areaStyle = areaStyleModel.getAreaStyle();\n        areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors];\n\n        for (var i = 1; i < ticksCoords.length; i++) {\n            var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n\n            var x;\n            var y;\n            var width;\n            var height;\n            if (axis.isHorizontal()) {\n                x = prev;\n                y = gridRect.y;\n                width = tickCoord - x;\n                height = gridRect.height;\n                prev = x + width;\n            }\n            else {\n                x = gridRect.x;\n                y = prev;\n                width = gridRect.width;\n                height = tickCoord - y;\n                prev = y + height;\n            }\n\n            var tickValue = ticksCoords[i - 1].tickValue;\n            tickValue != null && newSplitAreaColors.set(tickValue, colorIndex);\n\n            this._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                silent: true\n            }));\n\n            colorIndex = (colorIndex + 1) % areaColorsLen;\n        }\n\n        this._splitAreaColors = newSplitAreaColors;\n    }\n});\n\nCartesianAxisView.extend({\n    type: 'xAxis'\n});\nCartesianAxisView.extend({\n    type: 'yAxis'\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/cartesian/AxisModel';\nimport './axis/CartesianAxisView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../util/graphic';\n\nimport '../coord/cartesian/Grid';\nimport './axis';\n\n// Grid view\necharts.extendComponentView({\n\n    type: 'grid',\n\n    render: function (gridModel, ecModel) {\n        this.group.removeAll();\n        if (gridModel.get('show')) {\n            this.group.add(new graphic.Rect({\n                shape: gridModel.coordinateSystem.getRect(),\n                style: zrUtil.defaults({\n                    fill: gridModel.get('backgroundColor')\n                }, gridModel.getItemStyle()),\n                silent: true,\n                z2: -1\n            }));\n        }\n    }\n\n});\n\necharts.registerPreprocessor(function (option) {\n    // Only create grid when need\n    if (option.xAxis && option.yAxis && !option.grid) {\n        option.grid = {};\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './line/LineSeries';\nimport './line/LineView';\nimport visualSymbol from '../visual/symbol';\nimport layoutPoints from '../layout/points';\nimport dataSample from '../processor/dataSample';\n\n// In case developer forget to include grid component\nimport '../component/gridSimple';\n\necharts.registerVisual(visualSymbol('line', 'circle', 'line'));\necharts.registerLayout(layoutPoints('line'));\n\n// Down sample after filter\necharts.registerProcessor(\n    echarts.PRIORITY.PROCESSOR.STATISTIC,\n    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\nimport SeriesModel from '../../model/Series';\nimport createListFromArray from '../helper/createListFromArray';\n\nexport default SeriesModel.extend({\n\n    type: 'series.__base_bar__',\n\n    getInitialData: function (option, ecModel) {\n        return createListFromArray(this.getSource(), this);\n    },\n\n    getMarkerPosition: function (value) {\n        var coordSys = this.coordinateSystem;\n        if (coordSys) {\n            // PENDING if clamp ?\n            var pt = coordSys.dataToPoint(coordSys.clampData(value));\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[offsetIndex] += offset + size / 2;\n            return pt;\n        }\n        return [NaN, NaN];\n    },\n\n    defaultOption: {\n        zlevel: 0,                  // 一级层叠\n        z: 2,                       // 二级层叠\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n        // stack: null\n\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // 最小高度改为0\n        barMinHeight: 0,\n        // 最小角度为0，仅对极坐标系下的柱状图有效\n        barMinAngle: 0,\n        // cursor: null,\n\n        large: false,\n        largeThreshold: 400,\n        progressive: 3e3,\n        progressiveChunkMode: 'mod',\n\n        // barMaxWidth: null,\n        // 默认自适应\n        // barWidth: null,\n        // 柱间距离，默认为柱形宽度的30%，可设固定值\n        // barGap: '30%',\n        // 类目间柱形距离，默认为类目间距的20%，可设固定值\n        // barCategoryGap: '20%',\n        // label: {\n        //      show: false\n        // },\n        itemStyle: {},\n        emphasis: {}\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport BaseBarSeries from './BaseBarSeries';\n\nexport default BaseBarSeries.extend({\n\n    type: 'series.bar',\n\n    dependencies: ['grid', 'polar'],\n\n    brushSelector: 'rect',\n\n    /**\n     * @override\n     */\n    getProgressive: function () {\n        // Do not support progressive in normal mode.\n        return this.get('large')\n            ? this.get('progressive')\n            : false;\n    },\n\n    /**\n     * @override\n     */\n    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\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as graphic from '../../util/graphic';\nimport {getDefaultLabel} from '../helper/labelHelper';\n\nexport function setLabel(\n    normalStyle, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside\n) {\n    var labelModel = itemModel.getModel('label');\n    var hoverLabelModel = itemModel.getModel('emphasis.label');\n\n    graphic.setLabelStyle(\n        normalStyle, hoverStyle, labelModel, hoverLabelModel,\n        {\n            labelFetcher: seriesModel,\n            labelDataIndex: dataIndex,\n            defaultText: getDefaultLabel(seriesModel.getData(), dataIndex),\n            isRectText: true,\n            autoColor: color\n        }\n    );\n\n    fixPosition(normalStyle);\n    fixPosition(hoverStyle);\n}\n\nfunction fixPosition(style, labelPositionOutside) {\n    if (style.textPosition === 'outside') {\n        style.textPosition = labelPositionOutside;\n    }\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport makeStyleMapper from '../../model/mixin/makeStyleMapper';\n\nvar getBarItemStyle = makeStyleMapper(\n    [\n        ['fill', 'color'],\n        ['stroke', 'borderColor'],\n        ['lineWidth', 'borderWidth'],\n        // Compatitable with 2\n        ['stroke', 'barBorderColor'],\n        ['lineWidth', 'barBorderWidth'],\n        ['opacity'],\n        ['shadowBlur'],\n        ['shadowOffsetX'],\n        ['shadowOffsetY'],\n        ['shadowColor']\n    ]\n);\n\nexport default {\n    getBarItemStyle: function (excludes) {\n        var style = getBarItemStyle(this, excludes);\n        if (this.getBorderLineDash) {\n            var lineDash = this.getBorderLineDash();\n            lineDash && (style.lineDash = lineDash);\n        }\n        return 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\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport {setLabel} from './helper';\nimport Model from '../../model/Model';\nimport barItemStyle from './barItemStyle';\nimport Path from 'zrender/src/graphic/Path';\nimport {throttle} from '../../util/throttle';\n\nvar BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'barBorderWidth'];\nvar _eventPos = [0, 0];\n\n// FIXME\n// Just for compatible with ec2.\nzrUtil.extend(Model.prototype, barItemStyle);\n\nexport default echarts.extendChartView({\n\n    type: 'bar',\n\n    render: function (seriesModel, ecModel, api) {\n        this._updateDrawMode(seriesModel);\n\n        var coordinateSystemType = seriesModel.get('coordinateSystem');\n\n        if (coordinateSystemType === 'cartesian2d'\n            || coordinateSystemType === 'polar'\n        ) {\n            this._isLargeDraw\n                ? this._renderLarge(seriesModel, ecModel, api)\n                : this._renderNormal(seriesModel, ecModel, api);\n        }\n        else if (__DEV__) {\n            console.warn('Only cartesian2d and polar supported for bar.');\n        }\n\n        return this.group;\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        this._clear();\n        this._updateDrawMode(seriesModel);\n    },\n\n    incrementalRender: function (params, seriesModel, ecModel, api) {\n        // Do not support progressive in normal mode.\n        this._incrementalRenderLarge(params, seriesModel);\n    },\n\n    _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\n    _renderNormal: function (seriesModel, ecModel, api) {\n        var group = this.group;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n\n        var coord = seriesModel.coordinateSystem;\n        var baseAxis = coord.getBaseAxis();\n        var isHorizontalOrRadial;\n\n        if (coord.type === 'cartesian2d') {\n            isHorizontalOrRadial = baseAxis.isHorizontal();\n        }\n        else if (coord.type === 'polar') {\n            isHorizontalOrRadial = baseAxis.dim === 'angle';\n        }\n\n        var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;\n\n        data.diff(oldData)\n            .add(function (dataIndex) {\n                if (!data.hasValue(dataIndex)) {\n                    return;\n                }\n\n                var itemModel = data.getItemModel(dataIndex);\n                var layout = getLayout[coord.type](data, dataIndex, itemModel);\n                var el = elementCreator[coord.type](\n                    data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel\n                );\n                data.setItemGraphicEl(dataIndex, el);\n                group.add(el);\n\n                updateStyle(\n                    el, data, dataIndex, itemModel, layout,\n                    seriesModel, isHorizontalOrRadial, coord.type === 'polar'\n                );\n            })\n            .update(function (newIndex, oldIndex) {\n                var el = oldData.getItemGraphicEl(oldIndex);\n\n                if (!data.hasValue(newIndex)) {\n                    group.remove(el);\n                    return;\n                }\n\n                var itemModel = data.getItemModel(newIndex);\n                var layout = getLayout[coord.type](data, newIndex, itemModel);\n\n                if (el) {\n                    graphic.updateProps(el, {shape: layout}, animationModel, newIndex);\n                }\n                else {\n                    el = elementCreator[coord.type](\n                        data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true\n                    );\n                }\n\n                data.setItemGraphicEl(newIndex, el);\n                // Add back\n                group.add(el);\n\n                updateStyle(\n                    el, data, newIndex, itemModel, layout,\n                    seriesModel, isHorizontalOrRadial, coord.type === 'polar'\n                );\n            })\n            .remove(function (dataIndex) {\n                var el = oldData.getItemGraphicEl(dataIndex);\n                if (coord.type === 'cartesian2d') {\n                    el && removeRect(dataIndex, animationModel, el);\n                }\n                else {\n                    el && removeSector(dataIndex, animationModel, el);\n                }\n            })\n            .execute();\n\n        this._data = data;\n    },\n\n    _renderLarge: function (seriesModel, ecModel, api) {\n        this._clear();\n        createLarge(seriesModel, this.group);\n    },\n\n    _incrementalRenderLarge: function (params, seriesModel) {\n        createLarge(seriesModel, this.group, true);\n    },\n\n    dispose: zrUtil.noop,\n\n    remove: function (ecModel) {\n        this._clear(ecModel);\n    },\n\n    _clear: function (ecModel) {\n        var group = this.group;\n        var data = this._data;\n        if (ecModel && ecModel.get('animation') && data && !this._isLargeDraw) {\n            data.eachItemGraphicEl(function (el) {\n                if (el.type === 'sector') {\n                    removeSector(el.dataIndex, ecModel, el);\n                }\n                else {\n                    removeRect(el.dataIndex, ecModel, el);\n                }\n            });\n        }\n        else {\n            group.removeAll();\n        }\n        this._data = null;\n    }\n\n});\n\nvar elementCreator = {\n\n    cartesian2d: function (\n        data, dataIndex, itemModel, layout, isHorizontal,\n        animationModel, isUpdate\n    ) {\n        var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});\n\n        // Animation\n        if (animationModel) {\n            var rectShape = rect.shape;\n            var animateProperty = isHorizontal ? 'height' : 'width';\n            var animateTarget = {};\n            rectShape[animateProperty] = 0;\n            animateTarget[animateProperty] = layout[animateProperty];\n            graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {\n                shape: animateTarget\n            }, animationModel, dataIndex);\n        }\n\n        return rect;\n    },\n\n    polar: function (\n        data, dataIndex, itemModel, layout, isRadial,\n        animationModel, isUpdate\n    ) {\n        // Keep the same logic with bar in catesion: use end value to control\n        // direction. Notice that if clockwise is true (by default), the sector\n        // will always draw clockwisely, no matter whether endAngle is greater\n        // or less than startAngle.\n        var clockwise = layout.startAngle < layout.endAngle;\n        var sector = new graphic.Sector({\n            shape: zrUtil.defaults({clockwise: clockwise}, layout)\n        });\n\n        // Animation\n        if (animationModel) {\n            var sectorShape = sector.shape;\n            var animateProperty = isRadial ? 'r' : 'endAngle';\n            var animateTarget = {};\n            sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;\n            animateTarget[animateProperty] = layout[animateProperty];\n            graphic[isUpdate ? 'updateProps' : 'initProps'](sector, {\n                shape: animateTarget\n            }, animationModel, dataIndex);\n        }\n\n        return sector;\n    }\n};\n\nfunction removeRect(dataIndex, animationModel, el) {\n    // Not show text when animating\n    el.style.text = null;\n    graphic.updateProps(el, {\n        shape: {\n            width: 0\n        }\n    }, animationModel, dataIndex, function () {\n        el.parent && el.parent.remove(el);\n    });\n}\n\nfunction removeSector(dataIndex, animationModel, el) {\n    // Not show text when animating\n    el.style.text = null;\n    graphic.updateProps(el, {\n        shape: {\n            r: el.shape.r0\n        }\n    }, animationModel, dataIndex, function () {\n        el.parent && el.parent.remove(el);\n    });\n}\n\nvar getLayout = {\n    cartesian2d: function (data, dataIndex, itemModel) {\n        var layout = data.getItemLayout(dataIndex);\n        var fixedLineWidth = getLineWidth(itemModel, layout);\n\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\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        };\n    }\n};\n\nfunction updateStyle(\n    el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar\n) {\n    var color = data.getItemVisual(dataIndex, 'color');\n    var opacity = data.getItemVisual(dataIndex, 'opacity');\n    var itemStyleModel = itemModel.getModel('itemStyle');\n    var hoverStyle = itemModel.getModel('emphasis.itemStyle').getBarItemStyle();\n\n    if (!isPolar) {\n        el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);\n    }\n\n    el.useStyle(zrUtil.defaults(\n        {\n            fill: color,\n            opacity: opacity\n        },\n        itemStyleModel.getBarItemStyle()\n    ));\n\n    var cursorStyle = itemModel.getShallow('cursor');\n    cursorStyle && el.attr('cursor', cursorStyle);\n\n    var labelPositionOutside = isHorizontal\n        ? (layout.height > 0 ? 'bottom' : 'top')\n        : (layout.width > 0 ? 'left' : 'right');\n\n    if (!isPolar) {\n        setLabel(\n            el.style, hoverStyle, itemModel, color,\n            seriesModel, dataIndex, labelPositionOutside\n        );\n    }\n\n    graphic.setHoverStyle(el, hoverStyle);\n}\n\n// In case width or height are too small.\nfunction getLineWidth(itemModel, rawLayout) {\n    var lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;\n    return Math.min(lineWidth, Math.abs(rawLayout.width), Math.abs(rawLayout.height));\n}\n\n\nvar LargePath = Path.extend({\n\n    type: 'largeBar',\n\n    shape: {points: []},\n\n    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 startPoint = this.__startPoint;\n        var baseDimIdx = this.__baseDimIdx;\n\n        for (var i = 0; i < points.length; i += 2) {\n            startPoint[baseDimIdx] = points[i + baseDimIdx];\n            ctx.moveTo(startPoint[0], startPoint[1]);\n            ctx.lineTo(points[i], points[i + 1]);\n        }\n    }\n});\n\nfunction createLarge(seriesModel, group, incremental) {\n    // TODO support polar\n    var data = seriesModel.getData();\n    var startPoint = [];\n    var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;\n    startPoint[1 - baseDimIdx] = data.getLayout('valueAxisStart');\n\n    var el = new LargePath({\n        shape: {points: data.getLayout('largePoints')},\n        incremental: !!incremental,\n        __startPoint: startPoint,\n        __baseDimIdx: baseDimIdx,\n        __largeDataIndices: data.getLayout('largeDataIndices'),\n        __barWidth: data.getLayout('barWidth')\n    });\n    group.add(el);\n    setLargeStyle(el, seriesModel, data);\n\n    // Enable tooltip and user mouse/touch event handlers.\n    el.seriesIndex = seriesModel.seriesIndex;\n\n    if (!seriesModel.get('silent')) {\n        el.on('mousedown', largePathUpdateDataIndex);\n        el.on('mousemove', largePathUpdateDataIndex);\n    }\n}\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    largePath.dataIndex = dataIndex >= 0 ? dataIndex : null;\n}, 30, false);\n\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 barWidthHalf = Math.abs(largePath.__barWidth / 2);\n    var startValueVal = largePath.__startPoint[valueDimIdx];\n\n    _eventPos[0] = x;\n    _eventPos[1] = y;\n    var pointerBaseVal = _eventPos[baseDimIdx];\n    var pointerValueVal = _eventPos[1 - baseDimIdx];\n    var baseLowerBound = pointerBaseVal - barWidthHalf;\n    var baseUpperBound = pointerBaseVal + barWidthHalf;\n\n    for (var i = 0, len = points.length / 2; i < len; i++) {\n        var ii = i * 2;\n        var barBaseVal = points[ii + baseDimIdx];\n        var barValueVal = points[ii + valueDimIdx];\n        if (\n            barBaseVal >= baseLowerBound && barBaseVal <= baseUpperBound\n            && (\n                startValueVal <= barValueVal\n                    ? (pointerValueVal >= startValueVal && pointerValueVal <= barValueVal)\n                    : (pointerValueVal >= barValueVal && pointerValueVal <= startValueVal)\n            )\n        ) {\n            return largeDataIndices[i];\n        }\n    }\n\n    return -1;\n}\n\nfunction setLargeStyle(el, seriesModel, data) {\n    var borderColor = data.getVisual('borderColor') || data.getVisual('color');\n    var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(['color', 'borderColor']);\n\n    el.useStyle(itemStyle);\n    el.style.fill = null;\n    el.style.stroke = borderColor;\n    el.style.lineWidth = data.getLayout('barWidth');\n}\n\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {layout, largeLayout} from '../layout/barGrid';\n\nimport '../coord/cartesian/Grid';\nimport './bar/BarSeries';\nimport './bar/BarView';\n// In case developer forget to include grid component\nimport '../component/gridSimple';\n\n\necharts.registerLayout(echarts.PRIORITY.VISUAL.LAYOUT, zrUtil.curry(layout, 'bar'));\n// Use higher prority to avoid to be blocked by other overall layout, which do not\n// only exist in this module, but probably also exist in other modules, like `barPolar`.\necharts.registerLayout(echarts.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, largeLayout);\n\necharts.registerVisual({\n    seriesType: 'bar',\n    reset: function (seriesModel) {\n        // Visual coding for legend\n        seriesModel.getData().setVisual('legendSymbol', 'roundRect');\n    }\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nimport createDimensions from '../../data/helper/createDimensions';\nimport List from '../../data/List';\nimport {extend, isArray} from 'zrender/src/core/util';\n\n/**\n * [Usage]:\n * (1)\n * createListSimply(seriesModel, ['value']);\n * (2)\n * createListSimply(seriesModel, {\n *     coordDimensions: ['value'],\n *     dimensionsCount: 5\n * });\n *\n * @param {module:echarts/model/Series} seriesModel\n * @param {Object|Array.<string|Object>} opt opt or coordDimensions\n *        The options in opt, see `echarts/data/helper/createDimensions`\n * @param {Array.<string>} [nameList]\n * @return {module:echarts/data/List}\n */\nexport default function (seriesModel, opt, nameList) {\n    opt = isArray(opt) && {coordDimensions: opt} || extend({}, opt);\n\n    var source = seriesModel.getSource();\n\n    var dimensionsInfo = createDimensions(source, opt);\n\n    var list = new List(dimensionsInfo, seriesModel);\n    list.initData(source, nameList);\n\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 * Data selectable mixin for chart series.\n * To eanble data select, option of series must have `selectedMode`.\n * And each data item will use `selected` to toggle itself selected status\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default {\n\n    /**\n     * @param {Array.<Object>} targetList [{name, value, selected}, ...]\n     *        If targetList is an array, it should like [{name: ..., value: ...}, ...].\n     *        If targetList is a \"List\", it must have coordDim: 'value' dimension and name.\n     */\n    updateSelectedMap: function (targetList) {\n        this._targetList = zrUtil.isArray(targetList) ? targetList.slice() : [];\n\n        this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {\n            targetMap.set(target.name, target);\n            return targetMap;\n        }, zrUtil.createHashMap());\n    },\n\n    /**\n     * Either name or id should be passed as input here.\n     * If both of them are defined, id is used.\n     *\n     * @param {string|undefined} name name of data\n     * @param {number|undefined} id dataIndex of data\n     */\n    // PENGING If selectedMode is null ?\n    select: function (name, id) {\n        var target = id != null\n            ? this._targetList[id]\n            : this._selectTargetMap.get(name);\n        var selectedMode = this.get('selectedMode');\n        if (selectedMode === 'single') {\n            this._selectTargetMap.each(function (target) {\n                target.selected = false;\n            });\n        }\n        target && (target.selected = true);\n    },\n\n    /**\n     * Either name or id should be passed as input here.\n     * If both of them are defined, id is used.\n     *\n     * @param {string|undefined} name name of data\n     * @param {number|undefined} id dataIndex of data\n     */\n    unSelect: function (name, id) {\n        var target = id != null\n            ? this._targetList[id]\n            : this._selectTargetMap.get(name);\n        // var selectedMode = this.get('selectedMode');\n        // selectedMode !== 'single' && target && (target.selected = false);\n        target && (target.selected = false);\n    },\n\n    /**\n     * Either name or id should be passed as input here.\n     * If both of them are defined, id is used.\n     *\n     * @param {string|undefined} name name of data\n     * @param {number|undefined} id dataIndex of data\n     */\n    toggleSelected: function (name, id) {\n        var target = id != null\n            ? this._targetList[id]\n            : this._selectTargetMap.get(name);\n        if (target != null) {\n            this[target.selected ? 'unSelect' : 'select'](name, id);\n            return target.selected;\n        }\n    },\n\n    /**\n     * Either name or id should be passed as input here.\n     * If both of them are defined, id is used.\n     *\n     * @param {string|undefined} name name of data\n     * @param {number|undefined} id dataIndex of data\n     */\n    isSelected: function (name, id) {\n        var target = id != null\n            ? this._targetList[id]\n            : this._selectTargetMap.get(name);\n        return target && target.selected;\n    }\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport createListSimply from '../helper/createListSimply';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../../util/model';\nimport {getPercentWithPrecision} from '../../util/number';\nimport dataSelectableMixin from '../../component/helper/selectableMixin';\nimport {retrieveRawAttr} from '../../data/helper/dataProvider';\n\n\nvar PieSeries = echarts.extendSeriesModel({\n\n    type: 'series.pie',\n\n    // Overwrite\n    init: function (option) {\n        PieSeries.superApply(this, 'init', arguments);\n\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendDataProvider = function () {\n            return this.getRawData();\n        };\n\n        this.updateSelectedMap(this._createSelectableList());\n\n        this._defaultLabelLine(option);\n    },\n\n    // Overwrite\n    mergeOption: function (newOption) {\n        PieSeries.superCall(this, 'mergeOption', newOption);\n\n        this.updateSelectedMap(this._createSelectableList());\n    },\n\n    getInitialData: function (option, ecModel) {\n        return createListSimply(this, ['value']);\n    },\n\n    _createSelectableList: function () {\n        var data = this.getRawData();\n        var valueDim = data.mapDimension('value');\n        var targetList = [];\n        for (var i = 0, len = data.count(); i < len; i++) {\n            targetList.push({\n                name: data.getName(i),\n                value: data.get(valueDim, i),\n                selected: retrieveRawAttr(data, i, 'selected')\n            });\n        }\n        return targetList;\n    },\n\n    // Overwrite\n    getDataParams: function (dataIndex) {\n        var data = this.getData();\n        var params = PieSeries.superCall(this, 'getDataParams', dataIndex);\n        // FIXME toFixed?\n\n        var valueList = [];\n        data.each(data.mapDimension('value'), function (value) {\n            valueList.push(value);\n        });\n\n        params.percent = getPercentWithPrecision(\n            valueList,\n            dataIndex,\n            data.hostModel.get('percentPrecision')\n        );\n\n        params.$vars.push('percent');\n        return params;\n    },\n\n    _defaultLabelLine: function (option) {\n        // Extend labelLine emphasis\n        modelUtil.defaultEmphasis(option, 'labelLine', ['show']);\n\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\n            && option.label.show;\n        labelLineEmphasisOpt.show = labelLineEmphasisOpt.show\n            && option.emphasis.label.show;\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n        // 默认全局居中\n        center: ['50%', '50%'],\n        radius: [0, '75%'],\n        // 默认顺时针\n        clockwise: true,\n        startAngle: 90,\n        // 最小角度改为0\n        minAngle: 0,\n\n        // If the angle of a sector less than `minShowLabelAngle`,\n        // the label will not be displayed.\n        minShowLabelAngle: 0,\n\n        // 选中时扇区偏移量\n        selectedOffset: 10,\n        // 高亮扇区偏移量\n        hoverOffset: 10,\n\n        // If use strategy to avoid label overlapping\n        avoidLabelOverlap: true,\n        // 选择模式，默认关闭，可选single，multiple\n        // selectedMode: false,\n        // 南丁格尔玫瑰图模式，'radius'（半径） | 'area'（面积）\n        // roseType: null,\n\n        percentPrecision: 2,\n\n        // If still show when all data zero.\n        stillShowZeroSum: true,\n\n        // cursor: null,\n\n        label: {\n            // If rotate around circle\n            rotate: false,\n            show: true,\n            // 'outer', 'inside', 'center'\n            position: 'outer'\n            // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n            // 默认使用全局文本样式，详见TEXTSTYLE\n            // distance: 当position为inner时有效，为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数\n        },\n        // Enabled when label.normal.position is 'outer'\n        labelLine: {\n            show: true,\n            // 引导线两段中的第一段长度\n            length: 15,\n            // 引导线两段中的第二段长度\n            length2: 15,\n            smooth: false,\n            lineStyle: {\n                // color: 各异,\n                width: 1,\n                type: 'solid'\n            }\n        },\n        itemStyle: {\n            borderWidth: 1\n        },\n\n        // Animation type canbe expansion, scale\n        animationType: 'expansion',\n\n        animationEasing: 'cubicOut'\n    }\n});\n\nzrUtil.mixin(PieSeries, dataSelectableMixin);\n\nexport default PieSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport ChartView from '../../view/Chart';\n\n/**\n * @param {module:echarts/model/Series} seriesModel\n * @param {boolean} hasAnimation\n * @inner\n */\nfunction updateDataSelected(uid, seriesModel, hasAnimation, api) {\n    var data = seriesModel.getData();\n    var dataIndex = this.dataIndex;\n    var name = data.getName(dataIndex);\n    var selectedOffset = seriesModel.get('selectedOffset');\n\n    api.dispatchAction({\n        type: 'pieToggleSelect',\n        from: uid,\n        name: name,\n        seriesId: seriesModel.id\n    });\n\n    data.each(function (idx) {\n        toggleItemSelected(\n            data.getItemGraphicEl(idx),\n            data.getItemLayout(idx),\n            seriesModel.isSelected(data.getName(idx)),\n            selectedOffset,\n            hasAnimation\n        );\n    });\n}\n\n/**\n * @param {module:zrender/graphic/Sector} el\n * @param {Object} layout\n * @param {boolean} isSelected\n * @param {number} selectedOffset\n * @param {boolean} hasAnimation\n * @inner\n */\nfunction toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) {\n    var midAngle = (layout.startAngle + layout.endAngle) / 2;\n\n    var dx = Math.cos(midAngle);\n    var dy = Math.sin(midAngle);\n\n    var offset = isSelected ? selectedOffset : 0;\n    var position = [dx * offset, dy * offset];\n\n    hasAnimation\n        // animateTo will stop revious animation like update transition\n        ? el.animate()\n            .when(200, {\n                position: position\n            })\n            .start('bounceOut')\n        : el.attr('position', position);\n}\n\n/**\n * Piece of pie including Sector, Label, LabelLine\n * @constructor\n * @extends {module:zrender/graphic/Group}\n */\nfunction PiePiece(data, idx) {\n\n    graphic.Group.call(this);\n\n    var sector = new graphic.Sector({\n        z2: 2\n    });\n    var polyline = new graphic.Polyline();\n    var text = new graphic.Text();\n    this.add(sector);\n    this.add(polyline);\n    this.add(text);\n\n    this.updateData(data, idx, true);\n}\n\nvar piePieceProto = PiePiece.prototype;\n\npiePieceProto.updateData = function (data, idx, firstCreate) {\n\n    var sector = this.childAt(0);\n    var labelLine = this.childAt(1);\n    var labelText = this.childAt(2);\n\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var sectorShape = zrUtil.extend({}, layout);\n    sectorShape.label = null;\n\n    if (firstCreate) {\n        sector.setShape(sectorShape);\n\n        var animationType = seriesModel.getShallow('animationType');\n        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            sector.shape.endAngle = layout.startAngle;\n            graphic.updateProps(sector, {\n                shape: {\n                    endAngle: layout.endAngle\n                }\n            }, seriesModel, idx);\n        }\n\n    }\n    else {\n        graphic.updateProps(sector, {\n            shape: sectorShape\n        }, seriesModel, idx);\n    }\n\n    // Update common style\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    sector.useStyle(\n        zrUtil.defaults(\n            {\n                lineJoin: 'bevel',\n                fill: visualColor\n            },\n            itemModel.getModel('itemStyle').getItemStyle()\n        )\n    );\n    sector.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();\n\n    var cursorStyle = itemModel.getShallow('cursor');\n    cursorStyle && sector.attr('cursor', cursorStyle);\n\n    // Toggle selected\n    toggleItemSelected(\n        this,\n        data.getItemLayout(idx),\n        seriesModel.isSelected(null, idx),\n        seriesModel.get('selectedOffset'),\n        seriesModel.get('animation')\n    );\n\n    this._updateLabel(data, idx);\n\n    this.highDownOnUpdate = (itemModel.get('hoverAnimation') && seriesModel.isAnimationEnabled())\n        ? function (fromState, toState) {\n            if (toState === 'emphasis') {\n                labelLine.ignore = labelLine.hoverIgnore;\n                labelText.ignore = labelText.hoverIgnore;\n\n                // Sector may has animation of updating data. Force to move to the last frame\n                // Or it may stopped on the wrong shape\n                sector.stopAnimation(true);\n                sector.animateTo({\n                    shape: {\n                        r: layout.r + seriesModel.get('hoverOffset')\n                    }\n                }, 300, 'elasticOut');\n            }\n            else {\n                labelLine.ignore = labelLine.normalIgnore;\n                labelText.ignore = labelText.normalIgnore;\n\n                sector.stopAnimation(true);\n                sector.animateTo({\n                    shape: {\n                        r: layout.r\n                    }\n                }, 300, 'elasticOut');\n            }\n        }\n        : null;\n\n    graphic.setHoverStyle(this);\n};\n\npiePieceProto._updateLabel = function (data, idx) {\n\n    var labelLine = this.childAt(1);\n    var labelText = this.childAt(2);\n\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var labelLayout = layout.label;\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    if (!labelLayout || isNaN(labelLayout.x) || isNaN(labelLayout.y)) {\n        labelText.ignore = labelText.normalIgnore = labelText.hoverIgnore =\n        labelLine.ignore = labelLine.normalIgnore = labelLine.hoverIgnore = true;\n        return;\n    }\n\n    graphic.updateProps(labelLine, {\n        shape: {\n            points: labelLayout.linePoints || [\n                [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y]\n            ]\n        }\n    }, seriesModel, idx);\n\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        origin: [labelLayout.x, labelLayout.y],\n        z2: 10\n    });\n\n    var labelModel = itemModel.getModel('label');\n    var labelHoverModel = itemModel.getModel('emphasis.label');\n    var labelLineModel = itemModel.getModel('labelLine');\n    var labelLineHoverModel = itemModel.getModel('emphasis.labelLine');\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    graphic.setLabelStyle(\n        labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel,\n        {\n            labelFetcher: data.hostModel,\n            labelDataIndex: idx,\n            defaultText: data.getName(idx),\n            autoColor: visualColor,\n            useInsideStyle: !!labelLayout.inside\n        },\n        {\n            textAlign: labelLayout.textAlign,\n            textVerticalAlign: labelLayout.verticalAlign,\n            opacity: data.getItemVisual(idx, 'opacity')\n        }\n    );\n\n    labelText.ignore = labelText.normalIgnore = !labelModel.get('show');\n    labelText.hoverIgnore = !labelHoverModel.get('show');\n\n    labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');\n    labelLine.hoverIgnore = !labelLineHoverModel.get('show');\n\n    // Default use item visual color\n    labelLine.setStyle({\n        stroke: visualColor,\n        opacity: data.getItemVisual(idx, 'opacity')\n    });\n    labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());\n\n    labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();\n\n    var smooth = labelLineModel.get('smooth');\n    if (smooth && smooth === true) {\n        smooth = 0.4;\n    }\n    labelLine.setShape({\n        smooth: smooth\n    });\n};\n\nzrUtil.inherits(PiePiece, graphic.Group);\n\n\n// Pie view\nvar PieView = ChartView.extend({\n\n    type: 'pie',\n\n    init: function () {\n        var sectorGroup = new graphic.Group();\n        this._sectorGroup = sectorGroup;\n    },\n\n    render: function (seriesModel, ecModel, api, payload) {\n        if (payload && (payload.from === this.uid)) {\n            return;\n        }\n\n        var data = seriesModel.getData();\n        var oldData = this._data;\n        var group = this.group;\n\n        var hasAnimation = ecModel.get('animation');\n        var isFirstRender = !oldData;\n        var animationType = seriesModel.get('animationType');\n\n        var onSectorClick = zrUtil.curry(\n            updateDataSelected, this.uid, seriesModel, hasAnimation, api\n        );\n\n        var selectedMode = seriesModel.get('selectedMode');\n        data.diff(oldData)\n            .add(function (idx) {\n                var piePiece = new PiePiece(data, idx);\n                // Default expansion animation\n                if (isFirstRender && animationType !== 'scale') {\n                    piePiece.eachChild(function (child) {\n                        child.stopAnimation(true);\n                    });\n                }\n\n                selectedMode && piePiece.on('click', onSectorClick);\n\n                data.setItemGraphicEl(idx, piePiece);\n\n                group.add(piePiece);\n            })\n            .update(function (newIdx, oldIdx) {\n                var piePiece = oldData.getItemGraphicEl(oldIdx);\n\n                piePiece.updateData(data, newIdx);\n\n                piePiece.off('click');\n                selectedMode && piePiece.on('click', onSectorClick);\n                group.add(piePiece);\n                data.setItemGraphicEl(newIdx, piePiece);\n            })\n            .remove(function (idx) {\n                var piePiece = oldData.getItemGraphicEl(idx);\n                group.remove(piePiece);\n            })\n            .execute();\n\n        if (\n            hasAnimation && isFirstRender && data.count() > 0\n            // Default expansion animation\n            && animationType !== 'scale'\n        ) {\n            var shape = data.getItemLayout(0);\n            for (var s = 1; isNaN(shape.startAngle) && s < data.count(); ++s) {\n                shape = data.getItemLayout(s);\n            }\n\n            var r = Math.max(api.getWidth(), api.getHeight()) / 2;\n\n            var removeClipPath = zrUtil.bind(group.removeClipPath, group);\n            group.setClipPath(this._createClipPath(\n                shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel\n            ));\n        }\n        else {\n            // clipPath is used in first-time animation, so remove it when otherwise. See: #8994\n            group.removeClipPath();\n        }\n\n        this._data = data;\n    },\n\n    dispose: function () {},\n\n    _createClipPath: function (\n        cx, cy, r, startAngle, clockwise, cb, seriesModel\n    ) {\n        var clipPath = new graphic.Sector({\n            shape: {\n                cx: cx,\n                cy: cy,\n                r0: 0,\n                r: r,\n                startAngle: startAngle,\n                endAngle: startAngle,\n                clockwise: clockwise\n            }\n        });\n\n        graphic.initProps(clipPath, {\n            shape: {\n                endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2\n            }\n        }, seriesModel, cb);\n\n        return clipPath;\n    },\n\n    /**\n     * @implement\n     */\n    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\n});\n\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\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (seriesType, actionInfos) {\n    zrUtil.each(actionInfos, function (actionInfo) {\n        actionInfo.update = 'updateView';\n        /**\n         * @payload\n         * @property {string} seriesName\n         * @property {string} name\n         */\n        echarts.registerAction(actionInfo, function (payload, ecModel) {\n            var selected = {};\n            ecModel.eachComponent(\n                {mainType: 'series', subType: seriesType, query: payload},\n                function (seriesModel) {\n                    if (seriesModel[actionInfo.method]) {\n                        seriesModel[actionInfo.method](\n                            payload.name,\n                            payload.dataIndex\n                        );\n                    }\n                    var data = seriesModel.getData();\n                    // Create selected map\n                    data.each(function (idx) {\n                        var name = data.getName(idx);\n                        selected[name] = seriesModel.isSelected(name)\n                            || false;\n                    });\n                }\n            );\n            return {\n                name: payload.name,\n                selected: selected,\n                seriesId: payload.seriesId\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// Pick color from palette for each data item.\n// Applicable for charts that require applying color palette\n// in data level (like pie, funnel, chord).\nimport {createHashMap} from 'zrender/src/core/util';\n\nexport default function (seriesType) {\n    return {\n        getTargetSeries: function (ecModel) {\n            // Pie and funnel may use diferrent scope\n            var paletteScope = {};\n            var seiresModelMap = createHashMap();\n\n            ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n                seriesModel.__paletteScope = paletteScope;\n                seiresModelMap.set(seriesModel.uid, seriesModel);\n            });\n\n            return seiresModelMap;\n        },\n        reset: function (seriesModel, ecModel) {\n            var dataAll = seriesModel.getRawData();\n            var idxMap = {};\n            var data = seriesModel.getData();\n\n            data.each(function (idx) {\n                var rawIdx = data.getRawIndex(idx);\n                idxMap[rawIdx] = idx;\n            });\n\n            dataAll.each(function (rawIdx) {\n                var filteredIdx = idxMap[rawIdx];\n\n                // If series.itemStyle.normal.color is a function. itemVisual may be encoded\n                var singleDataColor = filteredIdx != null\n                    && data.getItemVisual(filteredIdx, 'color', true);\n\n                if (!singleDataColor) {\n                    // FIXME Performance\n                    var itemModel = dataAll.getItemModel(rawIdx);\n\n                    var color = itemModel.get('itemStyle.color')\n                        || seriesModel.getColorFromPalette(\n                            dataAll.getName(rawIdx) || (rawIdx + ''), seriesModel.__paletteScope,\n                            dataAll.count()\n                        );\n                    // Legend may use the visual info in data before processed\n                    dataAll.setItemVisual(rawIdx, 'color', color);\n\n                    // Data is not filtered\n                    if (filteredIdx != null) {\n                        data.setItemVisual(filteredIdx, 'color', color);\n                    }\n                }\n                else {\n                    // Set data all color for legend\n                    dataAll.setItemVisual(rawIdx, 'color', singleDataColor);\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// FIXME emphasis label position is not same with normal label position\n\nimport * as textContain from 'zrender/src/contain/text';\n\nvar RADIAN = Math.PI / 180;\n\nfunction adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {\n    list.sort(function (a, b) {\n        return a.y - b.y;\n    });\n\n    function shiftDown(start, end, delta, dir) {\n        for (var j = start; j < end; j++) {\n            list[j].y += delta;\n            if (j > start\n                && j + 1 < end\n                && list[j + 1].y > list[j].y + list[j].height\n            ) {\n                shiftUp(j, delta / 2);\n                return;\n            }\n        }\n\n        shiftUp(end - 1, delta / 2);\n    }\n\n    function shiftUp(end, delta) {\n        for (var j = end; j >= 0; j--) {\n            list[j].y -= delta;\n            if (j > 0\n                && list[j].y > list[j - 1].y + list[j - 1].height\n            ) {\n                break;\n            }\n        }\n    }\n\n    function changeX(list, isDownList, cx, cy, r, dir) {\n        var lastDeltaX = dir > 0\n            ? isDownList                // right-side\n                ? Number.MAX_VALUE      // down\n                : 0                     // up\n            : isDownList                // left-side\n                ? Number.MAX_VALUE      // down\n                : 0;                    // up\n\n        for (var i = 0, l = list.length; i < l; i++) {\n            var deltaY = Math.abs(list[i].y - cy);\n            var length = list[i].len;\n            var length2 = list[i].len2;\n            var deltaX = (deltaY < r + length)\n                ? Math.sqrt(\n                        (r + length + length2) * (r + length + length2)\n                        - deltaY * deltaY\n                    )\n                : Math.abs(list[i].x - cx);\n            if (isDownList && deltaX >= lastDeltaX) {\n                // right-down, left-down\n                deltaX = lastDeltaX - 10;\n            }\n            if (!isDownList && deltaX <= lastDeltaX) {\n                // right-up, left-up\n                deltaX = lastDeltaX + 10;\n            }\n\n            list[i].x = cx + deltaX * dir;\n            lastDeltaX = deltaX;\n        }\n    }\n\n    var lastY = 0;\n    var delta;\n    var len = list.length;\n    var upList = [];\n    var downList = [];\n    for (var i = 0; i < len; i++) {\n        delta = list[i].y - lastY;\n        if (delta < 0) {\n            shiftDown(i, len, -delta, dir);\n        }\n        lastY = list[i].y + list[i].height;\n    }\n    if (viewHeight - lastY < 0) {\n        shiftUp(len - 1, lastY - viewHeight);\n    }\n    for (var i = 0; i < len; i++) {\n        if (list[i].y >= cy) {\n            downList.push(list[i]);\n        }\n        else {\n            upList.push(list[i]);\n        }\n    }\n    changeX(upList, false, cx, cy, r, dir);\n    changeX(downList, true, cx, cy, r, dir);\n}\n\nfunction avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {\n    var leftList = [];\n    var rightList = [];\n    for (var i = 0; i < labelLayoutList.length; i++) {\n        if (isPositionCenter(labelLayoutList[i])) {\n            continue;\n        }\n        if (labelLayoutList[i].x < cx) {\n            leftList.push(labelLayoutList[i]);\n        }\n        else {\n            rightList.push(labelLayoutList[i]);\n        }\n    }\n\n    adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight);\n    adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);\n\n    for (var i = 0; i < labelLayoutList.length; i++) {\n        if (isPositionCenter(labelLayoutList[i])) {\n            continue;\n        }\n        var linePoints = labelLayoutList[i].linePoints;\n        if (linePoints) {\n            var dist = linePoints[1][0] - linePoints[2][0];\n            if (labelLayoutList[i].x < cx) {\n                linePoints[2][0] = labelLayoutList[i].x + 3;\n            }\n            else {\n                linePoints[2][0] = labelLayoutList[i].x - 3;\n            }\n            linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y;\n            linePoints[1][0] = linePoints[2][0] + dist;\n        }\n    }\n}\n\nfunction isPositionCenter(layout) {\n    // Not change x for center label\n    return layout.position === 'center';\n}\n\nexport default function (seriesModel, r, viewWidth, viewHeight, sum) {\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\n    data.each(function (idx) {\n        var layout = data.getItemLayout(idx);\n\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\n        var labelLineModel = itemModel.getModel('labelLine');\n        var labelLineLen = labelLineModel.get('length');\n        var labelLineLen2 = labelLineModel.get('length2');\n\n        if (layout.angle < minShowLabelRadian) {\n            return;\n        }\n\n        var midAngle = (layout.startAngle + layout.endAngle) / 2;\n        var dx = Math.cos(midAngle);\n        var dy = Math.sin(midAngle);\n\n        var textX;\n        var textY;\n        var linePoints;\n        var textAlign;\n\n        cx = layout.cx;\n        cy = layout.cy;\n\n        var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';\n        if (labelPosition === 'center') {\n            textX = layout.cx;\n            textY = layout.cy;\n            textAlign = 'center';\n        }\n        else {\n            var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;\n            var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;\n\n            textX = x1 + dx * 3;\n            textY = y1 + dy * 3;\n\n            if (!isLabelInside) {\n                // For roseType\n                var x2 = x1 + dx * (labelLineLen + r - layout.r);\n                var y2 = y1 + dy * (labelLineLen + r - layout.r);\n                var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2);\n                var y3 = y2;\n\n                textX = x3 + (dx < 0 ? -5 : 5);\n                textY = y3;\n                linePoints = [[x1, y1], [x2, y2], [x3, y3]];\n            }\n\n            textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right');\n        }\n        var font = labelModel.getFont();\n\n        var labelRotate;\n        var rotate = labelModel.get('rotate');\n        if (typeof rotate === 'number') {\n            labelRotate = rotate * (Math.PI / 180);\n        }\n        else {\n            labelRotate = rotate\n                ? (dx < 0 ? -midAngle + Math.PI : -midAngle)\n                : 0;\n        }\n        var text = seriesModel.getFormattedLabel(idx, 'normal')\n                    || data.getName(idx);\n        var textRect = textContain.getBoundingRect(\n            text, font, textAlign, 'top'\n        );\n        hasLabelRotate = !!labelRotate;\n        layout.label = {\n            x: textX,\n            y: textY,\n            position: labelPosition,\n            height: textRect.height,\n            len: labelLineLen,\n            len2: labelLineLen2,\n            linePoints: linePoints,\n            textAlign: textAlign,\n            verticalAlign: 'middle',\n            rotation: labelRotate,\n            inside: isLabelInside\n        };\n\n        // Not layout the inside label\n        if (!isLabelInside) {\n            labelLayoutList.push(layout.label);\n        }\n    });\n    if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {\n        avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight);\n    }\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nimport {parsePercent, linearMap} from '../../util/number';\nimport labelLayout from './labelLayout';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar PI2 = Math.PI * 2;\nvar RADIAN = Math.PI / 180;\n\nexport default function (seriesType, ecModel, api, payload) {\n    ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n\n        var center = seriesModel.get('center');\n        var radius = seriesModel.get('radius');\n\n        if (!zrUtil.isArray(radius)) {\n            radius = [0, radius];\n        }\n        if (!zrUtil.isArray(center)) {\n            center = [center, center];\n        }\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\n        var startAngle = -seriesModel.get('startAngle') * RADIAN;\n\n        var minAngle = seriesModel.get('minAngle') * RADIAN;\n\n        var validDataCount = 0;\n        data.each(valueDim, function (value) {\n            !isNaN(value) && validDataCount++;\n        });\n\n        var sum = data.getSum(valueDim);\n        // Sum may be 0\n        var unitRadian = Math.PI / (sum || validDataCount) * 2;\n\n        var clockwise = seriesModel.get('clockwise');\n\n        var roseType = seriesModel.get('roseType');\n        var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n\n        // [0...max]\n        var extent = data.getDataExtent(valueDim);\n        extent[0] = 0;\n\n        // In the case some sector angle is smaller than minAngle\n        var restAngle = PI2;\n        var valueSumLargerThanMinAngle = 0;\n\n        var currentAngle = startAngle;\n        var dir = clockwise ? 1 : -1;\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\n                        ? NaN\n                        : r\n                });\n                return;\n            }\n\n            // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样？\n            if (roseType !== 'area') {\n                angle = (sum === 0 && stillShowZeroSum)\n                    ? unitRadian : (value * unitRadian);\n            }\n            else {\n                angle = PI2 / validDataCount;\n            }\n\n            if (angle < minAngle) {\n                angle = minAngle;\n                restAngle -= minAngle;\n            }\n            else {\n                valueSumLargerThanMinAngle += value;\n            }\n\n            var endAngle = currentAngle + dir * angle;\n            data.setItemLayout(idx, {\n                angle: angle,\n                startAngle: currentAngle,\n                endAngle: endAngle,\n                clockwise: clockwise,\n                cx: cx,\n                cy: cy,\n                r0: r0,\n                r: roseType\n                    ? linearMap(value, extent, [r0, r])\n                    : r\n            });\n\n            currentAngle = endAngle;\n        });\n\n        // Some sector is constrained by minAngle\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\n            if (restAngle <= 1e-3) {\n                var angle = PI2 / validDataCount;\n                data.each(valueDim, function (value, idx) {\n                    if (!isNaN(value)) {\n                        var layout = data.getItemLayout(idx);\n                        layout.angle = angle;\n                        layout.startAngle = startAngle + dir * idx * angle;\n                        layout.endAngle = startAngle + dir * (idx + 1) * angle;\n                    }\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 === minAngle\n                            ? minAngle : value * unitRadian;\n                        layout.startAngle = currentAngle;\n                        layout.endAngle = currentAngle + dir * angle;\n                        currentAngle += dir * angle;\n                    }\n                });\n            }\n        }\n\n        labelLayout(seriesModel, r, width, height);\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nexport default function (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                    if (!legendModels[i].isSelected(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\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nimport './pie/PieSeries';\nimport './pie/PieView';\n\nimport createDataSelectAction from '../action/createDataSelectAction';\nimport dataColor from '../visual/dataColor';\nimport pieLayout from './pie/pieLayout';\nimport dataFilter from '../processor/dataFilter';\n\ncreateDataSelectAction('pie', [{\n    type: 'pieToggleSelect',\n    event: 'pieselectchanged',\n    method: 'toggleSelected'\n}, {\n    type: 'pieSelect',\n    event: 'pieselected',\n    method: 'select'\n}, {\n    type: 'pieUnSelect',\n    event: 'pieunselected',\n    method: 'unSelect'\n}]);\n\necharts.registerVisual(dataColor('pie'));\necharts.registerLayout(zrUtil.curry(pieLayout, 'pie'));\necharts.registerProcessor(dataFilter('pie'));","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport createListFromArray from '../helper/createListFromArray';\nimport SeriesModel from '../../model/Series';\n\nexport default SeriesModel.extend({\n\n    type: 'series.scatter',\n\n    dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],\n\n    getInitialData: function (option, ecModel) {\n        return createListFromArray(this.getSource(), this);\n    },\n\n    brushSelector: 'point',\n\n    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\n    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\n    defaultOption: {\n        coordinateSystem: 'cartesian2d',\n        zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // Polar coordinate system\n        // polarIndex: 0,\n\n        // Geo coordinate system\n        // geoIndex: 0,\n\n        // symbol: null,        // 图形类型\n        symbolSize: 10,          // 图形大小，半宽（半径）参数，当图形为方向或菱形则总宽度为symbolSize * 2\n        // symbolRotate: null,  // 图形旋转控制\n\n        large: false,\n        // Available when large is true\n        largeThreshold: 2000,\n        // cursor: null,\n\n        // label: {\n            // show: false\n            // distance: 5,\n            // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n            // position: 默认自适应，水平布局为'top'，垂直布局为'right'，可选为\n            //           'inside'|'left'|'right'|'top'|'bottom'\n            // 默认使用全局文本样式，详见TEXTSTYLE\n        // },\n        itemStyle: {\n            opacity: 0.8\n            // color: 各异\n        }\n\n        // progressive: 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/* global Float32Array */\n\n// TODO Batch by color\n\nimport * as graphic from '../../util/graphic';\nimport {createSymbol} from '../../util/symbol';\nimport IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable';\n\nvar BOOST_SIZE_THRESHOLD = 4;\n\nvar LargeSymbolPath = graphic.extendShape({\n\n    shape: {\n        points: null\n    },\n\n    symbolProxy: null,\n\n    buildPath: function (path, shape) {\n        var points = shape.points;\n        var size = shape.size;\n\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\n        // Do draw in afterBrush.\n        if (canBoost) {\n            return;\n        }\n\n        for (var i = 0; i < points.length;) {\n            var x = points[i++];\n            var y = points[i++];\n\n            if (isNaN(x) || isNaN(y)) {\n                continue;\n            }\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\n            symbolProxy.buildPath(path, symbolProxyShape, true);\n        }\n    },\n\n    afterBrush: function (ctx) {\n        var shape = this.shape;\n        var points = shape.points;\n        var size = shape.size;\n        var canBoost = size[0] < BOOST_SIZE_THRESHOLD;\n\n        if (!canBoost) {\n            return;\n        }\n\n        this.setTransform(ctx);\n        // PENDING If style or other canvas status changed?\n        for (var i = 0; i < points.length;) {\n            var x = points[i++];\n            var y = points[i++];\n            if (isNaN(x) || isNaN(y)) {\n                continue;\n            }\n            // fillRect is faster than building a rect path and draw.\n            // And it support light globalCompositeOperation.\n            ctx.fillRect(\n                x - size[0] / 2, y - size[1] / 2,\n                size[0], size[1]\n            );\n        }\n\n        this.restoreTransform(ctx);\n    },\n\n    findDataIndex: function (x, y) {\n        // TODO ???\n        // Consider transform\n\n        var shape = this.shape;\n        var points = shape.points;\n        var size = shape.size;\n\n        var w = Math.max(size[0], 4);\n        var h = Math.max(size[1], 4);\n\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\n        return -1;\n    }\n});\n\nfunction LargeSymbolDraw() {\n    this.group = new graphic.Group();\n}\n\nvar largeSymbolProto = LargeSymbolDraw.prototype;\n\nlargeSymbolProto.isPersistent = function () {\n    return !this._incremental;\n};\n\n/**\n * Update symbols draw by new data\n * @param {module:echarts/data/List} data\n */\nlargeSymbolProto.updateData = function (data) {\n    this.group.removeAll();\n    var symbolEl = new LargeSymbolPath({\n        rectHover: true,\n        cursor: 'default'\n    });\n\n    symbolEl.setShape({\n        points: data.getLayout('symbolPoints')\n    });\n    this._setCommon(symbolEl, data);\n    this.group.add(symbolEl);\n\n    this._incremental = null;\n};\n\nlargeSymbolProto.updateLayout = function (data) {\n    if (this._incremental) {\n        return;\n    }\n\n    var points = data.getLayout('symbolPoints');\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    });\n};\n\nlargeSymbolProto.incrementalPrepareUpdate = function (data) {\n    this.group.removeAll();\n\n    this._clearIncremental();\n    // Only use incremental displayables when data amount is larger than 2 million.\n    // PENDING Incremental data?\n    if (data.count() > 2e6) {\n        if (!this._incremental) {\n            this._incremental = new IncrementalDisplayable({\n                silent: true\n            });\n        }\n        this.group.add(this._incremental);\n    }\n    else {\n        this._incremental = null;\n    }\n};\n\nlargeSymbolProto.incrementalUpdate = function (taskParams, data) {\n    var symbolEl;\n    if (this._incremental) {\n        symbolEl = new LargeSymbolPath();\n        this._incremental.addDisplayable(symbolEl, true);\n    }\n    else {\n        symbolEl = new LargeSymbolPath({\n            rectHover: true,\n            cursor: 'default',\n            startIndex: taskParams.start,\n            endIndex: taskParams.end\n        });\n        symbolEl.incremental = true;\n        this.group.add(symbolEl);\n    }\n\n    symbolEl.setShape({\n        points: data.getLayout('symbolPoints')\n    });\n    this._setCommon(symbolEl, data, !!this._incremental);\n};\n\nlargeSymbolProto._setCommon = function (symbolEl, data, isIncremental) {\n    var hostModel = data.hostModel;\n\n    // TODO\n    // if (data.hasItemVisual.symbolSize) {\n    //     // TODO typed array?\n    //     symbolEl.setShape('sizes', data.mapArray(\n    //         function (idx) {\n    //             var size = data.getItemVisual(idx, 'symbolSize');\n    //             return (size instanceof Array) ? size : [size, size];\n    //         }\n    //     ));\n    // }\n    // else {\n    var size = data.getVisual('symbolSize');\n    symbolEl.setShape('size', (size instanceof Array) ? size : [size, size]);\n    // }\n\n    // Create symbolProxy to build path for each data\n    symbolEl.symbolProxy = createSymbol(\n        data.getVisual('symbol'), 0, 0, 0, 0\n    );\n    // Use symbolProxy setColor method\n    symbolEl.setColor = symbolEl.symbolProxy.setColor;\n\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    );\n\n    var visualColor = data.getVisual('color');\n    if (visualColor) {\n        symbolEl.setColor(visualColor);\n    }\n\n    if (!isIncremental) {\n        // Enable tooltip\n        // PENDING May have performance issue when path is extremely large\n        symbolEl.seriesIndex = hostModel.seriesIndex;\n        symbolEl.on('mousemove', function (e) {\n            symbolEl.dataIndex = null;\n            var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);\n            if (dataIndex >= 0) {\n                // Provide dataIndex for tooltip\n                symbolEl.dataIndex = dataIndex + (symbolEl.startIndex || 0);\n            }\n        });\n    }\n};\n\nlargeSymbolProto.remove = function () {\n    this._clearIncremental();\n    this._incremental = null;\n    this.group.removeAll();\n};\n\nlargeSymbolProto._clearIncremental = function () {\n    var incremental = this._incremental;\n    if (incremental) {\n        incremental.clearDisplaybles();\n    }\n};\n\nexport default LargeSymbolDraw;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport SymbolDraw from '../helper/SymbolDraw';\nimport LargeSymbolDraw from '../helper/LargeSymbolDraw';\n\nimport pointsLayout from '../../layout/points';\n\necharts.extendChartView({\n\n    type: 'scatter',\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n\n        var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n        symbolDraw.updateData(data);\n\n        this._finished = true;\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n\n        symbolDraw.incrementalPrepareUpdate(data);\n\n        this._finished = false;\n    },\n\n    incrementalRender: function (taskParams, seriesModel, ecModel) {\n        this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData());\n\n        this._finished = taskParams.end === seriesModel.getData().count();\n    },\n\n    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\n        if (!this._finished || data.count() > 1e4 || !this._symbolDraw.isPersistent()) {\n            return {\n                update: true\n            };\n        }\n        else {\n            var res = pointsLayout().reset(seriesModel);\n            if (res.progress) {\n                res.progress({ start: 0, end: data.count() }, data);\n            }\n\n            this._symbolDraw.updateLayout(data);\n        }\n    },\n\n    _updateSymbolDraw: function (data, seriesModel) {\n        var symbolDraw = this._symbolDraw;\n        var pipelineContext = seriesModel.pipelineContext;\n        var isLargeDraw = pipelineContext.large;\n\n        if (!symbolDraw || isLargeDraw !== this._isLargeDraw) {\n            symbolDraw && symbolDraw.remove();\n            symbolDraw = this._symbolDraw = isLargeDraw\n                ? new LargeSymbolDraw()\n                : new SymbolDraw();\n            this._isLargeDraw = isLargeDraw;\n            this.group.removeAll();\n        }\n\n        this.group.add(symbolDraw.group);\n\n        return symbolDraw;\n    },\n\n    remove: function (ecModel, api) {\n        this._symbolDraw && this._symbolDraw.remove(true);\n        this._symbolDraw = null;\n    },\n\n    dispose: function () {}\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n// import * as zrUtil from 'zrender/src/core/util';\n\nimport './scatter/ScatterSeries';\nimport './scatter/ScatterView';\n\nimport visualSymbol from '../visual/symbol';\nimport layoutPoints from '../layout/points';\n\n// In case developer forget to include grid component\nimport '../component/gridSimple';\n\necharts.registerVisual(visualSymbol('scatter', 'circle'));\necharts.registerLayout(layoutPoints('scatter'));\n\n// echarts.registerProcessor(function (ecModel, api) {\n//     ecModel.eachSeriesByType('scatter', function (seriesModel) {\n//         var data = seriesModel.getData();\n//         var coordSys = seriesModel.coordinateSystem;\n//         if (coordSys.type !== 'geo') {\n//             return;\n//         }\n//         var startPt = coordSys.pointToData([0, 0]);\n//         var endPt = coordSys.pointToData([api.getWidth(), api.getHeight()]);\n\n//         var dims = zrUtil.map(coordSys.dimensions, function (dim) {\n//             return data.mapDimension(dim);\n//         });\n//         var range = {};\n//         range[dims[0]] = [Math.min(startPt[0], endPt[0]), Math.max(startPt[0], endPt[0])];\n//         range[dims[1]] = [Math.min(startPt[1], endPt[1]), Math.max(startPt[1], endPt[1])];\n\n//         data.selectRange(range);\n//     });\n// });","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../Axis';\n\nfunction IndicatorAxis(dim, scale, radiusExtent) {\n    Axis.call(this, dim, scale, radiusExtent);\n\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = 'value';\n\n    this.angle = 0;\n\n    /**\n     * Indicator name\n     * @type {string}\n     */\n    this.name = '';\n    /**\n     * @type {module:echarts/model/Model}\n     */\n    this.model;\n}\n\nzrUtil.inherits(IndicatorAxis, Axis);\n\nexport default IndicatorAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// TODO clockwise\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport IndicatorAxis from './IndicatorAxis';\nimport IntervalScale from '../../scale/Interval';\nimport * as numberUtil from '../../util/number';\nimport {\n    getScaleExtent,\n    niceScaleExtent\n} from '../axisHelper';\nimport CoordinateSystem from '../../CoordinateSystem';\n\nfunction Radar(radarModel, ecModel, api) {\n\n    this._model = radarModel;\n    /**\n     * Radar dimensions\n     * @type {Array.<string>}\n     */\n    this.dimensions = [];\n\n    this._indicatorAxes = zrUtil.map(radarModel.getIndicatorModels(), function (indicatorModel, idx) {\n        var dim = 'indicator_' + idx;\n        var indicatorAxis = new IndicatorAxis(dim, new IntervalScale());\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\n    this.resize(radarModel, api);\n\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.cx;\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.cy;\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.r;\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.r0;\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.startAngle;\n}\n\nRadar.prototype.getIndicatorAxes = function () {\n    return this._indicatorAxes;\n};\n\nRadar.prototype.dataToPoint = function (value, indicatorIndex) {\n    var indicatorAxis = this._indicatorAxes[indicatorIndex];\n\n    return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex);\n};\n\nRadar.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\nRadar.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\n    var radian = Math.atan2(-dy, dx);\n\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\n    return [closestAxisIdx, +(closestAxis && closestAxis.coodToData(radius))];\n};\n\nRadar.prototype.resize = function (radarModel, api) {\n    var center = radarModel.get('center');\n    var viewWidth = api.getWidth();\n    var viewHeight = api.getHeight();\n    var viewSize = Math.min(viewWidth, viewHeight) / 2;\n    this.cx = numberUtil.parsePercent(center[0], viewWidth);\n    this.cy = numberUtil.parsePercent(center[1], viewHeight);\n\n    this.startAngle = radarModel.get('startAngle') * Math.PI / 180;\n\n    // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']`\n    var radius = radarModel.get('radius');\n    if (typeof radius === 'string' || typeof radius === 'number') {\n        radius = [0, radius];\n    }\n    this.r0 = numberUtil.parsePercent(radius[0], viewSize);\n    this.r = numberUtil.parsePercent(radius[1], viewSize);\n\n    zrUtil.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\nRadar.prototype.update = function (ecModel, api) {\n    var indicatorAxes = this._indicatorAxes;\n    var radarModel = this._model;\n    zrUtil.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            || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel\n        ) {\n            return;\n        }\n        var data = radarSeries.getData();\n        zrUtil.each(indicatorAxes, function (indicatorAxis) {\n            indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim));\n        });\n    }, this);\n\n    var splitNumber = radarModel.get('splitNumber');\n\n    function increaseInterval(interval) {\n        var exp10 = Math.pow(10, Math.floor(Math.log(interval) / Math.LN10));\n        // Increase interval\n        var f = interval / exp10;\n        if (f === 2) {\n            f = 5;\n        }\n        else { // f is 2 or 5\n            f *= 2;\n        }\n        return f * exp10;\n    }\n    // Force all the axis fixing the maxSplitNumber.\n    zrUtil.each(indicatorAxes, function (indicatorAxis, idx) {\n        var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model);\n        niceScaleExtent(indicatorAxis.scale, indicatorAxis.model);\n\n        var axisModel = indicatorAxis.model;\n        var scale = indicatorAxis.scale;\n        var fixedMin = axisModel.getMin();\n        var fixedMax = axisModel.getMax();\n        var interval = scale.getInterval();\n\n        if (fixedMin != null && fixedMax != null) {\n            // User set min, max, divide to get new interval\n            scale.setExtent(+fixedMin, +fixedMax);\n            scale.setInterval(\n                (fixedMax - fixedMin) / splitNumber\n            );\n        }\n        else if (fixedMin != null) {\n            var max;\n            // User set min, expand extent on the other side\n            do {\n                max = fixedMin + interval * splitNumber;\n                scale.setExtent(+fixedMin, max);\n                // Interval must been set after extent\n                // FIXME\n                scale.setInterval(interval);\n\n                interval = increaseInterval(interval);\n            } while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1]));\n        }\n        else if (fixedMax != null) {\n            var min;\n            // User set min, expand extent on the other side\n            do {\n                min = fixedMax - interval * splitNumber;\n                scale.setExtent(min, +fixedMax);\n                scale.setInterval(interval);\n                interval = increaseInterval(interval);\n            } while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0]));\n        }\n        else {\n            var nicedSplitNumber = scale.getTicks().length - 1;\n            if (nicedSplitNumber > splitNumber) {\n                interval = increaseInterval(interval);\n            }\n            // PENDING\n            var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval;\n            var halfSplitNumber = Math.round(splitNumber / 2);\n            scale.setExtent(\n                numberUtil.round(center - halfSplitNumber * interval),\n                numberUtil.round(center + (splitNumber - halfSplitNumber) * interval)\n            );\n            scale.setInterval(interval);\n        }\n    });\n};\n\n/**\n * Radar dimensions is based on the data\n * @type {Array}\n */\nRadar.dimensions = [];\n\nRadar.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            radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0];\n        }\n    });\n    return radarList;\n};\n\nCoordinateSystem.register('radar', Radar);\n\nexport default Radar;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport axisDefault from '../axisDefault';\nimport Model from '../../model/Model';\nimport axisModelCommonMixin from '../axisModelCommonMixin';\n\nvar valueAxisDefault = axisDefault.valueAxis;\n\nfunction defaultsShow(opt, show) {\n    return zrUtil.defaults({\n        show: show\n    }, opt);\n}\n\nvar RadarModel = echarts.extendComponentModel({\n\n    type: 'radar',\n\n    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        var axisLabel = this.get('axisLabel');\n        var nameTextStyle = this.get('name');\n        var showName = this.get('name.show');\n        var nameFormatter = this.get('name.formatter');\n        var nameGap = this.get('nameGap');\n        var triggerEvent = this.get('triggerEvent');\n\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            }\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({color: indicatorOpt.color}, nameTextStyle);\n            }\n            // Use same configuration\n            indicatorOpt = zrUtil.merge(zrUtil.clone(indicatorOpt), {\n                boundaryGap: boundaryGap,\n                splitNumber: splitNumber,\n                scale: scale,\n                axisLine: axisLine,\n                axisTick: axisTick,\n                axisLabel: axisLabel,\n                // Competitable with 2 and use text\n                name: indicatorOpt.text,\n                nameLocation: 'end',\n                nameGap: nameGap,\n                // min: 0,\n                nameTextStyle: iNameTextStyle,\n                triggerEvent: triggerEvent\n            }, false);\n            if (!showName) {\n                indicatorOpt.name = '';\n            }\n            if (typeof nameFormatter === 'string') {\n                var indName = indicatorOpt.name;\n                indicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');\n            }\n            else if (typeof nameFormatter === 'function') {\n                indicatorOpt.name = nameFormatter(\n                    indicatorOpt.name, indicatorOpt\n                );\n            }\n            var model = zrUtil.extend(\n                new Model(indicatorOpt, null, this.ecModel),\n                axisModelCommonMixin\n            );\n\n            // For triggerEvent.\n            model.mainType = 'radar';\n            model.componentIndex = this.componentIndex;\n\n            return model;\n        }, this);\n\n        this.getIndicatorModels = function () {\n            return indicatorModels;\n        };\n    },\n\n    defaultOption: {\n\n        zlevel: 0,\n\n        z: 0,\n\n        center: ['50%', '50%'],\n\n        radius: '75%',\n\n        startAngle: 90,\n\n        name: {\n            show: true\n            // formatter: null\n            // textStyle: {}\n        },\n\n        boundaryGap: [0, 0],\n\n        splitNumber: 5,\n\n        nameGap: 15,\n\n        scale: false,\n\n        // Polygon or circle\n        shape: 'polygon',\n\n        axisLine: zrUtil.merge(\n            {\n                lineStyle: {\n                    color: '#bbb'\n                }\n            },\n            valueAxisDefault.axisLine\n        ),\n        axisLabel: defaultsShow(valueAxisDefault.axisLabel, false),\n        axisTick: defaultsShow(valueAxisDefault.axisTick, false),\n        splitLine: defaultsShow(valueAxisDefault.splitLine, true),\n        splitArea: defaultsShow(valueAxisDefault.splitArea, true),\n\n        // {text, min, max}\n        indicator: []\n    }\n});\n\nexport default RadarModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport AxisBuilder from '../axis/AxisBuilder';\nimport * as graphic from '../../util/graphic';\n\nvar axisBuilderAttrs = [\n    'axisLine', 'axisTickLabel', 'axisName'\n];\n\nexport default echarts.extendComponentView({\n\n    type: 'radar',\n\n    render: function (radarModel, ecModel, api) {\n        var group = this.group;\n        group.removeAll();\n\n        this._buildAxes(radarModel);\n        this._buildSplitLineAndArea(radarModel);\n    },\n\n    _buildAxes: function (radarModel) {\n        var radar = radarModel.coordinateSystem;\n        var indicatorAxes = radar.getIndicatorAxes();\n        var axisBuilders = zrUtil.map(indicatorAxes, function (indicatorAxis) {\n            var axisBuilder = new AxisBuilder(indicatorAxis.model, {\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\n        zrUtil.each(axisBuilders, function (axisBuilder) {\n            zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n            this.group.add(axisBuilder.getGroup());\n        }, this);\n    },\n\n    _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\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\n        splitLineColors = zrUtil.isArray(splitLineColors) ? splitLineColors : [splitLineColors];\n        splitAreaColors = zrUtil.isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];\n\n        var splitLines = [];\n        var splitAreas = [];\n\n        function getColorIndex(areaOrLine, areaOrLineColorList, idx) {\n            var colorIndex = idx % areaOrLineColorList.length;\n            areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];\n            return colorIndex;\n        }\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, splitLineColors, 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, splitAreaColors, 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;\n            var axesTicksPoints = zrUtil.map(indicatorAxes, function (indicatorAxis, idx) {\n                var ticksCoords = indicatorAxis.getTicksCoords();\n                realSplitNumber = realSplitNumber == null\n                    ? ticksCoords.length - 1\n                    : Math.min(ticksCoords.length - 1, realSplitNumber);\n                return zrUtil.map(ticksCoords, function (tickCoord) {\n                    return radar.coordToPoint(tickCoord.coord, idx);\n                });\n            });\n\n            var prevPoints = [];\n            for (var i = 0; i <= realSplitNumber; 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                }\n                else {\n                    if (__DEV__) {\n                        console.error('Can\\'t draw value axis ' + i);\n                    }\n                }\n\n                if (showSplitLine) {\n                    var colorIndex = getColorIndex(splitLines, splitLineColors, 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, splitAreaColors, 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\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(\n                splitAreas, {\n                    style: zrUtil.defaults({\n                        stroke: 'none',\n                        fill: splitAreaColors[idx % splitAreaColors.length]\n                    }, areaStyle),\n                    silent: true\n                }\n            ));\n        }, this);\n\n        zrUtil.each(splitLines, function (splitLines, idx) {\n            this.group.add(graphic.mergePath(\n                splitLines, {\n                    style: zrUtil.defaults({\n                        fill: 'none',\n                        stroke: splitLineColors[idx % splitLineColors.length]\n                    }, lineStyle),\n                    silent: true\n                }\n            ));\n        }, this);\n\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/radar/Radar';\nimport '../coord/radar/RadarModel';\nimport './radar/RadarView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport SeriesModel from '../../model/Series';\nimport createListSimply from '../helper/createListSimply';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {encodeHTML} from '../../util/format';\n\nvar RadarSeries = SeriesModel.extend({\n\n    type: 'series.radar',\n\n    dependencies: ['radar'],\n\n\n    // Overwrite\n    init: function (option) {\n        RadarSeries.superApply(this, 'init', arguments);\n\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendDataProvider = function () {\n            return this.getRawData();\n        };\n    },\n\n    getInitialData: function (option, ecModel) {\n        return createListSimply(this, {\n            generateCoord: 'indicator_',\n            generateCoordCount: Infinity\n        });\n    },\n\n    formatTooltip: function (dataIndex) {\n        var data = this.getData();\n        var coordSys = this.coordinateSystem;\n        var indicatorAxes = coordSys.getIndicatorAxes();\n        var name = this.getData().getName(dataIndex);\n        return encodeHTML(name === '' ? this.name : name) + '<br/>'\n            + zrUtil.map(indicatorAxes, function (axis, idx) {\n                var val = data.get(data.mapDimension(axis.dim), dataIndex);\n                return encodeHTML(axis.name + ' : ' + val);\n            }).join('<br />');\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        coordinateSystem: 'radar',\n        legendHoverLink: true,\n        radarIndex: 0,\n        lineStyle: {\n            width: 2,\n            type: 'solid'\n        },\n        label: {\n            position: 'top'\n        },\n        // areaStyle: {\n        // },\n        // itemStyle: {}\n        symbol: 'emptyCircle',\n        symbolSize: 4\n        // symbolRotate: null\n    }\n});\n\nexport default RadarSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as graphic from '../../util/graphic';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as symbolUtil from '../../util/symbol';\n\nfunction normalizeSymbolSize(symbolSize) {\n    if (!zrUtil.isArray(symbolSize)) {\n        symbolSize = [+symbolSize, +symbolSize];\n    }\n    return symbolSize;\n}\n\nexport default echarts.extendChartView({\n\n    type: 'radar',\n\n    render: function (seriesModel, ecModel, api) {\n        var polar = seriesModel.coordinateSystem;\n        var group = this.group;\n\n        var data = seriesModel.getData();\n        var oldData = this._data;\n\n        function createSymbol(data, idx) {\n            var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n            var color = data.getItemVisual(idx, 'color');\n            if (symbolType === 'none') {\n                return;\n            }\n            var symbolSize = normalizeSymbolSize(\n                data.getItemVisual(idx, 'symbolSize')\n            );\n            var symbolPath = symbolUtil.createSymbol(\n                symbolType, -1, -1, 2, 2, color\n            );\n            symbolPath.attr({\n                style: {\n                    strokeNoScale: true\n                },\n                z2: 100,\n                scale: [symbolSize[0] / 2, symbolSize[1] / 2]\n            });\n            return symbolPath;\n        }\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.attr('position', oldPoints[i]);\n                        graphic[isInit ? 'initProps' : 'updateProps'](\n                            symbolPath, {\n                                position: newPoints[i]\n                            }, seriesModel, idx\n                        );\n                    }\n                    else {\n                        symbolPath.attr('position', newPoints[i]);\n                    }\n                    symbolGroup.add(symbolPath);\n                }\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)\n            .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\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\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\n                updateSymbols(\n                    polyline.shape.points, points, symbolGroup, data, idx, true\n                );\n\n                data.setItemGraphicEl(idx, itemGroup);\n            })\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\n                if (!target.shape.points) {\n                    return;\n                }\n                updateSymbols(\n                    polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false\n                );\n\n                graphic.updateProps(polyline, target, seriesModel);\n                graphic.updateProps(polygon, target, seriesModel);\n\n                data.setItemGraphicEl(newIdx, itemGroup);\n            })\n            .remove(function (idx) {\n                group.remove(oldData.getItemGraphicEl(idx));\n            })\n            .execute();\n\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            var color = data.getItemVisual(idx, 'color');\n\n            group.add(itemGroup);\n\n            polyline.useStyle(\n                zrUtil.defaults(\n                    itemModel.getModel('lineStyle').getLineStyle(),\n                    {\n                        fill: 'none',\n                        stroke: color\n                    }\n                )\n            );\n            polyline.hoverStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();\n\n            var areaStyleModel = itemModel.getModel('areaStyle');\n            var hoverAreaStyleModel = itemModel.getModel('emphasis.areaStyle');\n            var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();\n            var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty();\n\n            hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore;\n            polygon.ignore = polygonIgnore;\n\n            polygon.useStyle(\n                zrUtil.defaults(\n                    areaStyleModel.getAreaStyle(),\n                    {\n                        fill: color,\n                        opacity: 0.7\n                    }\n                )\n            );\n            polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle();\n\n            var itemStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);\n            var itemHoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();\n            var labelModel = itemModel.getModel('label');\n            var labelHoverModel = itemModel.getModel('emphasis.label');\n            symbolGroup.eachChild(function (symbolPath) {\n                symbolPath.setStyle(itemStyle);\n                symbolPath.hoverStyle = zrUtil.clone(itemHoverStyle);\n                var defaultText = data.get(data.dimensions[symbolPath.__dimIdx], idx);\n                (defaultText == null || isNaN(defaultText)) && (defaultText = '');\n\n                graphic.setLabelStyle(\n                    symbolPath.style, symbolPath.hoverStyle, labelModel, labelHoverModel,\n                    {\n                        labelFetcher: data.hostModel,\n                        labelDataIndex: idx,\n                        labelDimIndex: symbolPath.__dimIdx,\n                        defaultText: defaultText,\n                        autoColor: color,\n                        isRectText: true\n                    }\n                );\n            });\n\n            itemGroup.highDownOnUpdate = function (fromState, toState) {\n                polygon.attr('ignore', toState === 'emphasis' ? hoverPolygonIgnore : polygonIgnore);\n            };\n            graphic.setHoverStyle(itemGroup);\n        });\n\n        this._data = data;\n    },\n\n    remove: function () {\n        this.group.removeAll();\n        this._data = null;\n    },\n\n    dispose: function () {}\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (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\n        var axes = coordSys.getIndicatorAxes();\n\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)\n                    ? point : getValueMissingPoint(coordSys);\n            });\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\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}\n\nfunction isValidPoint(point) {\n    return !isNaN(point[0]) && !isNaN(point[1]);\n}\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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Backward compat for radar chart in 2\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (option) {\n    var polarOptArr = option.polar;\n    if (polarOptArr) {\n        if (!zrUtil.isArray(polarOptArr)) {\n            polarOptArr = [polarOptArr];\n        }\n        var polarNotRadar = [];\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            }\n            else {\n                polarNotRadar.push(polarOpt);\n            }\n        });\n        option.polar = polarNotRadar;\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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nimport * as echarts from '../echarts';\n\n// Must use radar component\nimport '../component/radar';\nimport './radar/RadarSeries';\nimport './radar/RadarView';\n\nimport dataColor from '../visual/dataColor';\nimport visualSymbol from '../visual/symbol';\nimport radarLayout from './radar/radarLayout';\nimport dataFilter from '../processor/dataFilter';\nimport backwardCompat from './radar/backwardCompat';\n\necharts.registerVisual(dataColor('radar'));\necharts.registerVisual(visualSymbol('radar', 'circle'));\necharts.registerLayout(radarLayout);\necharts.registerProcessor(dataFilter('radar'));\necharts.registerPreprocessor(backwardCompat);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Fix for 南海诸岛\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Region from '../Region';\n\nvar geoCoord = [126, 25];\n\nvar points = [\n    [[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7],\n        [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]],\n    [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]],\n    [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]],\n    [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]],\n    [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]],\n    [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]],\n    [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]],\n    [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]],\n    [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]],\n    [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]],\n    [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]],\n    [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4],\n        [1, 92.4], [1, 3.5], [0, 3.5]]\n];\n\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\n        points[i][k][0] += geoCoord[0];\n        points[i][k][1] += geoCoord[1];\n    }\n}\n\nexport default function (mapType, regions) {\n    if (mapType === 'china') {\n        regions.push(new Region(\n            '南海诸岛',\n            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\nvar coordsOffsetMap = {\n    '南海诸岛': [32, 80],\n    // 全国\n    '广东': [0, -10],\n    '香港': [10, 5],\n    '澳门': [-10, 10],\n    //'北京': [-10, 0],\n    '天津': [5, 5]\n};\n\nexport default function (mapType, region) {\n    if (mapType === 'china') {\n        var coordFix = coordsOffsetMap[region.name];\n        if (coordFix) {\n            var cp = region.center;\n            cp[0] += coordFix[0] / 10.5;\n            cp[1] += -coordFix[1] / (10.5 / 0.75);\n        }\n    }\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\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 geoCoordMap = {\n    'Russia': [100, 60],\n    'United States': [-99, 38],\n    'United States of America': [-99, 38]\n};\n\nexport default function (mapType, region) {\n    if (mapType === 'world') {\n        var geoCoord = geoCoordMap[region.name];\n        if (geoCoord) {\n            var cp = region.center;\n            cp[0] = geoCoord[0];\n            cp[1] = geoCoord[1];\n        }\n    }\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// Fix for 钓鱼岛\n\n// var Region = require('../Region');\n// var zrUtil = require('zrender/src/core/util');\n\n// var geoCoord = [126, 25];\n\nvar points = [\n    [\n        [123.45165252685547, 25.73527164402261],\n        [123.49731445312499, 25.73527164402261],\n        [123.49731445312499, 25.750734064600884],\n        [123.45165252685547, 25.750734064600884],\n        [123.45165252685547, 25.73527164402261]\n    ]\n];\n\nexport default function (mapType, region) {\n    if (mapType === 'china' && region.name === '台湾') {\n        region.geometries.push({\n            type: 'polygon',\n            exterior: points[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\nimport {each} from 'zrender/src/core/util';\nimport parseGeoJson from './parseGeoJson';\nimport {makeInner} from '../../util/model';\n\n// Built-in GEO fixer.\nimport fixNanhai from './fix/nanhai';\nimport fixTextCoord from './fix/textCoord';\nimport fixGeoCoord from './fix/geoCoord';\nimport fixDiaoyuIsland from './fix/diaoyuIsland';\n\nvar inner = makeInner();\n\nexport default {\n\n    /**\n     * @param {string} mapName\n     * @param {Object} mapRecord {specialAreas, geoJSON}\n     * @return {Object} {regions, boundingRect}\n     */\n    load: function (mapName, mapRecord) {\n\n        var parsed = inner(mapRecord).parsed;\n\n        if (parsed) {\n            return parsed;\n        }\n\n        var specialAreas = mapRecord.specialAreas || {};\n        var geoJSON = mapRecord.geoJSON;\n        var regions;\n\n        // https://jsperf.com/try-catch-performance-overhead\n        try {\n            regions = geoJSON ? parseGeoJson(geoJSON) : [];\n        }\n        catch (e) {\n            throw new Error('Invalid geoJson format\\n' + e.message);\n        }\n\n        each(regions, function (region) {\n            var regionName = region.name;\n\n            fixTextCoord(mapName, region);\n            fixGeoCoord(mapName, region);\n            fixDiaoyuIsland(mapName, region);\n\n            // Some area like Alaska in USA map needs to be tansformed\n            // to look better\n            var specialArea = specialAreas[regionName];\n            if (specialArea) {\n                region.transformTo(\n                    specialArea.left, specialArea.top, specialArea.width, specialArea.height\n                );\n            }\n        });\n\n        fixNanhai(mapName, regions);\n\n        return (inner(mapRecord).parsed = {\n            regions: regions,\n            boundingRect: getBoundingRect(regions)\n        });\n    }\n};\n\nfunction getBoundingRect(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}\n\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {parseSVG, makeViewBoxTransform} from 'zrender/src/tool/parseSVG';\nimport Group from 'zrender/src/container/Group';\nimport Rect from 'zrender/src/graphic/shape/Rect';\nimport {assert, createHashMap} from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {makeInner} from '../../util/model';\n\nvar inner = makeInner();\n\nexport default {\n\n    /**\n     * @param {string} mapName\n     * @param {Object} mapRecord {specialAreas, geoJSON}\n     * @return {Object} {root, boundingRect}\n     */\n    load: function (mapName, mapRecord) {\n        var originRoot = inner(mapRecord).originRoot;\n        if (originRoot) {\n            return {\n                root: originRoot,\n                boundingRect: inner(mapRecord).boundingRect\n            };\n        }\n\n        var graphic = buildGraphic(mapRecord);\n\n        inner(mapRecord).originRoot = graphic.root;\n        inner(mapRecord).boundingRect = graphic.boundingRect;\n\n        return graphic;\n    },\n\n    makeGraphic: function (mapName, mapRecord, hostKey) {\n        // For performance consideration (in large SVG), graphic only maked\n        // when necessary and reuse them according to hostKey.\n        var field = inner(mapRecord);\n        var rootMap = field.rootMap || (field.rootMap = createHashMap());\n\n        var root = rootMap.get(hostKey);\n        if (root) {\n            return root;\n        }\n\n        var originRoot = field.originRoot;\n        var boundingRect = field.boundingRect;\n\n        // For performance, if originRoot is not used by a view,\n        // assign it to a view, but not reproduce graphic elements.\n        if (!field.originRootHostKey) {\n            field.originRootHostKey = hostKey;\n            root = originRoot;\n        }\n        else {\n            root = buildGraphic(mapRecord, boundingRect).root;\n        }\n\n        return rootMap.set(hostKey, root);\n    },\n\n    removeGraphic: function (mapName, mapRecord, hostKey) {\n        var field = inner(mapRecord);\n        var rootMap = field.rootMap;\n        rootMap && rootMap.removeKey(hostKey);\n        if (hostKey === field.originRootHostKey) {\n            field.originRootHostKey = null;\n        }\n    }\n};\n\nfunction buildGraphic(mapRecord, boundingRect) {\n    var svgXML = mapRecord.svgXML;\n    var result;\n    var root;\n\n    try {\n        result = svgXML && parseSVG(svgXML, {\n            ignoreViewBox: true,\n            ignoreRootClip: true\n        }) || {};\n        root = result.root;\n        assert(root != null);\n    }\n    catch (e) {\n        throw new Error('Invalid svg format\\n' + e.message);\n    }\n\n    var svgWidth = result.width;\n    var svgHeight = result.height;\n    var viewBoxRect = result.viewBoxRect;\n\n    if (!boundingRect) {\n        boundingRect = (svgWidth == null || svgHeight == null)\n            // If svg width / height not specified, calculate\n            // bounding rect as the width / height\n            ? root.getBoundingRect()\n            : new BoundingRect(0, 0, 0, 0);\n\n        if (svgWidth != null) {\n            boundingRect.width = svgWidth;\n        }\n        if (svgHeight != null) {\n            boundingRect.height = svgHeight;\n        }\n    }\n\n    if (viewBoxRect) {\n        var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect.width, boundingRect.height);\n        var elRoot = root;\n        root = new Group();\n        root.add(elRoot);\n        elRoot.scale = viewBoxTransform.scale;\n        elRoot.position = viewBoxTransform.position;\n    }\n\n    root.setClipPath(new Rect({\n        shape: boundingRect.plain()\n    }));\n\n    return {\n        root: root,\n        boundingRect: boundingRect\n    };\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport {each, createHashMap} from 'zrender/src/core/util';\nimport mapDataStorage from './mapDataStorage';\nimport geoJSONLoader from './geoJSONLoader';\nimport geoSVGLoader from './geoSVGLoader';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\n\nvar loaders = {\n    geoJSON: geoJSONLoader,\n    svg: geoSVGLoader\n};\n\nexport default {\n\n    /**\n     * @param {string} mapName\n     * @param {Object} nameMap\n     * @return {Object} source {regions, regionsMap, nameCoordMap, boundingRect}\n     */\n    load: function (mapName, nameMap) {\n        var regions = [];\n        var regionsMap = createHashMap();\n        var nameCoordMap = createHashMap();\n        var boundingRect;\n        var mapRecords = retrieveMap(mapName);\n\n        each(mapRecords, function (record) {\n            var singleSource = loaders[record.type].load(mapName, record);\n\n            each(singleSource.regions, function (region) {\n                var regionName = region.name;\n\n                // Try use the alias in geoNameMap\n                if (nameMap && nameMap.hasOwnProperty(regionName)) {\n                    region = region.cloneShallow(regionName = nameMap[regionName]);\n                }\n\n                regions.push(region);\n                regionsMap.set(regionName, region);\n                nameCoordMap.set(regionName, region.center);\n            });\n\n            var rect = singleSource.boundingRect;\n            if (rect) {\n                boundingRect\n                    ? boundingRect.union(rect)\n                    : (boundingRect = rect.clone());\n            }\n        });\n\n        return {\n            regions: regions,\n            regionsMap: regionsMap,\n            nameCoordMap: nameCoordMap,\n            // FIXME Always return new ?\n            boundingRect: boundingRect || new BoundingRect(0, 0, 0, 0)\n        };\n    },\n\n    /**\n     * @param {string} mapName\n     * @param {string} hostKey For cache.\n     * @return {Array.<module:zrender/Element>} Roots.\n     */\n    makeGraphic: makeInvoker('makeGraphic'),\n\n    /**\n     * @param {string} mapName\n     * @param {string} hostKey For cache.\n     */\n    removeGraphic: makeInvoker('removeGraphic')\n};\n\nfunction makeInvoker(methodName) {\n    return function (mapName, hostKey) {\n        var mapRecords = retrieveMap(mapName);\n        var results = [];\n\n        each(mapRecords, function (record) {\n            var method = loaders[record.type][methodName];\n            method && results.push(method(mapName, record, hostKey));\n        });\n\n        return results;\n    };\n}\n\nfunction mapNotExistsError(mapName) {\n    if (__DEV__) {\n        console.error(\n            'Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.'\n        );\n    }\n}\n\nfunction retrieveMap(mapName) {\n    var mapRecords = mapDataStorage.retrieveMap(mapName) || [];\n\n    if (__DEV__) {\n        if (!mapRecords.length) {\n            mapNotExistsError(mapName);\n        }\n    }\n\n    return mapRecords;\n}\n\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport createListSimply from '../helper/createListSimply';\nimport SeriesModel from '../../model/Series';\nimport {encodeHTML, addCommas} from '../../util/format';\nimport dataSelectableMixin from '../../component/helper/selectableMixin';\nimport {retrieveRawAttr} from '../../data/helper/dataProvider';\nimport geoSourceManager from '../../coord/geo/geoSourceManager';\n\nvar MapSeries = SeriesModel.extend({\n\n    type: 'series.map',\n\n    dependencies: ['geo'],\n\n    layoutMode: 'box',\n\n    /**\n     * Only first map series of same mapType will drawMap\n     * @type {boolean}\n     */\n    needsDrawMap: false,\n\n    /**\n     * Group of all map series with same mapType\n     * @type {boolean}\n     */\n    seriesGroup: [],\n\n    getInitialData: function (option) {\n        var data = createListSimply(this, ['value']);\n        var valueDim = data.mapDimension('value');\n        var dataNameMap = zrUtil.createHashMap();\n        var selectTargetList = [];\n        var toAppendNames = [];\n\n        for (var i = 0, len = data.count(); i < len; i++) {\n            var name = data.getName(i);\n            dataNameMap.set(name, true);\n            selectTargetList.push({\n                name: name,\n                value: data.get(valueDim, i),\n                selected: retrieveRawAttr(data, i, 'selected')\n            });\n        }\n\n        var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap);\n        zrUtil.each(geoSource.regions, function (region) {\n            var name = region.name;\n            if (!dataNameMap.get(name)) {\n                selectTargetList.push({name: name});\n                toAppendNames.push(name);\n            }\n        });\n\n        this.updateSelectedMap(selectTargetList);\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.appendValues([], toAppendNames);\n\n        return data;\n    },\n\n    /**\n     * If no host geo model, return null, which means using a\n     * inner exclusive geo model.\n     */\n    getHostGeoModel: function () {\n        var geoIndex = this.option.geoIndex;\n        return geoIndex != null\n            ? this.dependentModels.geo[geoIndex]\n            : null;\n    },\n\n    getMapType: function () {\n        return (this.getHostGeoModel() || this).option.map;\n    },\n\n    // _fillOption: function (option, mapName) {\n        // Shallow clone\n        // option = zrUtil.extend({}, option);\n\n        // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap);\n\n        // return option;\n    // },\n\n    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    /**\n     * Get model of region\n     * @param  {string} name\n     * @return {module:echarts/model/Model}\n     */\n    getRegionModel: function (regionName) {\n        var data = this.getData();\n        return data.getItemModel(data.indexOfName(regionName));\n    },\n\n    /**\n     * Map tooltip formatter\n     *\n     * @param {number} dataIndex\n     */\n    formatTooltip: function (dataIndex) {\n        // FIXME orignalData and data is a bit confusing\n        var data = this.getData();\n        var formattedValue = addCommas(this.getRawValue(dataIndex));\n        var name = data.getName(dataIndex);\n\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(\n                    encodeHTML(seriesGroup[i].name)\n                );\n            }\n        }\n\n        return seriesNames.join(', ') + '<br />'\n            + encodeHTML(name + ' : ' + formattedValue);\n    },\n\n    /**\n     * @implement\n     */\n    getTooltipPosition: function (dataIndex) {\n        if (dataIndex != null) {\n            var name = this.getData().getName(dataIndex);\n            var geo = this.coordinateSystem;\n            var region = geo.getRegion(name);\n\n            return region && geo.dataToPoint(region.center);\n        }\n    },\n\n    setZoom: function (zoom) {\n        this.option.zoom = zoom;\n    },\n\n    setCenter: function (center) {\n        this.option.center = center;\n    },\n\n    defaultOption: {\n        // 一级层叠\n        zlevel: 0,\n        // 二级层叠\n        z: 2,\n\n        coordinateSystem: 'geo',\n\n        // map should be explicitly specified since ec3.\n        map: '',\n\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\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\n        // Aspect is width / height. Inited to be geoJson bbox aspect\n        // This parameter is used for scale this aspect\n        aspectScale: 0.75,\n\n        ///// Layout with center and size\n        // If you wan't to put map in a fixed size box with right aspect ratio\n        // This two properties may more conveninet\n        // layoutCenter: [50%, 50%]\n        // layoutSize: 100\n\n\n        // 数值合并方式，默认加和，可选为：\n        // 'sum' | 'average' | 'max' | 'min'\n        // mapValueCalculation: 'sum',\n        // 地图数值计算结果小数精度\n        // mapValuePrecision: 0,\n\n\n        // 显示图例颜色标识（系列标识的小圆点），图例开启时有效\n        showLegendSymbol: true,\n        // 选择模式，默认关闭，可选single，multiple\n        // selectedMode: false,\n        dataRangeHoverLink: true,\n        // 是否开启缩放及漫游模式\n        // roam: false,\n\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\n        // Default on center of map\n        center: null,\n\n        zoom: 1,\n\n        scaleLimit: null,\n\n        label: {\n            show: false,\n            color: '#000'\n        },\n        // scaleLimit: null,\n        itemStyle: {\n            borderWidth: 0.5,\n            borderColor: '#444',\n            areaColor: '#eee'\n        },\n\n        emphasis: {\n            label: {\n                show: true,\n                color: 'rgb(100,0,0)'\n            },\n            itemStyle: {\n                areaColor: 'rgba(255,215,0,0.8)'\n            }\n        }\n    }\n\n});\n\nzrUtil.mixin(MapSeries, dataSelectableMixin);\n\nexport default MapSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\n\nvar ATTR = '\\0_ec_interaction_mutex';\n\nexport function take(zr, resourceKey, userKey) {\n    var store = getStore(zr);\n    store[resourceKey] = userKey;\n}\n\nexport function release(zr, resourceKey, userKey) {\n    var store = getStore(zr);\n    var uKey = store[resourceKey];\n\n    if (uKey === userKey) {\n        store[resourceKey] = null;\n    }\n}\n\nexport function isTaken(zr, resourceKey) {\n    return !!getStore(zr)[resourceKey];\n}\n\nfunction getStore(zr) {\n    return zr[ATTR] || (zr[ATTR] = {});\n}\n\n/**\n * payload: {\n *     type: 'takeGlobalCursor',\n *     key: 'dataZoomSelect', or 'brush', or ...,\n *         If no userKey, release global cursor.\n * }\n */\necharts.registerAction(\n    {type: 'takeGlobalCursor', event: 'globalCursorTaken', update: 'update'},\n    function () {}\n);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Eventful from 'zrender/src/mixin/Eventful';\nimport * as eventTool from 'zrender/src/core/event';\nimport * as interactionMutex from './interactionMutex';\n\n/**\n * @alias module:echarts/component/helper/RoamController\n * @constructor\n * @mixin {module:zrender/mixin/Eventful}\n *\n * @param {module:zrender/zrender~ZRender} zr\n */\nfunction RoamController(zr) {\n\n    /**\n     * @type {Function}\n     */\n    this.pointerChecker;\n\n    /**\n     * @type {module:zrender}\n     */\n    this._zr = zr;\n\n    /**\n     * @type {Object}\n     */\n    this._opt = {};\n\n    // Avoid two roamController bind the same handler\n    var bind = zrUtil.bind;\n    var mousedownHandler = bind(mousedown, this);\n    var mousemoveHandler = bind(mousemove, this);\n    var mouseupHandler = bind(mouseup, this);\n    var mousewheelHandler = bind(mousewheel, this);\n    var pinchHandler = bind(pinch, this);\n\n    Eventful.call(this);\n\n    /**\n     * @param {Function} pointerChecker\n     *                   input: x, y\n     *                   output: boolean\n     */\n    this.setPointerChecker = function (pointerChecker) {\n        this.pointerChecker = pointerChecker;\n    };\n\n    /**\n     * Notice: 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     *\n     * @param  {boolean|string} [controlType=true] Specify the control type,\n     *                          which can be null/undefined or true/false\n     *                          or 'pan/move' or 'zoom'/'scale'\n     * @param {Object} [opt]\n     * @param {Object} [opt.zoomOnMouseWheel=true] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.\n     * @param {Object} [opt.moveOnMouseMove=true] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.\n     * @param {Object} [opt.moveOnMouseWheel=false] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.\n     * @param {Object} [opt.preventDefaultMouseMove=true] When pan.\n     */\n    this.enable = function (controlType, opt) {\n\n        // Disable previous first\n        this.disable();\n\n        this._opt = zrUtil.defaults(zrUtil.clone(opt) || {}, {\n            zoomOnMouseWheel: true,\n            moveOnMouseMove: true,\n            // By default, wheel do not trigger move.\n            moveOnMouseWheel: false,\n            preventDefaultMouseMove: true\n        });\n\n        if (controlType == null) {\n            controlType = true;\n        }\n\n        if (controlType === true || (controlType === 'move' || controlType === 'pan')) {\n            zr.on('mousedown', mousedownHandler);\n            zr.on('mousemove', mousemoveHandler);\n            zr.on('mouseup', mouseupHandler);\n        }\n        if (controlType === true || (controlType === 'scale' || controlType === 'zoom')) {\n            zr.on('mousewheel', mousewheelHandler);\n            zr.on('pinch', pinchHandler);\n        }\n    };\n\n    this.disable = function () {\n        zr.off('mousedown', mousedownHandler);\n        zr.off('mousemove', mousemoveHandler);\n        zr.off('mouseup', mouseupHandler);\n        zr.off('mousewheel', mousewheelHandler);\n        zr.off('pinch', pinchHandler);\n    };\n\n    this.dispose = this.disable;\n\n    this.isDragging = function () {\n        return this._dragging;\n    };\n\n    this.isPinching = function () {\n        return this._pinching;\n    };\n}\n\nzrUtil.mixin(RoamController, Eventful);\n\n\nfunction mousedown(e) {\n    if (eventTool.isMiddleOrRightButtonOnMouseUpDown(e)\n        || (e.target && e.target.draggable)\n    ) {\n        return;\n    }\n\n    var x = e.offsetX;\n    var y = e.offsetY;\n\n    // Only check on mosedown, but not mousemove.\n    // Mouse can be out of target when mouse moving.\n    if (this.pointerChecker && this.pointerChecker(e, x, y)) {\n        this._x = x;\n        this._y = y;\n        this._dragging = true;\n    }\n}\n\nfunction mousemove(e) {\n    if (!this._dragging\n        || !isAvailableBehavior('moveOnMouseMove', e, this._opt)\n        || e.gestureEvent === 'pinch'\n        || interactionMutex.isTaken(this._zr, 'globalPan')\n    ) {\n        return;\n    }\n\n    var x = e.offsetX;\n    var y = e.offsetY;\n\n    var oldX = this._x;\n    var oldY = this._y;\n\n    var dx = x - oldX;\n    var dy = y - oldY;\n\n    this._x = x;\n    this._y = y;\n\n    this._opt.preventDefaultMouseMove && eventTool.stop(e.event);\n\n    trigger(this, 'pan', 'moveOnMouseMove', e, {\n        dx: dx, dy: dy, oldX: oldX, oldY: oldY, newX: x, newY: y\n    });\n}\n\nfunction mouseup(e) {\n    if (!eventTool.isMiddleOrRightButtonOnMouseUpDown(e)) {\n        this._dragging = false;\n    }\n}\n\nfunction mousewheel(e) {\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\n    // wheelDelta maybe -0 in chrome mac.\n    if (wheelDelta === 0 || (!shouldZoom && !shouldMove)) {\n        return;\n    }\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\n    if (shouldZoom) {\n        // Convenience:\n        // Mac and VM Windows on Mac: scroll up: zoom out.\n        // Windows: scroll up: zoom in.\n\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        checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, {\n            scale: scale, originX: originX, originY: originY\n        });\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        checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, {\n            scrollDelta: scrollDelta, originX: originX, originY: originY\n        });\n    }\n}\n\nfunction pinch(e) {\n    if (interactionMutex.isTaken(this._zr, 'globalPan')) {\n        return;\n    }\n    var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1;\n    checkPointerAndTrigger(this, 'zoom', null, e, {\n        scale: scale, originX: e.pinchX, originY: e.pinchY\n    });\n}\n\nfunction checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) {\n    if (controller.pointerChecker\n        && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)\n    ) {\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\n        trigger(controller, eventName, behaviorToCheck, e, contollerEvent);\n    }\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 = zrUtil.bind(isAvailableBehavior, null, behaviorToCheck, e);\n    controller.trigger(eventName, contollerEvent);\n}\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 || (\n        setting && (!zrUtil.isString(setting) || e.event[setting + 'Key'])\n    );\n}\n\nexport default RoamController;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * For geo and graph.\n *\n * @param {Object} controllerHost\n * @param {module:zrender/Element} controllerHost.target\n */\nexport function updateViewOnPan(controllerHost, dx, dy) {\n    var target = controllerHost.target;\n    var pos = target.position;\n    pos[0] += dx;\n    pos[1] += dy;\n    target.dirty();\n}\n\n/**\n * For geo and graph.\n *\n * @param {Object} controllerHost\n * @param {module:zrender/Element} controllerHost.target\n * @param {number} controllerHost.zoom\n * @param {number} controllerHost.zoomLimit like: {min: 1, max: 2}\n */\nexport function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) {\n    var target = controllerHost.target;\n    var zoomLimit = controllerHost.zoomLimit;\n    var pos = target.position;\n    var scale = target.scale;\n\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(\n            Math.min(zoomMax, newZoom),\n            zoomMin\n        );\n    }\n    var zoomScale = newZoom / controllerHost.zoom;\n    controllerHost.zoom = newZoom;\n    // Keep the mouse center when scaling\n    pos[0] -= (zoomX - pos[0]) * (zoomScale - 1);\n    pos[1] -= (zoomY - pos[1]) * (zoomScale - 1);\n    scale[0] *= zoomScale;\n    scale[1] *= zoomScale;\n\n    target.dirty();\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nvar IRRELEVANT_EXCLUDES = {'axisPointer': 1, 'tooltip': 1, 'brush': 1};\n\n/**\n * Avoid that: mouse click on a elements that is over geo or graph,\n * but roam is triggered.\n */\nexport function onIrrelevantElement(e, api, targetCoordSysModel) {\n    var model = api.getComponentByElement(e.topTarget);\n    // If model is axisModel, it works only if it is injected with coordinateSystem.\n    var coordSys = model && model.coordinateSystem;\n    return model\n        && model !== targetCoordSysModel\n        && !IRRELEVANT_EXCLUDES[model.mainType]\n        && (coordSys && coordSys.model !== targetCoordSysModel);\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport RoamController from './RoamController';\nimport * as roamHelper from '../../component/helper/roamHelper';\nimport {onIrrelevantElement} from '../../component/helper/cursorHelper';\nimport * as graphic from '../../util/graphic';\nimport geoSourceManager from '../../coord/geo/geoSourceManager';\nimport {getUID} from '../../util/component';\n\nfunction getFixedItemStyle(model, scale) {\n    var itemStyle = model.getItemStyle();\n    var areaColor = model.get('areaColor');\n\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\n    return itemStyle;\n}\n\nfunction updateMapSelectHandler(mapDraw, mapOrGeoModel, regionsGroup, api, fromView) {\n    regionsGroup.off('click');\n    regionsGroup.off('mousedown');\n\n    if (mapOrGeoModel.get('selectedMode')) {\n\n        regionsGroup.on('mousedown', function () {\n            mapDraw._mouseDownFlag = true;\n        });\n\n        regionsGroup.on('click', function (e) {\n            if (!mapDraw._mouseDownFlag) {\n                return;\n            }\n            mapDraw._mouseDownFlag = false;\n\n            var el = e.target;\n            while (!el.__regions) {\n                el = el.parent;\n            }\n            if (!el) {\n                return;\n            }\n\n            var action = {\n                type: (mapOrGeoModel.mainType === 'geo' ? 'geo' : 'map') + 'ToggleSelect',\n                batch: zrUtil.map(el.__regions, function (region) {\n                    return {\n                        name: region.name,\n                        from: fromView.uid\n                    };\n                })\n            };\n            action[mapOrGeoModel.mainType + 'Id'] = mapOrGeoModel.id;\n\n            api.dispatchAction(action);\n\n            updateMapSelected(mapOrGeoModel, regionsGroup);\n        });\n    }\n}\n\nfunction updateMapSelected(mapOrGeoModel, regionsGroup) {\n    // FIXME\n    regionsGroup.eachChild(function (otherRegionEl) {\n        zrUtil.each(otherRegionEl.__regions, function (region) {\n            otherRegionEl.trigger(mapOrGeoModel.isSelected(region.name) ? 'emphasis' : 'normal');\n        });\n    });\n}\n\n/**\n * @alias module:echarts/component/helper/MapDraw\n * @param {module:echarts/ExtensionAPI} api\n * @param {boolean} updateGroup\n */\nfunction MapDraw(api, updateGroup) {\n\n    var group = new graphic.Group();\n\n    /**\n     * @type {string}\n     * @private\n     */\n    this.uid = getUID('ec_map_draw');\n\n    /**\n     * @type {module:echarts/component/helper/RoamController}\n     * @private\n     */\n    this._controller = new RoamController(api.getZr());\n\n    /**\n     * @type {Object} {target, zoom, zoomLimit}\n     * @private\n     */\n    this._controllerHost = {target: updateGroup ? group : null};\n\n    /**\n     * @type {module:zrender/container/Group}\n     * @readOnly\n     */\n    this.group = group;\n\n    /**\n     * @type {boolean}\n     * @private\n     */\n    this._updateGroup = updateGroup;\n\n    /**\n     * This flag is used to make sure that only one among\n     * `pan`, `zoom`, `click` can occurs, otherwise 'selected'\n     * action may be triggered when `pan`, which is unexpected.\n     * @type {booelan}\n     */\n    this._mouseDownFlag;\n\n    /**\n     * @type {string}\n     */\n    this._mapName;\n\n    /**\n     * @type {boolean}\n     */\n    this._initialized;\n\n    /**\n     * @type {module:zrender/container/Group}\n     */\n    group.add(this._regionsGroup = new graphic.Group());\n\n    /**\n     * @type {module:zrender/container/Group}\n     */\n    group.add(this._backgroundGroup = new graphic.Group());\n}\n\nMapDraw.prototype = {\n\n    constructor: MapDraw,\n\n    draw: function (mapOrGeoModel, ecModel, api, fromView, payload) {\n\n        var isGeo = mapOrGeoModel.mainType === 'geo';\n\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({mainType: 'series', subType: 'map'}, function (mapSeries) {\n            if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) {\n                data = mapSeries.getData();\n            }\n        });\n\n        var geo = mapOrGeoModel.coordinateSystem;\n\n        this._updateBackground(geo);\n\n        var regionsGroup = this._regionsGroup;\n        var group = this.group;\n\n        var scale = geo.scale;\n        var transform = {\n            position: geo.position,\n            scale: scale\n        };\n\n        // No animation when first draw or in action\n        if (!regionsGroup.childAt(0) || payload) {\n            group.attr(transform);\n        }\n        else {\n            graphic.updateProps(group, transform, mapOrGeoModel);\n        }\n\n        regionsGroup.removeAll();\n\n        var itemStyleAccessPath = ['itemStyle'];\n        var hoverItemStyleAccessPath = ['emphasis', 'itemStyle'];\n        var labelAccessPath = ['label'];\n        var hoverLabelAccessPath = ['emphasis', 'label'];\n        var nameMap = zrUtil.createHashMap();\n\n        zrUtil.each(geo.regions, function (region) {\n\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 = nameMap.get(region.name)\n                || nameMap.set(region.name, new graphic.Group());\n\n            var compoundPath = new graphic.CompoundPath({\n                segmentIgnoreThreshold: 1,\n                shape: {\n                    paths: []\n                }\n            });\n            regionGroup.add(compoundPath);\n\n            var regionModel = mapOrGeoModel.getRegionModel(region.name) || mapOrGeoModel;\n\n            var itemStyleModel = regionModel.getModel(itemStyleAccessPath);\n            var hoverItemStyleModel = regionModel.getModel(hoverItemStyleAccessPath);\n            var itemStyle = getFixedItemStyle(itemStyleModel, scale);\n            var hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale);\n\n            var labelModel = regionModel.getModel(labelAccessPath);\n            var hoverLabelModel = regionModel.getModel(hoverLabelAccessPath);\n\n            var dataIdx;\n            // Use the itemStyle in data if has data\n            if (data) {\n                dataIdx = data.indexOfName(region.name);\n                // Only visual color of each item will be used. It can be encoded by dataRange\n                // But visual color of series is used in symbol drawing\n                //\n                // Visual color for each series is for the symbol draw\n                var visualColor = data.getItemVisual(dataIdx, 'color', true);\n                if (visualColor) {\n                    itemStyle.fill = visualColor;\n                }\n            }\n\n            zrUtil.each(region.geometries, function (geometry) {\n                if (geometry.type !== 'polygon') {\n                    return;\n                }\n                compoundPath.shape.paths.push(new graphic.Polygon({\n                    segmentIgnoreThreshold: 1,\n                    shape: {\n                        points: geometry.exterior\n                    }\n                }));\n\n                for (var i = 0; i < (geometry.interiors ? geometry.interiors.length : 0); i++) {\n                    compoundPath.shape.paths.push(new graphic.Polygon({\n                        segmentIgnoreThreshold: 1,\n                        shape: {\n                            points: geometry.interiors[i]\n                        }\n                    }));\n                }\n            });\n\n            compoundPath.setStyle(itemStyle);\n            compoundPath.style.strokeNoScale = true;\n            compoundPath.culling = true;\n            // Label\n            var showLabel = labelModel.get('show');\n            var hoverShowLabel = hoverLabelModel.get('show');\n\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            // 4. Region has no series legendSymbol, which will be add a showLabel flag in mapSymbolLayout\n            if (\n                (isGeo || isDataNaN && (showLabel || hoverShowLabel))\n                || (itemLayout && itemLayout.showLabel)\n            ) {\n                var query = !isGeo ? dataIdx : region.name;\n                var labelFetcher;\n\n                // Consider dataIdx not found.\n                if (!data || dataIdx >= 0) {\n                    labelFetcher = mapOrGeoModel;\n                }\n\n                var textEl = new graphic.Text({\n                    position: region.center.slice(),\n                    // FIXME\n                    // label rotation is not support yet in geo or regions of series-map\n                    // that has no data. The rotation will be effected by this `scale`.\n                    // So needed to change to RectText?\n                    scale: [1 / scale[0], 1 / scale[1]],\n                    z2: 10,\n                    silent: true\n                });\n\n                graphic.setLabelStyle(\n                    textEl.style, textEl.hoverStyle = {}, labelModel, hoverLabelModel,\n                    {\n                        labelFetcher: labelFetcher,\n                        labelDataIndex: query,\n                        defaultText: region.name,\n                        useInsideStyle: false\n                    },\n                    {\n                        textAlign: 'center',\n                        textVerticalAlign: 'middle'\n                    }\n                );\n\n                regionGroup.add(textEl);\n            }\n\n            // setItemGraphicEl, setHoverStyle after all polygons and labels\n            // are added to the rigionGroup\n            if (data) {\n                data.setItemGraphicEl(dataIdx, regionGroup);\n            }\n            else {\n                var regionModel = mapOrGeoModel.getRegionModel(region.name);\n                // Package custom mouse event for geo component\n                compoundPath.eventData = {\n                    componentType: 'geo',\n                    componentIndex: mapOrGeoModel.componentIndex,\n                    geoIndex: mapOrGeoModel.componentIndex,\n                    name: region.name,\n                    region: (regionModel && regionModel.option) || {}\n                };\n            }\n\n            var groupRegions = regionGroup.__regions || (regionGroup.__regions = []);\n            groupRegions.push(region);\n\n            regionGroup.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode');\n            graphic.setHoverStyle(regionGroup, hoverItemStyle);\n\n            regionsGroup.add(regionGroup);\n        });\n\n        this._updateController(mapOrGeoModel, ecModel, api);\n\n        updateMapSelectHandler(this, mapOrGeoModel, regionsGroup, api, fromView);\n\n        updateMapSelected(mapOrGeoModel, regionsGroup);\n    },\n\n    remove: function () {\n        this._regionsGroup.removeAll();\n        this._backgroundGroup.removeAll();\n        this._controller.dispose();\n        this._mapName && geoSourceManager.removeGraphic(this._mapName, this.uid);\n        this._mapName = null;\n        this._controllerHost = {};\n    },\n\n    _updateBackground: function (geo) {\n        var mapName = geo.map;\n\n        if (this._mapName !== mapName) {\n            zrUtil.each(geoSourceManager.makeGraphic(mapName, this.uid), function (root) {\n                this._backgroundGroup.add(root);\n            }, this);\n        }\n\n        this._mapName = mapName;\n    },\n\n    _updateController: function (mapOrGeoModel, ecModel, api) {\n        var geo = mapOrGeoModel.coordinateSystem;\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n\n        controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit');\n        controllerHost.zoom = geo.getZoom();\n\n        // roamType is will be set default true if it is null\n        controller.enable(mapOrGeoModel.get('roam') || false);\n        var mainType = mapOrGeoModel.mainType;\n\n        function makeActionBase() {\n            var action = {\n                type: 'geoRoam',\n                componentType: mainType\n            };\n            action[mainType + 'Id'] = mapOrGeoModel.id;\n            return action;\n        }\n\n        controller.off('pan').on('pan', function (e) {\n            this._mouseDownFlag = false;\n\n            roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy);\n\n            api.dispatchAction(zrUtil.extend(makeActionBase(), {\n                dx: e.dx,\n                dy: e.dy\n            }));\n        }, this);\n\n        controller.off('zoom').on('zoom', function (e) {\n            this._mouseDownFlag = false;\n\n            roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n\n            api.dispatchAction(zrUtil.extend(makeActionBase(), {\n                zoom: e.scale,\n                originX: e.originX,\n                originY: e.originY\n            }));\n\n            if (this._updateGroup) {\n                var scale = this.group.scale;\n                this._regionsGroup.traverse(function (el) {\n                    if (el.type === 'text') {\n                        el.attr('scale', [1 / scale[0], 1 / scale[1]]);\n                    }\n                });\n            }\n        }, this);\n\n        controller.setPointerChecker(function (e, x, y) {\n            return geo.getViewRectAfterRoam().contain(x, y)\n                && !onIrrelevantElement(e, api, mapOrGeoModel);\n        });\n    }\n};\n\nexport default MapDraw;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport MapDraw from '../../component/helper/MapDraw';\n\nvar HIGH_DOWN_PROP = '__seriesMapHighDown';\nvar RECORD_VERSION_PROP = '__seriesMapCallKey';\n\nexport default echarts.extendChartView({\n\n    type: 'map',\n\n    render: function (mapModel, ecModel, api, payload) {\n        // Not render if it is an toggleSelect action from self\n        if (payload && payload.type === 'mapToggleSelect'\n            && payload.from === this.uid\n        ) {\n            return;\n        }\n\n        var group = this.group;\n        group.removeAll();\n\n        if (mapModel.getHostGeoModel()) {\n            return;\n        }\n\n        // Not update map if it is an roam action from self\n        if (!(payload && payload.type === 'geoRoam'\n                && payload.componentType === 'series'\n                && payload.seriesId === mapModel.id\n            )\n        ) {\n            if (mapModel.needsDrawMap) {\n                var mapDraw = this._mapDraw || new MapDraw(api, true);\n                group.add(mapDraw.group);\n\n                mapDraw.draw(mapModel, ecModel, api, this, payload);\n\n                this._mapDraw = mapDraw;\n            }\n            else {\n                // Remove drawed map\n                this._mapDraw && this._mapDraw.remove();\n                this._mapDraw = null;\n            }\n        }\n        else {\n            var mapDraw = this._mapDraw;\n            mapDraw && group.add(mapDraw.group);\n        }\n\n        mapModel.get('showLegendSymbol') && ecModel.getComponent('legend')\n            && this._renderSymbols(mapModel, ecModel, api);\n    },\n\n    remove: function () {\n        this._mapDraw && this._mapDraw.remove();\n        this._mapDraw = null;\n        this.group.removeAll();\n    },\n\n    dispose: function () {\n        this._mapDraw && this._mapDraw.remove();\n        this._mapDraw = null;\n    },\n\n    _renderSymbols: function (mapModel, ecModel, api) {\n        var originalData = mapModel.originalData;\n        var group = this.group;\n\n        originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) {\n            if (isNaN(value)) {\n                return;\n            }\n\n            var layout = originalData.getItemLayout(originalDataIndex);\n\n            if (!layout || !layout.point) {\n                // Not exists in map\n                return;\n            }\n\n            var point = layout.point;\n            var offset = layout.offset;\n\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                    fill: mapModel.getData().getVisual('color')\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 ? graphic.Z2_EMPHASIS_LIFT + 1 : 0)\n            });\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\n                var fullData = mapModel.mainSeries.getData();\n                var name = originalData.getName(originalDataIndex);\n\n                var fullIndex = fullData.indexOfName(name);\n\n                var itemModel = originalData.getItemModel(originalDataIndex);\n                var labelModel = itemModel.getModel('label');\n                var hoverLabelModel = itemModel.getModel('emphasis.label');\n\n                var regionGroup = fullData.getItemGraphicEl(fullIndex);\n\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 begining, and this scenario is rarely encountered.\n                // So it won't be fixed until have to.\n                var normalText = zrUtil.retrieve2(\n                    mapModel.getFormattedLabel(fullIndex, 'normal'),\n                    name\n                );\n                var emphasisText = zrUtil.retrieve2(\n                    mapModel.getFormattedLabel(fullIndex, 'emphasis'),\n                    normalText\n                );\n\n                var highDownRecord = regionGroup[HIGH_DOWN_PROP];\n                var recordVersion = Math.random();\n\n                // Prevent from register listeners duplicatedly when roaming.\n                if (!highDownRecord) {\n                    highDownRecord = regionGroup[HIGH_DOWN_PROP] = {};\n                    var onEmphasis = zrUtil.curry(onRegionHighDown, true);\n                    var onNormal = zrUtil.curry(onRegionHighDown, false);\n                    regionGroup.on('mouseover', onEmphasis)\n                        .on('mouseout', onNormal)\n                        .on('emphasis', onEmphasis)\n                        .on('normal', onNormal);\n                }\n\n                // Prevent removed regions effect current grapics.\n                regionGroup[RECORD_VERSION_PROP] = recordVersion;\n                zrUtil.extend(highDownRecord, {\n                    recordVersion: recordVersion,\n                    circle: circle,\n                    labelModel: labelModel,\n                    hoverLabelModel: hoverLabelModel,\n                    emphasisText: emphasisText,\n                    normalText: normalText\n                });\n\n                // FIXME\n                // Consider set option when emphasis.\n                enterRegionHighDown(highDownRecord, false);\n            }\n\n            group.add(circle);\n        });\n    }\n});\n\nfunction onRegionHighDown(toHighOrDown) {\n    var highDownRecord = this[HIGH_DOWN_PROP];\n    if (highDownRecord && highDownRecord.recordVersion === this[RECORD_VERSION_PROP]) {\n        enterRegionHighDown(highDownRecord, toHighOrDown);\n    }\n}\n\nfunction enterRegionHighDown(highDownRecord, toHighOrDown) {\n    var circle = highDownRecord.circle;\n    var labelModel = highDownRecord.labelModel;\n    var hoverLabelModel = highDownRecord.hoverLabelModel;\n    var emphasisText = highDownRecord.emphasisText;\n    var normalText = highDownRecord.normalText;\n\n    if (toHighOrDown) {\n        circle.style.extendFrom(\n            graphic.setTextStyle({}, hoverLabelModel, {\n                text: hoverLabelModel.get('show') ? emphasisText : null\n            }, {isRectText: true, useInsideStyle: false}, true)\n        );\n        // Make label upper than others if overlaps.\n        circle.__mapOriginalZ2 = circle.z2;\n        circle.z2 += graphic.Z2_EMPHASIS_LIFT;\n    }\n    else {\n        graphic.setTextStyle(circle.style, labelModel, {\n            text: labelModel.get('show') ? normalText : null,\n            textPosition: labelModel.getShallow('position') || 'bottom'\n        }, {isRectText: true, useInsideStyle: false});\n        // Trigger normalize style like padding.\n        circle.dirty(false);\n\n        if (circle.__mapOriginalZ2 != null) {\n            circle.z2 = circle.__mapOriginalZ2;\n            circle.__mapOriginalZ2 = 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 * @param {module:echarts/coord/View} view\n * @param {Object} payload\n * @param {Object} [zoomLimit]\n */\nexport function updateCenterAndZoom(\n    view, payload, zoomLimit\n) {\n    var previousZoom = view.getZoom();\n    var center = view.getCenter();\n    var zoom = payload.zoom;\n\n    var point = view.dataToPoint(center);\n\n    if (payload.dx != null && payload.dy != null) {\n        point[0] -= payload.dx;\n        point[1] -= payload.dy;\n\n        var center = view.pointToData(point);\n        view.setCenter(center);\n    }\n    if (zoom != null) {\n        if (zoomLimit) {\n            var zoomMin = zoomLimit.min || 0;\n            var zoomMax = zoomLimit.max || Infinity;\n            zoom = Math.max(\n                Math.min(previousZoom * zoom, zoomMax),\n                zoomMin\n            ) / previousZoom;\n        }\n\n        // Zoom on given point(originX, originY)\n        view.scale[0] *= zoom;\n        view.scale[1] *= zoom;\n        var position = view.position;\n        var fixX = (payload.originX - position[0]) * (zoom - 1);\n        var fixY = (payload.originY - position[1]) * (zoom - 1);\n\n        position[0] -= fixX;\n        position[1] -= fixY;\n\n        view.updateTransform();\n        // Get the new center\n        var center = view.pointToData(point);\n        view.setCenter(center);\n        view.setZoom(zoom * previousZoom);\n    }\n\n    return {\n        center: view.getCenter(),\n        zoom: view.getZoom()\n    };\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {updateCenterAndZoom} from './roamHelper';\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 */\necharts.registerAction({\n    type: 'geoRoam',\n    event: 'geoRoam',\n    update: 'updateTransform'\n}, function (payload, ecModel) {\n    var componentType = payload.componentType || 'series';\n\n    ecModel.eachComponent(\n        { mainType: componentType, query: payload },\n        function (componentModel) {\n            var geo = componentModel.coordinateSystem;\n            if (geo.type !== 'geo') {\n                return;\n            }\n\n            var res = updateCenterAndZoom(\n                geo, payload, componentModel.get('scaleLimit')\n            );\n\n            componentModel.setCenter\n                && componentModel.setCenter(res.center);\n\n            componentModel.setZoom\n                && componentModel.setZoom(res.zoom);\n\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                zrUtil.each(componentModel.seriesGroup, function (seriesModel) {\n                    seriesModel.setCenter(res.center);\n                    seriesModel.setZoom(res.zoom);\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 * Simple view coordinate system\n * Mapping given x, y to transformd view x, y\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as vector from 'zrender/src/core/vector';\nimport * as matrix from 'zrender/src/core/matrix';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport Transformable from 'zrender/src/mixin/Transformable';\n\nvar v2ApplyTransform = vector.applyTransform;\n\n// Dummy transform node\nfunction TransformDummy() {\n    Transformable.call(this);\n}\nzrUtil.mixin(TransformDummy, Transformable);\n\nfunction View(name) {\n    /**\n     * @type {string}\n     */\n    this.name = name;\n\n    /**\n     * @type {Object}\n     */\n    this.zoomLimit;\n\n    Transformable.call(this);\n\n    this._roamTransformable = new TransformDummy();\n\n    this._rawTransformable = new TransformDummy();\n\n    this._center;\n    this._zoom;\n}\n\nView.prototype = {\n\n    constructor: View,\n\n    type: 'view',\n\n    /**\n     * @param {Array.<string>}\n     * @readOnly\n     */\n    dimensions: ['x', 'y'],\n\n    /**\n     * Set bounding rect\n     * @param {number} x\n     * @param {number} y\n     * @param {number} width\n     * @param {number} height\n     */\n\n    // PENDING to getRect\n    setBoundingRect: function (x, y, width, height) {\n        this._rect = new BoundingRect(x, y, width, height);\n        return this._rect;\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    // PENDING to getRect\n    getBoundingRect: function () {\n        return this._rect;\n    },\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @param {number} width\n     * @param {number} height\n     */\n    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    /**\n     * Transformed to particular position and size\n     * @param {number} x\n     * @param {number} y\n     * @param {number} width\n     * @param {number} height\n     */\n    transformTo: function (x, y, width, height) {\n        var rect = this.getBoundingRect();\n        var rawTransform = this._rawTransformable;\n\n        rawTransform.transform = rect.calculateTransform(\n            new BoundingRect(x, y, width, height)\n        );\n\n        rawTransform.decomposeTransform();\n\n        this._updateTransform();\n    },\n\n    /**\n     * Set center of view\n     * @param {Array.<number>} [centerCoord]\n     */\n    setCenter: function (centerCoord) {\n        if (!centerCoord) {\n            return;\n        }\n        this._center = centerCoord;\n\n        this._updateCenterAndZoom();\n    },\n\n    /**\n     * @param {number} zoom\n     */\n    setZoom: function (zoom) {\n        zoom = zoom || 1;\n\n        var zoomLimit = this.zoomLimit;\n        if (zoomLimit) {\n            if (zoomLimit.max != null) {\n                zoom = Math.min(zoomLimit.max, zoom);\n            }\n            if (zoomLimit.min != null) {\n                zoom = Math.max(zoomLimit.min, zoom);\n            }\n        }\n        this._zoom = zoom;\n\n        this._updateCenterAndZoom();\n    },\n\n    /**\n     * Get default center without roam\n     */\n    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\n        return [cx, cy];\n    },\n\n    getCenter: function () {\n        return this._center || this.getDefaultCenter();\n    },\n\n    getZoom: function () {\n        return this._zoom || 1;\n    },\n\n    /**\n     * @return {Array.<number}\n     */\n    getRoamTransform: function () {\n        return this._roamTransformable.getLocalTransform();\n    },\n\n    /**\n     * Remove roam\n     */\n\n    _updateCenterAndZoom: function () {\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\n        center = vector.applyTransform([], center, rawTransformMatrix);\n        defaultCenter = vector.applyTransform([], defaultCenter, rawTransformMatrix);\n\n        roamTransform.origin = center;\n        roamTransform.position = [\n            defaultCenter[0] - center[0],\n            defaultCenter[1] - center[1]\n        ];\n        roamTransform.scale = [zoom, zoom];\n\n        this._updateTransform();\n    },\n\n    /**\n     * Update transform from roam and mapLocation\n     * @private\n     */\n    _updateTransform: function () {\n        var roamTransformable = this._roamTransformable;\n        var rawTransformable = this._rawTransformable;\n\n        rawTransformable.parent = roamTransformable;\n        roamTransformable.updateTransform();\n        rawTransformable.updateTransform();\n\n        matrix.copy(this.transform || (this.transform = []), rawTransformable.transform || matrix.create());\n\n        this._rawTransform = rawTransformable.getLocalTransform();\n\n        this.invTransform = this.invTransform || [];\n        matrix.invert(this.invTransform, this.transform);\n\n        this.decomposeTransform();\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getViewRect: function () {\n        return this._viewRect;\n    },\n\n    /**\n     * Get view rect after roam transform\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getViewRectAfterRoam: function () {\n        var rect = this.getBoundingRect().clone();\n        rect.applyTransform(this.transform);\n        return rect;\n    },\n\n    /**\n     * Convert a single (lon, lat) data item to (x, y) point.\n     * @param {Array.<number>} data\n     * @param {boolean} noRoam\n     * @param {Array.<number>} [out]\n     * @return {Array.<number>}\n     */\n    dataToPoint: function (data, noRoam, out) {\n        var transform = noRoam ? this._rawTransform : this.transform;\n        out = out || [];\n        return transform\n            ? v2ApplyTransform(out, data, transform)\n            : vector.copy(out, data);\n    },\n\n    /**\n     * Convert a (x, y) point to (lon, lat) data\n     * @param {Array.<number>} point\n     * @return {Array.<number>}\n     */\n    pointToData: function (point) {\n        var invTransform = this.invTransform;\n        return invTransform\n            ? v2ApplyTransform([], point, invTransform)\n            : [point[0], point[1]];\n    },\n\n    /**\n     * @implements\n     * see {module:echarts/CoodinateSystem}\n     */\n    convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),\n\n    /**\n     * @implements\n     * see {module:echarts/CoodinateSystem}\n     */\n    convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),\n\n    /**\n     * @implements\n     * see {module:echarts/CoodinateSystem}\n     */\n    containPoint: function (point) {\n        return this.getViewRectAfterRoam().contain(point[0], point[1]);\n    }\n\n    /**\n     * @return {number}\n     */\n    // getScalarScale: function () {\n    //     // Use determinant square root of transform to mutiply scalar\n    //     var m = this.transform;\n    //     var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1]));\n    //     return det;\n    // }\n};\n\nzrUtil.mixin(View, Transformable);\n\nfunction doConvert(methodName, ecModel, finder, value) {\n    var seriesModel = finder.seriesModel;\n    var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.\n    return coordSys === this ? coordSys[methodName](value) : null;\n}\n\nexport default View;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport View from '../View';\nimport geoSourceManager from './geoSourceManager';\n\n\n/**\n * [Geo description]\n * For backward compatibility, the orginal interface:\n * `name, map, geoJson, specialAreas, nameMap` is kept.\n *\n * @param {string|Object} name\n * @param {string} map Map type\n *        Specify the positioned areas by left, top, width, height\n * @param {Object.<string, string>} [nameMap]\n *        Specify name alias\n * @param {boolean} [invertLongitute=true]\n */\nfunction Geo(name, map, nameMap, invertLongitute) {\n\n    View.call(this, name);\n\n    /**\n     * Map type\n     * @type {string}\n     */\n    this.map = map;\n\n    var source = geoSourceManager.load(map, nameMap);\n\n    this._nameCoordMap = source.nameCoordMap;\n    this._regionsMap = source.regionsMap;\n    this._invertLongitute = invertLongitute == null ? true : invertLongitute;\n\n    /**\n     * @readOnly\n     */\n    this.regions = source.regions;\n\n    /**\n     * @type {module:zrender/src/core/BoundingRect}\n     */\n    this._rect = source.boundingRect;\n}\n\nGeo.prototype = {\n\n    constructor: Geo,\n\n    type: 'geo',\n\n    /**\n     * @param {Array.<string>}\n     * @readOnly\n     */\n    dimensions: ['lng', 'lat'],\n\n    /**\n     * If contain given lng,lat coord\n     * @param {Array.<number>}\n     * @readOnly\n     */\n    containCoord: function (coord) {\n        var regions = this.regions;\n        for (var i = 0; i < regions.length; i++) {\n            if (regions[i].contain(coord)) {\n                return true;\n            }\n        }\n        return false;\n    },\n\n    /**\n     * @override\n     */\n    transformTo: function (x, y, width, height) {\n        var rect = this.getBoundingRect();\n        var invertLongitute = this._invertLongitute;\n\n        rect = rect.clone();\n\n        if (invertLongitute) {\n            // Longitute is inverted\n            rect.y = -rect.y - rect.height;\n        }\n\n        var rawTransformable = this._rawTransformable;\n\n        rawTransformable.transform = rect.calculateTransform(\n            new BoundingRect(x, y, width, height)\n        );\n\n        rawTransformable.decomposeTransform();\n\n        if (invertLongitute) {\n            var scale = rawTransformable.scale;\n            scale[1] = -scale[1];\n        }\n\n        rawTransformable.updateTransform();\n\n        this._updateTransform();\n    },\n\n    /**\n     * @param {string} name\n     * @return {module:echarts/coord/geo/Region}\n     */\n    getRegion: function (name) {\n        return this._regionsMap.get(name);\n    },\n\n    getRegionByCoord: function (coord) {\n        var regions = this.regions;\n        for (var i = 0; i < regions.length; i++) {\n            if (regions[i].contain(coord)) {\n                return regions[i];\n            }\n        }\n    },\n\n    /**\n     * Add geoCoord for indexing by name\n     * @param {string} name\n     * @param {Array.<number>} geoCoord\n     */\n    addGeoCoord: function (name, geoCoord) {\n        this._nameCoordMap.set(name, geoCoord);\n    },\n\n    /**\n     * Get geoCoord by name\n     * @param {string} name\n     * @return {Array.<number>}\n     */\n    getGeoCoord: function (name) {\n        return this._nameCoordMap.get(name);\n    },\n\n    /**\n     * @override\n     */\n    getBoundingRect: function () {\n        return this._rect;\n    },\n\n    /**\n     * @param {string|Array.<number>} data\n     * @param {boolean} noRoam\n     * @param {Array.<number>} [out]\n     * @return {Array.<number>}\n     */\n    dataToPoint: function (data, noRoam, out) {\n        if (typeof data === 'string') {\n            // Map area name to geoCoord\n            data = this.getGeoCoord(data);\n        }\n        if (data) {\n            return View.prototype.dataToPoint.call(this, data, noRoam, out);\n        }\n    },\n\n    /**\n     * @override\n     */\n    convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),\n\n    /**\n     * @override\n     */\n    convertFromPixel: zrUtil.curry(doConvert, 'pointToData')\n\n};\n\nzrUtil.mixin(Geo, View);\n\nfunction doConvert(methodName, ecModel, finder, value) {\n    var geoModel = finder.geoModel;\n    var seriesModel = finder.seriesModel;\n\n    var coordSys = geoModel\n        ? geoModel.coordinateSystem\n        : seriesModel\n        ? (\n            seriesModel.coordinateSystem // For map.\n            || (seriesModel.getReferringComponents('geo')[0] || {}).coordinateSystem\n        )\n        : null;\n\n    return coordSys === this ? coordSys[methodName](value) : null;\n}\n\nexport default Geo;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport Geo from './Geo';\nimport * as layout from '../../util/layout';\nimport * as numberUtil from '../../util/number';\nimport geoSourceManager from './geoSourceManager';\nimport mapDataStorage from './mapDataStorage';\n\n/**\n * Resize method bound to the geo\n * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel\n * @param {module:echarts/ExtensionAPI} api\n */\nfunction resizeGeo(geoModel, api) {\n\n    var boundingCoords = geoModel.get('boundingCoords');\n    if (boundingCoords != null) {\n        var leftTop = boundingCoords[0];\n        var rightBottom = boundingCoords[1];\n        if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) {\n            if (__DEV__) {\n                console.error('Invalid boundingCoords');\n            }\n        }\n        else {\n            this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]);\n        }\n    }\n\n    var rect = this.getBoundingRect();\n\n    var boxLayoutOption;\n\n    var center = geoModel.get('layoutCenter');\n    var size = geoModel.get('layoutSize');\n\n    var viewWidth = api.getWidth();\n    var viewHeight = api.getHeight();\n\n    var aspect = rect.width / rect.height * this.aspectScale;\n\n    var useCenterAndSize = false;\n\n    if (center && size) {\n        center = [\n            numberUtil.parsePercent(center[0], viewWidth),\n            numberUtil.parsePercent(center[1], viewHeight)\n        ];\n        size = numberUtil.parsePercent(size, Math.min(viewWidth, viewHeight));\n\n        if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {\n            useCenterAndSize = true;\n        }\n        else {\n            if (__DEV__) {\n                console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.');\n            }\n        }\n    }\n\n    var viewRect;\n    if (useCenterAndSize) {\n        var viewRect = {};\n        if (aspect > 1) {\n            // Width is same with size\n            viewRect.width = size;\n            viewRect.height = size / aspect;\n        }\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    }\n    else {\n        // Use left/top/width/height\n        boxLayoutOption = geoModel.getBoxLayoutParams();\n\n        // 0.75 rate\n        boxLayoutOption.aspect = aspect;\n\n        viewRect = layout.getLayoutRect(boxLayoutOption, {\n            width: viewWidth,\n            height: viewHeight\n        });\n    }\n\n    this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);\n\n    this.setCenter(geoModel.get('center'));\n    this.setZoom(geoModel.get('zoom'));\n}\n\n/**\n * @param {module:echarts/coord/Geo} geo\n * @param {module:echarts/model/Model} model\n * @inner\n */\nfunction setGeoCoords(geo, model) {\n    zrUtil.each(model.get('geoCoord'), function (geoCoord, name) {\n        geo.addGeoCoord(name, geoCoord);\n    });\n}\n\nvar geoCreator = {\n\n    // For deciding which dimensions to use when creating list data\n    dimensions: Geo.prototype.dimensions,\n\n    create: function (ecModel, api) {\n        var geoList = [];\n\n        // FIXME Create each time may be slow\n        ecModel.eachComponent('geo', function (geoModel, idx) {\n            var name = geoModel.get('map');\n\n            var aspectScale = geoModel.get('aspectScale');\n            var invertLongitute = true;\n            var mapRecords = mapDataStorage.retrieveMap(name);\n            if (mapRecords && mapRecords[0] && mapRecords[0].type === 'svg') {\n                aspectScale == null && (aspectScale = 1);\n                invertLongitute = false;\n            }\n            else {\n                aspectScale == null && (aspectScale = 0.75);\n            }\n\n            var geo = new Geo(name + idx, name, geoModel.get('nameMap'), invertLongitute);\n\n            geo.aspectScale = aspectScale;\n            geo.zoomLimit = geoModel.get('scaleLimit');\n            geoList.push(geo);\n\n            setGeoCoords(geo, geoModel);\n\n            geoModel.coordinateSystem = geo;\n            geo.model = geoModel;\n\n            // Inject resize method\n            geo.resize = resizeGeo;\n\n            geo.resize(geoModel, api);\n        });\n\n        ecModel.eachSeries(function (seriesModel) {\n            var coordSys = seriesModel.get('coordinateSystem');\n            if (coordSys === 'geo') {\n                var geoIndex = seriesModel.get('geoIndex') || 0;\n                seriesModel.coordinateSystem = geoList[geoIndex];\n            }\n        });\n\n        // If has map series\n        var mapModelGroupBySeries = {};\n\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\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.mergeAll(nameMapList));\n\n            geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) {\n                return singleMapSeries.get('scaleLimit');\n            }));\n            geoList.push(geo);\n\n            // Inject resize method\n            geo.resize = resizeGeo;\n            geo.aspectScale = mapSeries[0].get('aspectScale');\n\n            geo.resize(mapSeries[0], api);\n\n            zrUtil.each(mapSeries, function (singleMapSeries) {\n                singleMapSeries.coordinateSystem = geo;\n\n                setGeoCoords(geo, singleMapSeries);\n            });\n        });\n\n        return geoList;\n    },\n\n    /**\n     * Fill given regions array\n     * @param  {Array.<Object>} originRegionArr\n     * @param  {string} mapName\n     * @param  {Object} [nameMap]\n     * @return {Array}\n     */\n    getFilledRegions: function (originRegionArr, mapName, nameMap) {\n        // Not use the original\n        var regionsArr = (originRegionArr || []).slice();\n\n        var dataNameMap = zrUtil.createHashMap();\n        for (var i = 0; i < regionsArr.length; i++) {\n            dataNameMap.set(regionsArr[i].name, regionsArr[i]);\n        }\n\n        var source = geoSourceManager.load(mapName, nameMap);\n        zrUtil.each(source.regions, function (region) {\n            var name = region.name;\n            !dataNameMap.get(name) && regionsArr.push({name: name});\n        });\n\n        return regionsArr;\n    }\n};\n\necharts.registerCoordinateSystem('geo', geoCreator);\n\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\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (ecModel) {\n\n    var processedMapType = {};\n\n    ecModel.eachSeriesByType('map', function (mapSeries) {\n        var mapType = mapSeries.getMapType();\n        if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {\n            return;\n        }\n\n        var mapSymbolOffsets = {};\n\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\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\n                    var offset = mapSymbolOffsets[name] || 0;\n\n                    var point = geo.dataToPoint(region.center);\n\n                    mapSymbolOffsets[name] = offset + 1;\n\n                    data.setItemLayout(idx, {\n                        point: point,\n                        offset: offset\n                    });\n                });\n            }\n        });\n\n        // Show label of those region not has legendSymbol(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\n        processedMapType[mapType] = 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\nexport default function (ecModel) {\n    ecModel.eachSeriesByType('map', function (seriesModel) {\n        var colorList = seriesModel.get('color');\n        var itemStyleModel = seriesModel.getModel('itemStyle');\n\n        var areaColor = itemStyleModel.get('areaColor');\n        var color = itemStyleModel.get('color')\n            || colorList[seriesModel.seriesIndex % colorList.length];\n\n        seriesModel.getData().setVisual({\n            'areaColor': areaColor,\n            'color': color\n        });\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\n// FIXME 公用？\n/**\n * @param {Array.<module:echarts/data/List>} datas\n * @param {string} statisticType 'average' 'sum'\n * @inner\n */\nfunction dataStatistics(datas, statisticType) {\n    var dataNameMap = {};\n\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\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        }\n        else if (statisticType === 'max') {\n            result = max;\n        }\n        else if (statisticType === 'average') {\n            result = sum / len;\n        }\n        else {\n            result = sum;\n        }\n        return len === 0 ? NaN : result;\n    });\n}\n\nexport default function (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\n    zrUtil.each(seriesGroups, function (seriesList, key) {\n        var data = dataStatistics(\n            zrUtil.map(seriesList, function (seriesModel) {\n                return seriesModel.getData();\n            }),\n            seriesList[0].get('mapValueCalculation')\n        );\n\n        for (var i = 0; i < seriesList.length; i++) {\n            seriesList[i].originalData = seriesList[i].getData();\n        }\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\n            seriesList[i].setData(data.cloneShallow());\n            seriesList[i].mainSeries = seriesList[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\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (option) {\n    // Save geoCoord\n    var mapSeries = [];\n    zrUtil.each(option.series, function (seriesOpt) {\n        if (seriesOpt && seriesOpt.type === 'map') {\n            mapSeries.push(seriesOpt);\n            seriesOpt.map = seriesOpt.map || seriesOpt.mapType;\n            // Put x, y, width, height, x2, y2 in the top level\n            zrUtil.defaults(seriesOpt, seriesOpt.mapLocation);\n        }\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './map/MapSeries';\nimport './map/MapView';\nimport '../action/geoRoam';\nimport '../coord/geo/geoCreator';\n\nimport mapSymbolLayout from './map/mapSymbolLayout';\nimport mapVisual from './map/mapVisual';\nimport mapDataStatistic from './map/mapDataStatistic';\nimport backwardCompat from './map/backwardCompat';\nimport createDataSelectAction from '../action/createDataSelectAction';\n\necharts.registerLayout(mapSymbolLayout);\necharts.registerVisual(mapVisual);\necharts.registerProcessor(echarts.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic);\necharts.registerPreprocessor(backwardCompat);\n\ncreateDataSelectAction('map', [{\n    type: 'mapToggleSelect',\n    event: 'mapselectchanged',\n    method: 'toggleSelected'\n}, {\n    type: 'mapSelect',\n    event: 'mapselected',\n    method: 'select'\n}, {\n    type: 'mapUnSelect',\n    event: 'mapunselected',\n    method: 'unSelect'\n}]);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Link lists and struct (graph or tree)\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar each = zrUtil.each;\n\nvar DATAS = '\\0__link_datas';\nvar MAIN_DATA = '\\0__link_mainData';\n\n// Caution:\n// In most case, either list or its shallow clones (see list.cloneShallow)\n// is active in echarts process. So considering heap memory consumption,\n// we do not clone tree or graph, but share them among list and its shallow clones.\n// But in some rare case, we have to keep old list (like do animation in chart). So\n// please take care that both the old list and the new list share the same tree/graph.\n\n/**\n * @param {Object} opt\n * @param {module:echarts/data/List} opt.mainData\n * @param {Object} [opt.struct] For example, instance of Graph or Tree.\n * @param {string} [opt.structAttr] designation: list[structAttr] = struct;\n * @param {Object} [opt.datas] {dataType: data},\n *                 like: {node: nodeList, edge: edgeList}.\n *                 Should contain mainData.\n * @param {Object} [opt.datasAttr] {dataType: attr},\n *                 designation: struct[datasAttr[dataType]] = list;\n */\nfunction linkList(opt) {\n    var mainData = opt.mainData;\n    var datas = opt.datas;\n\n    if (!datas) {\n        datas = {main: mainData};\n        opt.datasAttr = {main: 'data'};\n    }\n    opt.datas = opt.mainData = null;\n\n    linkAll(mainData, datas, opt);\n\n    // Porxy data original methods.\n    each(datas, function (data) {\n        each(mainData.TRANSFERABLE_METHODS, function (methodName) {\n            data.wrapMethod(methodName, zrUtil.curry(transferInjection, opt));\n        });\n\n    });\n\n    // Beyond transfer, additional features should be added to `cloneShallow`.\n    mainData.wrapMethod('cloneShallow', zrUtil.curry(cloneShallowInjection, opt));\n\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, zrUtil.curry(changeInjection, opt));\n    });\n\n    // Make sure datas contains mainData.\n    zrUtil.assert(datas[mainData.dataType] === mainData);\n}\n\nfunction transferInjection(opt, res) {\n    if (isMainData(this)) {\n        // Transfer datas to new main data.\n        var datas = zrUtil.extend({}, this[DATAS]);\n        datas[this.dataType] = res;\n        linkAll(res, datas, opt);\n    }\n    else {\n        // Modify the reference in main data to point newData.\n        linkSingle(res, this.dataType, this[MAIN_DATA], opt);\n    }\n    return res;\n}\n\nfunction changeInjection(opt, res) {\n    opt.struct && opt.struct.update(this);\n    return res;\n}\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(res[DATAS], function (data, dataType) {\n        data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);\n    });\n    return res;\n}\n\n/**\n * Supplement method to List.\n *\n * @public\n * @param {string} [dataType] If not specified, return mainData.\n * @return {module:echarts/data/List}\n */\nfunction getLinkedData(dataType) {\n    var mainData = this[MAIN_DATA];\n    return (dataType == null || mainData == null)\n        ? mainData\n        : mainData[DATAS][dataType];\n}\n\nfunction isMainData(data) {\n    return data[MAIN_DATA] === data;\n}\n\nfunction linkAll(mainData, datas, opt) {\n    mainData[DATAS] = {};\n    each(datas, function (data, dataType) {\n        linkSingle(data, dataType, mainData, opt);\n    });\n}\n\nfunction linkSingle(data, dataType, mainData, opt) {\n    mainData[DATAS][dataType] = data;\n    data[MAIN_DATA] = mainData;\n    data.dataType = dataType;\n\n    if (opt.struct) {\n        data[opt.structAttr] = opt.struct;\n        opt.struct[opt.datasAttr[dataType]] = data;\n    }\n\n    // Supplement method.\n    data.getLinkedData = getLinkedData;\n}\n\nexport default linkList;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Tree data structure\n *\n * @module echarts/data/Tree\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Model from '../model/Model';\nimport linkList from './helper/linkList';\nimport List from './List';\nimport createDimensions from './helper/createDimensions';\n\n/**\n * @constructor module:echarts/data/Tree~TreeNode\n * @param {string} name\n * @param {module:echarts/data/Tree} hostTree\n */\nvar TreeNode = function (name, hostTree) {\n    /**\n     * @type {string}\n     */\n    this.name = name || '';\n\n    /**\n     * Depth of node\n     *\n     * @type {number}\n     * @readOnly\n     */\n    this.depth = 0;\n\n    /**\n     * Height of the subtree rooted at this node.\n     * @type {number}\n     * @readOnly\n     */\n    this.height = 0;\n\n    /**\n     * @type {module:echarts/data/Tree~TreeNode}\n     * @readOnly\n     */\n    this.parentNode = null;\n\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     * @type {Object}\n     * @readOnly\n     */\n    this.dataIndex = -1;\n\n    /**\n     * @type {Array.<module:echarts/data/Tree~TreeNode>}\n     * @readOnly\n     */\n    this.children = [];\n\n    /**\n     * @type {Array.<module:echarts/data/Tree~TreeNode>}\n     * @pubilc\n     */\n    this.viewChildren = [];\n\n    /**\n     * @type {moduel:echarts/data/Tree}\n     * @readOnly\n     */\n    this.hostTree = hostTree;\n};\n\nTreeNode.prototype = {\n\n    constructor: TreeNode,\n\n    /**\n     * The node is removed.\n     * @return {boolean} is removed.\n     */\n    isRemoved: function () {\n        return this.dataIndex < 0;\n    },\n\n    /**\n     * Travel this subtree (include this node).\n     * Usage:\n     *    node.eachNode(function () { ... }); // preorder\n     *    node.eachNode('preorder', function () { ... }); // preorder\n     *    node.eachNode('postorder', function () { ... }); // postorder\n     *    node.eachNode(\n     *        {order: 'postorder', attr: 'viewChildren'},\n     *        function () { ... }\n     *    ); // postorder\n     *\n     * @param {(Object|string)} options If string, means order.\n     * @param {string=} options.order 'preorder' or 'postorder'\n     * @param {string=} options.attr 'children' or 'viewChildren'\n     * @param {Function} cb If in preorder and return false,\n     *                      its subtree will not be visited.\n     * @param {Object} [context]\n     */\n    eachNode: function (options, cb, context) {\n        if (typeof options === 'function') {\n            context = cb;\n            cb = options;\n            options = null;\n        }\n\n        options = options || {};\n        if (zrUtil.isString(options)) {\n            options = {order: options};\n        }\n\n        var order = options.order || 'preorder';\n        var children = this[options.attr || 'children'];\n\n        var suppressVisitSub;\n        order === 'preorder' && (suppressVisitSub = cb.call(context, this));\n\n        for (var i = 0; !suppressVisitSub && i < children.length; i++) {\n            children[i].eachNode(options, cb, context);\n        }\n\n        order === 'postorder' && cb.call(context, this);\n    },\n\n    /**\n     * Update depth and height of this subtree.\n     *\n     * @param  {number} depth\n     */\n    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\n    /**\n     * @param  {string} id\n     * @return {module:echarts/data/Tree~TreeNode}\n     */\n    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\n    /**\n     * @param {module:echarts/data/Tree~TreeNode} node\n     * @return {boolean}\n     */\n    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    /**\n     * @param {boolean} includeSelf Default false.\n     * @return {Array.<module:echarts/data/Tree~TreeNode>} order: [root, child, grandchild, ...]\n     */\n    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\n    /**\n     * @param {string|Array=} [dimension='value'] Default 'value'. can be 0, 1, 2, 3\n     * @return {number} Value.\n     */\n    getValue: function (dimension) {\n        var data = this.hostTree.data;\n        return data.get(data.getDimension(dimension || 'value'), this.dataIndex);\n    },\n\n    /**\n     * @param {Object} layout\n     * @param {boolean=} [merge=false]\n     */\n    setLayout: function (layout, merge) {\n        this.dataIndex >= 0\n            && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge);\n    },\n\n    /**\n     * @return {Object} layout\n     */\n    getLayout: function () {\n        return this.hostTree.data.getItemLayout(this.dataIndex);\n    },\n\n    /**\n     * @param {string} [path]\n     * @return {module:echarts/model/Model}\n     */\n    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        var levelModel = this.getLevelModel();\n        var leavesModel;\n        if (!levelModel && (this.children.length === 0 || (this.children.length !== 0 && this.isExpand === false))) {\n            leavesModel = this.getLeavesModel();\n        }\n        return itemModel.getModel(path, (levelModel || leavesModel || hostTree.hostModel).getModel(path));\n    },\n\n    /**\n     * @return {module:echarts/model/Model}\n     */\n    getLevelModel: function () {\n        return (this.hostTree.levelModels || [])[this.depth];\n    },\n\n    /**\n     * @return {module:echarts/model/Model}\n     */\n    getLeavesModel: function () {\n        return this.hostTree.leavesModel;\n    },\n\n    /**\n     * @example\n     *  setItemVisual('color', color);\n     *  setItemVisual({\n     *      'color': color\n     *  });\n     */\n    setVisual: function (key, value) {\n        this.dataIndex >= 0\n            && this.hostTree.data.setItemVisual(this.dataIndex, key, value);\n    },\n\n    /**\n     * Get item visual\n     */\n    getVisual: function (key, ignoreParent) {\n        return this.hostTree.data.getItemVisual(this.dataIndex, key, ignoreParent);\n    },\n\n    /**\n     * @public\n     * @return {number}\n     */\n    getRawIndex: function () {\n        return this.hostTree.data.getRawIndex(this.dataIndex);\n    },\n\n    /**\n     * @public\n     * @return {string}\n     */\n    getId: function () {\n        return this.hostTree.data.getId(this.dataIndex);\n    },\n\n    /**\n     * if this is an ancestor of another node\n     *\n     * @public\n     * @param {TreeNode} node another node\n     * @return {boolean} if is ancestor\n     */\n    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    /**\n     * if this is an descendant of another node\n     *\n     * @public\n     * @param {TreeNode} node another node\n     * @return {boolean} if is descendant\n     */\n    isDescendantOf: function (node) {\n        return node !== this && node.isAncestorOf(this);\n    }\n};\n\n/**\n * @constructor\n * @alias module:echarts/data/Tree\n * @param {module:echarts/model/Model} hostModel\n * @param {Array.<Object>} levelOptions\n * @param {Object} leavesOption\n */\nfunction Tree(hostModel, levelOptions, leavesOption) {\n    /**\n     * @type {module:echarts/data/Tree~TreeNode}\n     * @readOnly\n     */\n    this.root;\n\n    /**\n     * @type {module:echarts/data/List}\n     * @readOnly\n     */\n    this.data;\n\n    /**\n     * Index of each item is the same as the raw index of coresponding list item.\n     * @private\n     * @type {Array.<module:echarts/data/Tree~TreeNode}\n     */\n    this._nodes = [];\n\n    /**\n     * @private\n     * @readOnly\n     * @type {module:echarts/model/Model}\n     */\n    this.hostModel = hostModel;\n\n    /**\n     * @private\n     * @readOnly\n     * @type {Array.<module:echarts/model/Model}\n     */\n    this.levelModels = zrUtil.map(levelOptions || [], function (levelDefine) {\n        return new Model(levelDefine, hostModel, hostModel.ecModel);\n    });\n\n    this.leavesModel = new Model(leavesOption || {}, hostModel, hostModel.ecModel);\n}\n\nTree.prototype = {\n\n    constructor: Tree,\n\n    type: 'tree',\n\n    /**\n     * Travel this subtree (include this node).\n     * Usage:\n     *    node.eachNode(function () { ... }); // preorder\n     *    node.eachNode('preorder', function () { ... }); // preorder\n     *    node.eachNode('postorder', function () { ... }); // postorder\n     *    node.eachNode(\n     *        {order: 'postorder', attr: 'viewChildren'},\n     *        function () { ... }\n     *    ); // postorder\n     *\n     * @param {(Object|string)} options If string, means order.\n     * @param {string=} options.order 'preorder' or 'postorder'\n     * @param {string=} options.attr 'children' or 'viewChildren'\n     * @param {Function} cb\n     * @param {Object}   [context]\n     */\n    eachNode: function (options, cb, context) {\n        this.root.eachNode(options, cb, context);\n    },\n\n    /**\n     * @param {number} dataIndex\n     * @return {module:echarts/data/Tree~TreeNode}\n     */\n    getNodeByDataIndex: function (dataIndex) {\n        var rawIndex = this.data.getRawIndex(dataIndex);\n        return this._nodes[rawIndex];\n    },\n\n    /**\n     * @param {string} name\n     * @return {module:echarts/data/Tree~TreeNode}\n     */\n    getNodeByName: function (name) {\n        return this.root.getNodeByName(name);\n    },\n\n    /**\n     * Update item available by list,\n     * when list has been performed options like 'filterSelf' or 'map'.\n     */\n    update: function () {\n        var data = this.data;\n        var nodes = this._nodes;\n\n        for (var i = 0, len = nodes.length; i < len; i++) {\n            nodes[i].dataIndex = -1;\n        }\n\n        for (var i = 0, len = data.count(); i < len; i++) {\n            nodes[data.getRawIndex(i)].dataIndex = i;\n        }\n    },\n\n    /**\n     * Clear all layouts\n     */\n    clearLayouts: function () {\n        this.data.clearItemLayouts();\n    }\n};\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 * @static\n * @param {Object} dataRoot Root node.\n * @param {module:echarts/model/Model} hostModel\n * @param {Object} treeOptions\n * @param {Array.<Object>} treeOptions.levels\n * @param {Array.<Object>} treeOptions.leaves\n * @return module:echarts/data/Tree\n */\nTree.createTree = function (dataRoot, hostModel, treeOptions) {\n\n    var tree = new Tree(hostModel, treeOptions.levels, treeOptions.leaves);\n    var listData = [];\n    var dimMax = 1;\n\n    buildHierarchy(dataRoot);\n\n    function buildHierarchy(dataNode, parentNode) {\n        var value = dataNode.value;\n        dimMax = Math.max(dimMax, zrUtil.isArray(value) ? value.length : 1);\n\n        listData.push(dataNode);\n\n        var node = new TreeNode(dataNode.name, tree);\n        parentNode\n            ? addChild(node, parentNode)\n            : (tree.root = node);\n\n        tree._nodes.push(node);\n\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\n    tree.root.updateDepthAndHeight(0);\n\n    var dimensionsInfo = createDimensions(listData, {\n        coordDimensions: ['value'],\n        dimensionsCount: dimMax\n    });\n\n    var list = new List(dimensionsInfo, hostModel);\n    list.initData(listData);\n\n    linkList({\n        mainData: list,\n        struct: tree,\n        structAttr: 'tree'\n    });\n\n    tree.update();\n\n    return tree;\n};\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 *\n * @param {(module:echarts/data/Tree~TreeNode|Object)} child\n */\nfunction addChild(child, node) {\n    var children = node.children;\n    if (child.parentNode === node) {\n        return;\n    }\n\n    children.push(child);\n    child.parentNode = node;\n}\n\nexport default Tree;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport SeriesModel from '../../model/Series';\nimport Tree from '../../data/Tree';\nimport {encodeHTML} from '../../util/format';\n\nexport default SeriesModel.extend({\n\n    type: 'series.tree',\n\n    layoutInfo: null,\n\n    // can support the position parameters 'left', 'top','right','bottom', 'width',\n    // 'height' in the setOption() with 'merge' mode normal.\n    layoutMode: 'box',\n\n    /**\n     * Init a tree data structure from data in option series\n     * @param  {Object} option  the object used to config echarts view\n     * @return {module:echarts/data/List} storage initial data\n     */\n    getInitialData: function (option) {\n\n        //create an virtual root\n        var root = {name: option.name, children: option.data};\n\n        var leaves = option.leaves || {};\n\n        var treeOption = {};\n\n        treeOption.leaves = leaves;\n\n        var tree = Tree.createTree(root, this, treeOption);\n\n        var treeDepth = 0;\n\n        tree.eachNode('preorder', function (node) {\n            if (node.depth > treeDepth) {\n                treeDepth = node.depth;\n            }\n        });\n\n        var expandAndCollapse = option.expandAndCollapse;\n        var expandTreeDepth = (expandAndCollapse && option.initialTreeDepth >= 0)\n            ? option.initialTreeDepth : treeDepth;\n\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)\n                ? !item.collapsed\n                : node.depth <= expandTreeDepth;\n        });\n\n        return tree.data;\n    },\n\n    /**\n     * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'.\n     * @returns {string} orient\n     */\n    getOrient: function () {\n        var orient = this.get('orient');\n        if (orient === 'horizontal') {\n            orient = 'LR';\n        }\n        else if (orient === 'vertical') {\n            orient = 'TB';\n        }\n        return orient;\n    },\n\n    setZoom: function (zoom) {\n        this.option.zoom = zoom;\n    },\n\n    setCenter: function (center) {\n        this.option.center = center;\n    },\n\n    /**\n     * @override\n     * @param {number} dataIndex\n     */\n    formatTooltip: function (dataIndex) {\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 encodeHTML(name + (\n            (isNaN(value) || value == null) ? '' : ' : ' + value\n        ));\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        coordinateSystem: 'view',\n\n        // the position of the whole view\n        left: '12%',\n        top: '12%',\n        right: '12%',\n        bottom: '12%',\n\n        // the layout of the tree, two value can be selected, 'orthogonal' or 'radial'\n        layout: 'orthogonal',\n\n        roam: false, // true | false | 'move' | 'scale', see module:component/helper/RoamController.\n        // Symbol size scale ratio in roam\n        nodeScaleRatio: 0.4,\n\n        // Default on center of graph\n        center: null,\n\n        zoom: 1,\n\n        // The orient of orthoginal layout, can be setted to 'LR', 'TB', 'RL', 'BT'.\n        // and the backward compatibility configuration 'horizontal = LR', 'vertical = TB'.\n        orient: 'LR',\n\n        symbol: 'emptyCircle',\n\n        symbolSize: 7,\n\n        expandAndCollapse: true,\n\n        initialTreeDepth: 2,\n\n        lineStyle: {\n            color: '#ccc',\n            width: 1.5,\n            curveness: 0.5\n        },\n\n        itemStyle: {\n            color: 'lightsteelblue',\n            borderColor: '#c23531',\n            borderWidth: 1.5\n        },\n\n        label: {\n            show: true,\n            color: '#555'\n        },\n\n        leaves: {\n            label: {\n                show: true\n            }\n        },\n\n        animationEasing: 'linear',\n\n        animationDuration: 700,\n\n        animationDurationUpdate: 1000\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/*\n* A third-party license is embeded for some of the code in this file:\n* The tree layoutHelper implementation was originally copied from\n* \"d3.js\"(https://github.com/d3/d3-hierarchy) with\n* some modifications made for this project.\n* (see more details in the comment of the specific method below.)\n* The use of the source code of this file is also subject to the terms\n* and consitions of the licence of \"d3.js\" (BSD-3Clause, see\n* </licenses/LICENSE-d3>).\n*/\n\n/**\n * @file The layout algorithm of node-link tree diagrams. Here we using Reingold-Tilford algorithm to drawing\n *       the tree.\n */\n\nimport * as layout from '../../util/layout';\n\n/**\n * Initialize all computational message for following algorithm.\n *\n * @param  {module:echarts/data/Tree~TreeNode} root   The virtual root of the tree.\n */\nexport function init(root) {\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\n    var nodes = [root];\n    var node;\n    var children;\n\n    while (node = nodes.pop()) { // 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/**\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 *\n * @param  {module:echarts/data/Tree~TreeNode} node\n * @param {Function} separation\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        }\n        else {\n            node.hierNode.prelim = midPoint;\n        }\n    }\n    else if (subtreeW) {\n        node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);\n    }\n    node.parentNode.hierNode.defaultAncestor = apportion(\n        node,\n        subtreeW,\n        node.parentNode.hierNode.defaultAncestor || siblings[0],\n        separation\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 all real x-coordinates by summing up the modifiers recursively.\n *\n * @param  {module:echarts/data/Tree~TreeNode} node\n */\nexport function secondWalk(node) {\n    var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier;\n    node.setLayout({x: nodeX}, true);\n    node.hierNode.modifier += node.parentNode.hierNode.modifier;\n}\n\n\nexport function separation(cb) {\n    return arguments.length ? cb : defaultSeparation;\n}\n\n/**\n * Transform the common coordinate to radial coordinate.\n *\n * @param  {number} x\n * @param  {number} y\n * @return {Object}\n */\nexport function radialCoordinate(x, y) {\n    var radialCoor = {};\n    x -= Math.PI / 2;\n    radialCoor.x = y * Math.cos(x);\n    radialCoor.y = y * Math.sin(x);\n    return radialCoor;\n}\n\n/**\n * Get the layout position of the whole view.\n *\n * @param {module:echarts/model/Series} seriesModel  the model object of sankey series\n * @param {module:echarts/ExtensionAPI} api  provide the API list that the developer can call\n * @return {module:zrender/core/BoundingRect}  size of rect to draw the sankey view\n */\nexport function getViewRect(seriesModel, api) {\n    return layout.getLayoutRect(\n        seriesModel.getBoxLayoutParams(), {\n            width: api.getWidth(),\n            height: api.getHeight()\n        }\n    );\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 *\n * @param  {module:echarts/data/Tree~TreeNode} node\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/**\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 *\n * @param  {module:echarts/data/Tree~TreeNode} subtreeV\n * @param  {module:echarts/data/Tree~TreeNode} subtreeW\n * @param  {module:echarts/data/Tree~TreeNode} ancestor\n * @param  {Function} separation\n * @return {module:echarts/data/Tree~TreeNode}\n */\nfunction apportion(subtreeV, subtreeW, ancestor, separation) {\n\n    if (subtreeW) {\n        var nodeOutRight = subtreeV;\n        var nodeInRight = subtreeV;\n        var nodeOutLeft = nodeInRight.parentNode.children[0];\n        var nodeInLeft = subtreeW;\n\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\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\n                    - 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        }\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/**\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 *\n * @param  {module:echarts/data/Tree~TreeNode} node\n * @return {module:echarts/data/Tree~TreeNode}\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/**\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 *\n * @param  {module:echarts/data/Tree~TreeNode} node\n * @return {module:echarts/data/Tree~TreeNode}\n */\nfunction nextLeft(node) {\n    var children = node.children;\n    return children.length && node.isExpand ? children[0] : node.hierNode.thread;\n}\n\n/**\n * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor.\n * Otherwise, returns the specified ancestor.\n *\n * @param  {module:echarts/data/Tree~TreeNode} nodeInLeft\n * @param  {module:echarts/data/Tree~TreeNode} node\n * @param  {module:echarts/data/Tree~TreeNode} ancestor\n * @return {module:echarts/data/Tree~TreeNode}\n */\nfunction nextAncestor(nodeInLeft, node, ancestor) {\n    return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode\n        ? nodeInLeft.hierNode.ancestor : ancestor;\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 * Shifts the current subtree rooted at wr.\n * This is done by increasing prelim(w+) and modifier(w+) by shift.\n *\n * @param  {module:echarts/data/Tree~TreeNode} wl\n * @param  {module:echarts/data/Tree~TreeNode} wr\n * @param  {number} shift [description]\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/**\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport SymbolClz from '../helper/Symbol';\nimport {radialCoordinate} from './layoutHelper';\nimport * as echarts from '../../echarts';\nimport * as bbox from 'zrender/src/core/bbox';\nimport View from '../../coord/View';\nimport * as roamHelper from '../../component/helper/roamHelper';\nimport RoamController from '../../component/helper/RoamController';\nimport {onIrrelevantElement} from '../../component/helper/cursorHelper';\n\nexport default echarts.extendChartView({\n\n    type: 'tree',\n\n    /**\n     * Init the chart\n     * @override\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    init: function (ecModel, api) {\n\n        /**\n         * @private\n         * @type {module:echarts/data/Tree}\n         */\n        this._oldTree;\n\n        /**\n         * @private\n         * @type {module:zrender/container/Group}\n         */\n        this._mainGroup = new graphic.Group();\n\n        /**\n         * @private\n         * @type {module:echarts/componet/helper/RoamController}\n         */\n        this._controller = new RoamController(api.getZr());\n\n        this._controllerHost = {target: this.group};\n\n        this.group.add(this._mainGroup);\n    },\n\n    render: function (seriesModel, ecModel, api, payload) {\n        var data = seriesModel.getData();\n\n        var layoutInfo = seriesModel.layoutInfo;\n\n        var group = this._mainGroup;\n\n        var layout = seriesModel.get('layout');\n\n        if (layout === 'radial') {\n            group.attr('position', [layoutInfo.x + layoutInfo.width / 2, layoutInfo.y + layoutInfo.height / 2]);\n        }\n        else {\n            group.attr('position', [layoutInfo.x, layoutInfo.y]);\n        }\n\n        this._updateViewCoordSys(seriesModel);\n        this._updateController(seriesModel, ecModel, api);\n\n        var oldData = this._data;\n\n        var seriesScope = {\n            expandAndCollapse: seriesModel.get('expandAndCollapse'),\n            layout: layout,\n            orient: seriesModel.getOrient(),\n            curvature: seriesModel.get('lineStyle.curveness'),\n            symbolRotate: seriesModel.get('symbolRotate'),\n            symbolOffset: seriesModel.get('symbolOffset'),\n            hoverAnimation: seriesModel.get('hoverAnimation'),\n            useNameLabel: true,\n            fadeIn: true\n        };\n\n        data.diff(oldData)\n            .add(function (newIdx) {\n                if (symbolNeedsDraw(data, newIdx)) {\n                    // Create node and edge\n                    updateNode(data, newIdx, null, group, seriesModel, seriesScope);\n                }\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, seriesScope);\n                    return;\n                }\n                // Update node and edge\n                updateNode(data, newIdx, symbolEl, group, seriesModel, seriesScope);\n            })\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, seriesScope);\n                }\n            })\n            .execute();\n\n        this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');\n\n        this._updateNodeAndLinkScale(seriesModel);\n\n        if (seriesScope.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\n    _updateViewCoordSys: function (seriesModel) {\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 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\n        var viewCoordSys = seriesModel.coordinateSystem = new View();\n        viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n\n        viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n\n        viewCoordSys.setCenter(seriesModel.get('center'));\n        viewCoordSys.setZoom(seriesModel.get('zoom'));\n\n        // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group\n        this.group.attr({\n            position: viewCoordSys.position,\n            scale: viewCoordSys.scale\n        });\n\n        this._viewCoordSys = viewCoordSys;\n    },\n\n    _updateController: function (seriesModel, ecModel, api) {\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        var group = this.group;\n        controller.setPointerChecker(function (e, x, y) {\n            var rect = group.getBoundingRect();\n            rect.applyTransform(group.transform);\n            return rect.contain(x, y)\n                && !onIrrelevantElement(e, api, seriesModel);\n        });\n\n        controller.enable(seriesModel.get('roam'));\n        controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n        controllerHost.zoom = seriesModel.coordinateSystem.getZoom();\n\n        controller\n            .off('pan')\n            .off('zoom')\n            .on('pan', function (e) {\n                roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy);\n                api.dispatchAction({\n                    seriesId: seriesModel.id,\n                    type: 'treeRoam',\n                    dx: e.dx,\n                    dy: e.dy\n                });\n            }, this)\n            .on('zoom', function (e) {\n                roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n                api.dispatchAction({\n                    seriesId: seriesModel.id,\n                    type: 'treeRoam',\n                    zoom: e.scale,\n                    originX: e.originX,\n                    originY: e.originY\n                });\n                this._updateNodeAndLinkScale(seriesModel);\n            }, this);\n    },\n\n    _updateNodeAndLinkScale: function (seriesModel) {\n        var data = seriesModel.getData();\n\n        var nodeScale = this._getNodeGlobalScale(seriesModel);\n        var invScale = [nodeScale, nodeScale];\n\n        data.eachItemGraphicEl(function (el, idx) {\n            el.attr('scale', invScale);\n        });\n    },\n\n    _getNodeGlobalScale: function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys.type !== 'view') {\n            return 1;\n        }\n\n        var nodeScaleRatio = this._nodeScaleRatio;\n\n        var groupScale = coordSys.scale;\n        var groupZoom = (groupScale && groupScale[0]) || 1;\n        // Scale node when zoom changes\n        var roamZoom = coordSys.getZoom();\n        var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n\n        return nodeScale / groupZoom;\n    },\n\n    dispose: function () {\n        this._controller && this._controller.dispose();\n        this._controllerHost = {};\n    },\n\n    remove: function () {\n        this._mainGroup.removeAll();\n        this._data = null;\n    }\n\n});\n\nfunction symbolNeedsDraw(data, dataIndex) {\n    var layout = data.getItemLayout(dataIndex);\n\n    return layout\n        && !isNaN(layout.x) && !isNaN(layout.y)\n        && data.getItemVisual(dataIndex, 'symbol') !== 'none';\n}\n\nfunction getTreeNodeStyle(node, itemModel, seriesScope) {\n    seriesScope.itemModel = itemModel;\n    seriesScope.itemStyle = itemModel.getModel('itemStyle').getItemStyle();\n    seriesScope.hoverItemStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();\n    seriesScope.lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n    seriesScope.labelModel = itemModel.getModel('label');\n    seriesScope.hoverLabelModel = itemModel.getModel('emphasis.label');\n\n    if (node.isExpand === false && node.children.length !== 0) {\n        seriesScope.symbolInnerColor = seriesScope.itemStyle.fill;\n    }\n    else {\n        seriesScope.symbolInnerColor = '#fff';\n    }\n\n    return seriesScope;\n}\n\nfunction updateNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {\n    var isInit = !symbolEl;\n    var node = data.tree.getNodeByDataIndex(dataIndex);\n    var itemModel = node.getModel();\n    var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);\n    var virtualRoot = data.tree.root;\n\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        ? {\n            x: sourceSymbolEl.position[0],\n            y: sourceSymbolEl.position[1],\n            rawX: sourceSymbolEl.__radialOldRawX,\n            rawY: sourceSymbolEl.__radialOldRawY\n        }\n        : sourceLayout;\n    var targetLayout = node.getLayout();\n\n    if (isInit) {\n        symbolEl = new SymbolClz(data, dataIndex, seriesScope);\n        symbolEl.attr('position', [sourceOldLayout.x, sourceOldLayout.y]);\n    }\n    else {\n        symbolEl.updateData(data, dataIndex, seriesScope);\n    }\n\n    symbolEl.__radialOldRawX = symbolEl.__radialRawX;\n    symbolEl.__radialOldRawY = symbolEl.__radialRawY;\n    symbolEl.__radialRawX = targetLayout.rawX;\n    symbolEl.__radialRawY = targetLayout.rawY;\n\n    group.add(symbolEl);\n    data.setItemGraphicEl(dataIndex, symbolEl);\n    graphic.updateProps(symbolEl, {\n        position: [targetLayout.x, targetLayout.y]\n    }, seriesModel);\n\n    var symbolPath = symbolEl.getSymbolPath();\n\n    if (seriesScope.layout === 'radial') {\n        var realRoot = virtualRoot.children[0];\n        var rootLayout = realRoot.getLayout();\n        var length = realRoot.children.length;\n        var rad;\n        var isLeft;\n\n        if (targetLayout.x === rootLayout.x && node.isExpand === true) {\n            var center = {};\n            center.x = (realRoot.children[0].getLayout().x + realRoot.children[length - 1].getLayout().x) / 2;\n            center.y = (realRoot.children[0].getLayout().y + realRoot.children[length - 1].getLayout().y) / 2;\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        }\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            }\n            else {\n                isLeft = targetLayout.x > rootLayout.x;\n                if (!isLeft) {\n                    rad = rad - Math.PI;\n                }\n            }\n        }\n\n        var textPosition = isLeft ? 'left' : 'right';\n        symbolPath.setStyle({\n            textPosition: textPosition,\n            textRotation: -rad,\n            textOrigin: 'center',\n            verticalAlign: 'middle'\n        });\n    }\n\n    if (node.parentNode && node.parentNode !== virtualRoot) {\n        var edge = symbolEl.__edge;\n        if (!edge) {\n            edge = symbolEl.__edge = new graphic.BezierCurve({\n                shape: getEdgeShape(seriesScope, sourceOldLayout, sourceOldLayout),\n                style: zrUtil.defaults({opacity: 0, strokeNoScale: true}, seriesScope.lineStyle)\n            });\n        }\n\n        graphic.updateProps(edge, {\n            shape: getEdgeShape(seriesScope, sourceLayout, targetLayout),\n            style: {opacity: 1}\n        }, seriesModel);\n\n        group.add(edge);\n    }\n}\n\nfunction removeNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {\n    var node = data.tree.getNodeByDataIndex(dataIndex);\n    var virtualRoot = data.tree.root;\n    var itemModel = node.getModel();\n    var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);\n\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\n    graphic.updateProps(symbolEl, {\n        position: [sourceLayout.x + 1, sourceLayout.y + 1]\n    }, seriesModel, function () {\n        group.remove(symbolEl);\n        data.setItemGraphicEl(dataIndex, null);\n    });\n\n    symbolEl.fadeOut(null, {keepLabel: true});\n\n    var edge = symbolEl.__edge;\n    if (edge) {\n        graphic.updateProps(edge, {\n            shape: getEdgeShape(seriesScope, sourceLayout, sourceLayout),\n            style: {\n                opacity: 0\n            }\n        }, seriesModel, function () {\n            group.remove(edge);\n        });\n    }\n}\n\nfunction getEdgeShape(seriesScope, sourceLayout, targetLayout) {\n    var cpx1;\n    var cpy1;\n    var cpx2;\n    var cpy2;\n    var orient = seriesScope.orient;\n    var x1;\n    var x2;\n    var y1;\n    var y2;\n\n    if (seriesScope.layout === 'radial') {\n        x1 = sourceLayout.rawX;\n        y1 = sourceLayout.rawY;\n        x2 = targetLayout.rawX;\n        y2 = targetLayout.rawY;\n\n        var radialCoor1 = radialCoordinate(x1, y1);\n        var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * seriesScope.curvature);\n        var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * seriesScope.curvature);\n        var radialCoor4 = radialCoordinate(x2, y2);\n\n        return {\n            x1: radialCoor1.x,\n            y1: radialCoor1.y,\n            x2: radialCoor4.x,\n            y2: radialCoor4.y,\n            cpx1: radialCoor2.x,\n            cpy1: radialCoor2.y,\n            cpx2: radialCoor3.x,\n            cpy2: radialCoor3.y\n        };\n    }\n    else {\n        x1 = sourceLayout.x;\n        y1 = sourceLayout.y;\n        x2 = targetLayout.x;\n        y2 = targetLayout.y;\n\n        if (orient === 'LR' || orient === 'RL') {\n            cpx1 = x1 + (x2 - x1) * seriesScope.curvature;\n            cpy1 = y1;\n            cpx2 = x2 + (x1 - x2) * seriesScope.curvature;\n            cpy2 = y2;\n        }\n        if (orient === 'TB' || orient === 'BT') {\n            cpx1 = x1;\n            cpy1 = y1 + (y2 - y1) * seriesScope.curvature;\n            cpx2 = x2;\n            cpy2 = y2 + (y1 - y2) * seriesScope.curvature;\n        }\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\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport {updateCenterAndZoom} from '../../action/roamHelper';\n\necharts.registerAction({\n    type: 'treeExpandAndCollapse',\n    event: 'treeExpandAndCollapse',\n    update: 'update'\n}, function (payload, ecModel) {\n    ecModel.eachComponent({mainType: 'series', subType: 'tree', query: payload}, 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});\n\necharts.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) {\n    ecModel.eachComponent({mainType: 'series', subType: 'tree', query: payload}, function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        var res = updateCenterAndZoom(coordSys, payload);\n\n        seriesModel.setCenter\n            && seriesModel.setCenter(res.center);\n\n        seriesModel.setZoom\n            && seriesModel.setZoom(res.zoom);\n    });\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * Traverse the tree from bottom to top and do something\n * @param  {module:echarts/data/Tree~TreeNode} root  The real root of the tree\n * @param  {Function} callback\n */\nfunction eachAfter(root, callback, separation) {\n    var nodes = [root];\n    var next = [];\n    var node;\n\n    while (node = nodes.pop()) { // 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\n    while (node = next.pop()) { // jshint ignore:line\n        callback(node, separation);\n    }\n}\n\n/**\n * Traverse the tree from top to bottom and do something\n * @param  {module:echarts/data/Tree~TreeNode} root  The real root of the tree\n * @param  {Function} callback\n */\nfunction eachBefore(root, callback) {\n    var nodes = [root];\n    var node;\n    while (node = nodes.pop()) { // 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}\n\nexport { eachAfter, eachBefore };","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {\n    eachAfter,\n    eachBefore\n} from './traversalHelper';\nimport {\n    init,\n    firstWalk,\n    secondWalk,\n    separation as sep,\n    radialCoordinate,\n    getViewRect\n} from './layoutHelper';\n\nexport default function (ecModel, api) {\n    ecModel.eachSeriesByType('tree', function (seriesModel) {\n        commonLayout(seriesModel, api);\n    });\n}\n\nfunction commonLayout(seriesModel, api) {\n    var layoutInfo = getViewRect(seriesModel, api);\n    seriesModel.layoutInfo = layoutInfo;\n    var layout = seriesModel.get('layout');\n    var width = 0;\n    var height = 0;\n    var separation = null;\n\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    }\n    else {\n        width = layoutInfo.width;\n        height = layoutInfo.height;\n        separation = sep();\n    }\n\n    var virtualRoot = seriesModel.getData().tree.root;\n    var realRoot = virtualRoot.children[0];\n\n    if (realRoot) {\n        init(virtualRoot);\n        eachAfter(realRoot, firstWalk, separation);\n        virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim;\n        eachBefore(realRoot, secondWalk);\n\n        var left = realRoot;\n        var right = realRoot;\n        var bottom = realRoot;\n        eachBefore(realRoot, function (node) {\n            var x = node.getLayout().x;\n            if (x < left.getLayout().x) {\n                left = node;\n            }\n            if (x > right.getLayout().x) {\n                right = node;\n            }\n            if (node.depth > bottom.depth) {\n                bottom = node;\n            }\n        });\n\n        var delta = left === right ? 1 : separation(left, right) / 2;\n        var tx = delta - left.getLayout().x;\n        var kx = 0;\n        var ky = 0;\n        var coorX = 0;\n        var coorY = 0;\n        if (layout === 'radial') {\n            kx = width / (right.getLayout().x + delta + tx);\n            // here we use (node.depth - 1), bucause the real root's depth is 1\n            ky = height / ((bottom.depth - 1) || 1);\n            eachBefore(realRoot, function (node) {\n                coorX = (node.getLayout().x + tx) * kx;\n                coorY = (node.depth - 1) * ky;\n                var finalCoor = radialCoordinate(coorX, coorY);\n                node.setLayout({x: finalCoor.x, y: finalCoor.y, rawX: coorX, rawY: coorY}, true);\n            });\n        }\n        else {\n            var orient = seriesModel.getOrient();\n            if (orient === 'RL' || orient === 'LR') {\n                ky = height / (right.getLayout().x + delta + tx);\n                kx = width / ((bottom.depth - 1) || 1);\n                eachBefore(realRoot, function (node) {\n                    coorY = (node.getLayout().x + tx) * ky;\n                    coorX = orient === 'LR'\n                        ? (node.depth - 1) * kx\n                        : width - (node.depth - 1) * kx;\n                    node.setLayout({x: coorX, y: coorY}, true);\n                });\n            }\n            else if (orient === 'TB' || orient === 'BT') {\n                kx = width / (right.getLayout().x + delta + tx);\n                ky = height / ((bottom.depth - 1) || 1);\n                eachBefore(realRoot, function (node) {\n                    coorX = (node.getLayout().x + tx) * kx;\n                    coorY = orient === 'TB'\n                        ? (node.depth - 1) * ky\n                        : height - (node.depth - 1) * ky;\n                    node.setLayout({x: coorX, y: coorY}, 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\nimport * as echarts from '../echarts';\n\nimport './tree/TreeSeries';\nimport './tree/TreeView';\nimport './tree/treeAction';\n\nimport visualSymbol from '../visual/symbol';\nimport treeLayout from './tree/treeLayout';\n\necharts.registerVisual(visualSymbol('tree', 'circle'));\necharts.registerLayout(treeLayout);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\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\n        if (typeof targetNode === 'string') {\n            targetNode = root.getNodeById(targetNode);\n        }\n\n        if (targetNode && root.contains(targetNode)) {\n            return {node: targetNode};\n        }\n\n        var targetNodeId = payload.targetNodeId;\n        if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {\n            return {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}\n\nexport function aboveViewRoot(viewRoot, node) {\n    var viewPath = getPathToRoot(viewRoot);\n    return zrUtil.indexOf(viewPath, node) >= 0;\n}\n\n// From root to the input node (the input node will be included).\nexport function wrapTreePathInfo(node, seriesModel) {\n    var treePathInfo = [];\n\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\n    treePathInfo.reverse();\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport SeriesModel from '../../model/Series';\nimport Tree from '../../data/Tree';\nimport Model from '../../model/Model';\nimport {encodeHTML, addCommas} from '../../util/format';\nimport {wrapTreePathInfo} from '../helper/treeHelper';\n\nexport default SeriesModel.extend({\n\n    type: 'series.treemap',\n\n    layoutMode: 'box',\n\n    dependencies: ['grid', 'polar'],\n\n    preventUsingHoverLayer: true,\n\n    /**\n     * @type {module:echarts/data/Tree~Node}\n     */\n    _viewRoot: null,\n\n    defaultOption: {\n        // Disable progressive rendering\n        progressive: 0,\n        // center: ['50%', '50%'],          // not supported in ec3.\n        // size: ['80%', '80%'],            // deprecated, compatible with ec2.\n        left: 'center',\n        top: 'middle',\n        right: null,\n        bottom: null,\n        width: '80%',\n        height: '80%',\n        sort: true,                         // Can be null or false or true\n                                            // (order by desc default, asc not supported yet (strange effect))\n        clipWindow: 'origin',               // Size of clipped window when zooming. 'origin' or 'fullscreen'\n        squareRatio: 0.5 * (1 + Math.sqrt(5)), // golden ratio\n        leafDepth: null,                    // Nodes on depth from root are regarded as leaves.\n                                            // Count from zero (zero represents only view root).\n        drillDownIcon: '▶',                 // Use html character temporarily because it is complicated\n                                            // to align specialized icon. ▷▶❒❐▼✚\n\n        zoomToNodeRatio: 0.32 * 0.32,       // Be effective when using zoomToNode. Specify the proportion of the\n                                            // target node area in the view area.\n        roam: true,                         // true, false, 'scale' or 'zoom', 'move'.\n        nodeClick: 'zoomToNode',            // Leaf node click behaviour: 'zoomToNode', 'link', false.\n                                            // If leafDepth is set and clicking a node which has children but\n                                            // be on left depth, the behaviour would be changing root. Otherwise\n                                            // use behavious defined above.\n        animation: true,\n        animationDurationUpdate: 900,\n        animationEasing: 'quinticInOut',\n        breadcrumb: {\n            show: true,\n            height: 22,\n            left: 'center',\n            top: 'bottom',\n            // right\n            // bottom\n            emptyItemWidth: 25,             // Width of empty node.\n            itemStyle: {\n                color: 'rgba(0,0,0,0.7)', //'#5793f3',\n                borderColor: 'rgba(255,255,255,0.7)',\n                borderWidth: 1,\n                shadowColor: 'rgba(150,150,150,1)',\n                shadowBlur: 3,\n                shadowOffsetX: 0,\n                shadowOffsetY: 0,\n                textStyle: {\n                    color: '#fff'\n                }\n            },\n            emphasis: {\n                textStyle: {}\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', // Can be [5, '5%'] or position stirng like 'insideTopLeft', ...\n            // formatter: null,\n            color: '#fff',\n            ellipsis: true\n            // align\n            // verticalAlign\n        },\n        upperLabel: {                   // Label when node is parent.\n            show: false,\n            position: [0, '50%'],\n            height: 20,\n            // formatter: null,\n            color: '#fff',\n            ellipsis: true,\n            // align: null,\n            verticalAlign: 'middle'\n        },\n        itemStyle: {\n            color: null,            // Can be 'none' if not necessary.\n            colorAlpha: null,       // Can be 'none' if not necessary.\n            colorSaturation: null,  // Can be 'none' if not necessary.\n            borderWidth: 0,\n            gapWidth: 0,\n            borderColor: '#fff',\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                color: '#fff',\n                ellipsis: true,\n                verticalAlign: 'middle'\n            }\n        },\n\n        visualDimension: 0,                 // Can be 0, 1, 2, 3.\n        visualMin: null,\n        visualMax: null,\n\n        color: [],                  // + treemapSeries.color should not be modified. Please only modified\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,           // Array. Specify color alpha range of each level, like [0.2, 0.8]\n        colorSaturation: null,      // Array. Specify color saturation of each level, like [0.2, 0.5]\n        colorMappingBy: 'index',    // 'value' or 'index' or 'id'.\n        visibleMin: 10,             // If area less than this threshold (unit: pixel^2), node will not\n                                    // be rendered. Only works when sort is 'asc' or 'desc'.\n        childrenVisibleMin: null,   // If area of a node less than this threshold (unit: pixel^2),\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        // data: {\n        //      value: [],\n        //      children: [],\n        //      link: 'http://xxx.xxx.xxx',\n        //      target: 'blank' or 'self'\n        // }\n    },\n\n    /**\n     * @override\n     */\n    getInitialData: function (option, ecModel) {\n        // Create a virtual root.\n        var root = {name: option.name, children: option.data};\n\n        completeTreeValue(root);\n\n        var levels = option.levels || [];\n\n        levels = option.levels = setDefault(levels, ecModel);\n\n        var treeOption = {};\n\n        treeOption.levels = levels;\n\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        return Tree.createTree(root, this, treeOption).data;\n    },\n\n    optionUpdated: function () {\n        this.resetViewRoot();\n    },\n\n    /**\n     * @override\n     * @param {number} dataIndex\n     * @param {boolean} [mutipleSeries=false]\n     */\n    formatTooltip: function (dataIndex) {\n        var data = this.getData();\n        var value = this.getRawValue(dataIndex);\n        var formattedValue = zrUtil.isArray(value)\n            ? addCommas(value[0]) : addCommas(value);\n        var name = data.getName(dataIndex);\n\n        return encodeHTML(name + ': ' + formattedValue);\n    },\n\n    /**\n     * Add tree path to tooltip param\n     *\n     * @override\n     * @param {number} dataIndex\n     * @return {Object}\n     */\n    getDataParams: function (dataIndex) {\n        var params = SeriesModel.prototype.getDataParams.apply(this, arguments);\n\n        var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n        params.treePathInfo = wrapTreePathInfo(node, this);\n\n        return params;\n    },\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    setLayoutInfo: function (layoutInfo) {\n        /**\n         * @readOnly\n         * @type {Object}\n         */\n        this.layoutInfo = this.layoutInfo || {};\n        zrUtil.extend(this.layoutInfo, layoutInfo);\n    },\n\n    /**\n     * @param  {string} id\n     * @return {number} index\n     */\n    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        /**\n         * @private\n         * @type {Object}\n         */\n        var idIndexMap = this._idIndexMap;\n\n        if (!idIndexMap) {\n            idIndexMap = this._idIndexMap = zrUtil.createHashMap();\n            /**\n             * @private\n             * @type {number}\n             */\n            this._idIndexMapCount = 0;\n        }\n\n        var index = idIndexMap.get(id);\n        if (index == null) {\n            idIndexMap.set(id, index = this._idIndexMapCount++);\n        }\n\n        return index;\n    },\n\n    getViewRoot: function () {\n        return this._viewRoot;\n    },\n\n    /**\n     * @param {module:echarts/data/Tree~Node} [viewRoot]\n     */\n    resetViewRoot: function (viewRoot) {\n        viewRoot\n            ? (this._viewRoot = viewRoot)\n            : (viewRoot = this._viewRoot);\n\n        var root = this.getRawData().tree.root;\n\n        if (!viewRoot\n            || (viewRoot !== root && !root.contains(viewRoot))\n        ) {\n            this._viewRoot = root;\n        }\n    }\n});\n\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\n    zrUtil.each(dataNode.children, function (child) {\n\n        completeTreeValue(child);\n\n        var childValue = child.value;\n        zrUtil.isArray(childValue) && (childValue = childValue[0]);\n\n        sum += childValue;\n    });\n\n    var thisValue = dataNode.value;\n    if (zrUtil.isArray(thisValue)) {\n        thisValue = thisValue[0];\n    }\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\n    zrUtil.isArray(dataNode.value)\n        ? (dataNode.value[0] = thisValue)\n        : (dataNode.value = thisValue);\n}\n\n/**\n * set default to level configuration\n */\nfunction setDefault(levels, ecModel) {\n    var globalColorList = ecModel.get('color');\n\n    if (!globalColorList) {\n        return;\n    }\n\n    levels = levels || [];\n    var hasColorDefine;\n    zrUtil.each(levels, function (levelDefine) {\n        var model = new Model(levelDefine);\n        var modelColor = model.get('color');\n\n        if (model.get('itemStyle.color')\n            || (modelColor && modelColor !== 'none')\n        ) {\n            hasColorDefine = true;\n        }\n    });\n\n    if (!hasColorDefine) {\n        var level0 = levels[0] || (levels[0] = {});\n        level0.color = globalColorList.slice();\n    }\n\n    return levels;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as graphic from '../../util/graphic';\nimport * as layout from '../../util/layout';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {wrapTreePathInfo} from '../helper/treeHelper';\n\nvar TEXT_PADDING = 8;\nvar ITEM_GAP = 8;\nvar ARRAY_LENGTH = 5;\n\nfunction Breadcrumb(containerGroup) {\n    /**\n     * @private\n     * @type {module:zrender/container/Group}\n     */\n    this.group = new graphic.Group();\n\n    containerGroup.add(this.group);\n}\n\nBreadcrumb.prototype = {\n\n    constructor: Breadcrumb,\n\n    render: function (seriesModel, api, targetNode, onSelect) {\n        var model = seriesModel.getModel('breadcrumb');\n        var thisGroup = this.group;\n\n        thisGroup.removeAll();\n\n        if (!model.get('show') || !targetNode) {\n            return;\n        }\n\n        var normalStyleModel = model.getModel('itemStyle');\n        // var emphasisStyleModel = model.getModel('emphasis.itemStyle');\n        var textStyleModel = normalStyleModel.getModel('textStyle');\n\n        var layoutParam = {\n            pos: {\n                left: model.get('left'),\n                right: model.get('right'),\n                top: model.get('top'),\n                bottom: model.get('bottom')\n            },\n            box: {\n                width: api.getWidth(),\n                height: api.getHeight()\n            },\n            emptyItemWidth: model.get('emptyItemWidth'),\n            totalWidth: 0,\n            renderList: []\n        };\n\n        this._prepare(targetNode, layoutParam, textStyleModel);\n        this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect);\n\n        layout.positionElement(thisGroup, layoutParam.pos, layoutParam.box);\n    },\n\n    /**\n     * Prepare render list and total width\n     * @private\n     */\n    _prepare: function (targetNode, layoutParam, textStyleModel) {\n        for (var node = targetNode; node; node = node.parentNode) {\n            var text = node.getModel().get('name');\n            var textRect = textStyleModel.getTextRect(text);\n            var itemWidth = Math.max(\n                textRect.width + TEXT_PADDING * 2,\n                layoutParam.emptyItemWidth\n            );\n            layoutParam.totalWidth += itemWidth + ITEM_GAP;\n            layoutParam.renderList.push({node: node, text: text, width: itemWidth});\n        }\n    },\n\n    /**\n     * @private\n     */\n    _renderContent: function (\n        seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect\n    ) {\n        // Start rendering.\n        var lastX = 0;\n        var emptyItemWidth = layoutParam.emptyItemWidth;\n        var height = seriesModel.get('breadcrumb.height');\n        var availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box);\n        var totalWidth = layoutParam.totalWidth;\n        var renderList = layoutParam.renderList;\n\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\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\n            var el = new graphic.Polygon({\n                shape: {\n                    points: makeItemPoints(\n                        lastX, 0, itemWidth, height,\n                        i === renderList.length - 1, i === 0\n                    )\n                },\n                style: zrUtil.defaults(\n                    normalStyleModel.getItemStyle(),\n                    {\n                        lineJoin: 'bevel',\n                        text: text,\n                        textFill: textStyleModel.getTextColor(),\n                        textFont: textStyleModel.getFont()\n                    }\n                ),\n                z: 10,\n                onclick: zrUtil.curry(onSelect, itemNode)\n            });\n            this.group.add(el);\n\n            packEventData(el, seriesModel, itemNode);\n\n            lastX += itemWidth + ITEM_GAP;\n        }\n    },\n\n    /**\n     * @override\n     */\n    remove: function () {\n        this.group.removeAll();\n    }\n};\n\nfunction makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {\n    var points = [\n        [head ? x : x - ARRAY_LENGTH, y],\n        [x + itemWidth, y],\n        [x + itemWidth, y + itemHeight],\n        [head ? x : x - ARRAY_LENGTH, y + itemHeight]\n    ];\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\n// Package custom mouse event.\nfunction packEventData(el, seriesModel, itemNode) {\n    el.eventData = {\n        componentType: 'series',\n        componentSubType: 'treemap',\n        componentIndex: seriesModel.componentIndex,\n        seriesIndex: seriesModel.componentIndex,\n        seriesName: seriesModel.name,\n        seriesType: 'treemap',\n        selfType: 'breadcrumb', // Distinguish with click event on treemap node.\n        nodeData: {\n            dataIndex: itemNode && itemNode.dataIndex,\n            name: itemNode && itemNode.name\n        },\n        treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel)\n    };\n}\n\nexport default Breadcrumb;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\n/**\n * @param {number} [time=500] Time in ms\n * @param {string} [easing='linear']\n * @param {number} [delay=0]\n * @param {Function} [callback]\n *\n * @example\n *  // Animate position\n *  animation\n *      .createWrap()\n *      .add(el1, {position: [10, 10]})\n *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)\n *      .done(function () { // done })\n *      .start('cubicOut');\n */\nexport function createWrap() {\n\n    var storage = [];\n    var elExistsMap = {};\n    var doneCallback;\n\n    return {\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         * @param {modele:zrender/Element} el\n         * @param {Object} target\n         * @param {number} [time=500]\n         * @param {number} [delay=0]\n         * @param {string} [easing='linear']\n         * @return {boolean} Whether adding succeeded.\n         *\n         * @example\n         *     add(el, target, time, delay, easing);\n         *     add(el, target, time, easing);\n         *     add(el, target, time);\n         *     add(el, target);\n         */\n        add: function (el, target, time, delay, easing) {\n            if (zrUtil.isString(delay)) {\n                easing = delay;\n                delay = 0;\n            }\n\n            if (elExistsMap[el.id]) {\n                return false;\n            }\n            elExistsMap[el.id] = 1;\n\n            storage.push(\n                {el: el, target: target, time: time, delay: delay, easing: easing}\n            );\n\n            return true;\n        },\n\n        /**\n         * Only execute when animation finished. Will not execute when any\n         * of 'stop' or 'stopAnimation' called.\n         *\n         * @param {Function} callback\n         */\n        done: function (callback) {\n            doneCallback = callback;\n            return this;\n        },\n\n        /**\n         * Will stop exist animation firstly.\n         */\n        start: function () {\n            var count = storage.length;\n\n            for (var i = 0, len = storage.length; i < len; i++) {\n                var item = storage[i];\n                item.el.animateTo(item.target, item.time, item.delay, item.easing, done);\n            }\n\n            return this;\n\n            function done() {\n                count--;\n                if (!count) {\n                    storage.length = 0;\n                    elExistsMap = {};\n                    doneCallback && doneCallback();\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport DataDiffer from '../../data/DataDiffer';\nimport * as helper from '../helper/treeHelper';\nimport Breadcrumb from './Breadcrumb';\nimport RoamController from '../../component/helper/RoamController';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as animationUtil from '../../util/animation';\nimport makeStyleMapper from '../../model/mixin/makeStyleMapper';\n\nvar bind = zrUtil.bind;\nvar Group = graphic.Group;\nvar Rect = graphic.Rect;\nvar each = zrUtil.each;\n\nvar DRAG_THRESHOLD = 3;\nvar PATH_LABEL_NOAMAL = ['label'];\nvar PATH_LABEL_EMPHASIS = ['emphasis', 'label'];\nvar PATH_UPPERLABEL_NORMAL = ['upperLabel'];\nvar PATH_UPPERLABEL_EMPHASIS = ['emphasis', 'upperLabel'];\nvar Z_BASE = 10; // Should bigger than every z.\nvar Z_BG = 1;\nvar Z_CONTENT = 2;\n\nvar getItemStyleEmphasis = makeStyleMapper([\n    ['fill', 'color'],\n    // `borderColor` and `borderWidth` has been occupied,\n    // so use `stroke` to indicate the stroke of the rect.\n    ['stroke', 'strokeColor'],\n    ['lineWidth', 'strokeWidth'],\n    ['shadowBlur'],\n    ['shadowOffsetX'],\n    ['shadowOffsetY'],\n    ['shadowColor']\n]);\nvar getItemStyleNormal = function (model) {\n    // Normal style props should include emphasis style props.\n    var itemStyle = getItemStyleEmphasis(model);\n    // Clear styles set by emphasis.\n    itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null;\n    return itemStyle;\n};\n\nexport default echarts.extendChartView({\n\n    type: 'treemap',\n\n    /**\n     * @override\n     */\n    init: function (o, api) {\n\n        /**\n         * @private\n         * @type {module:zrender/container/Group}\n         */\n        this._containerGroup;\n\n        /**\n         * @private\n         * @type {Object.<string, Array.<module:zrender/container/Group>>}\n         */\n        this._storage = createStorage();\n\n        /**\n         * @private\n         * @type {module:echarts/data/Tree}\n         */\n        this._oldTree;\n\n        /**\n         * @private\n         * @type {module:echarts/chart/treemap/Breadcrumb}\n         */\n        this._breadcrumb;\n\n        /**\n         * @private\n         * @type {module:echarts/component/helper/RoamController}\n         */\n        this._controller;\n\n        /**\n         * 'ready', 'animating'\n         * @private\n         */\n        this._state = 'ready';\n    },\n\n    /**\n     * @override\n     */\n    render: function (seriesModel, ecModel, api, payload) {\n\n        var models = ecModel.findComponents({\n            mainType: 'series', subType: 'treemap', query: payload\n        });\n        if (zrUtil.indexOf(models, seriesModel) < 0) {\n            return;\n        }\n\n        this.seriesModel = seriesModel;\n        this.api = api;\n        this.ecModel = ecModel;\n\n        var types = ['treemapZoomToNode', 'treemapRootToNode'];\n        var targetInfo = helper\n            .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\n        // Mark new root when action is treemapRootToNode.\n        var reRoot = (payloadType === 'treemapRootToNode' && targetInfo && thisStorage)\n            ? {\n                rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],\n                direction: payload.direction\n            }\n            : null;\n\n        var containerGroup = this._giveContainerGroup(layoutInfo);\n\n        var renderResult = this._doRender(containerGroup, seriesModel, reRoot);\n        (\n            !isInit && (\n                !payloadType\n                || payloadType === 'treemapZoomToNode'\n                || payloadType === 'treemapRootToNode'\n            )\n        )\n            ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot)\n            : renderResult.renderFinally();\n\n        this._resetController(api);\n\n        this._renderBreadcrumb(seriesModel, api, targetInfo);\n    },\n\n    /**\n     * @private\n     */\n    _giveContainerGroup: function (layoutInfo) {\n        var containerGroup = this._containerGroup;\n        if (!containerGroup) {\n            // FIXME\n            // 加一层containerGroup是为了clip，但是现在clip功能并没有实现。\n            containerGroup = this._containerGroup = new Group();\n            this._initEvents(containerGroup);\n            this.group.add(containerGroup);\n        }\n        containerGroup.attr('position', [layoutInfo.x, layoutInfo.y]);\n\n        return containerGroup;\n    },\n\n    /**\n     * @private\n     */\n    _doRender: function (containerGroup, seriesModel, reRoot) {\n        var thisTree = seriesModel.getData().tree;\n        var oldTree = this._oldTree;\n\n        // Clear last shape records.\n        var lastsForAnimation = createStorage();\n        var thisStorage = createStorage();\n        var oldStorage = this._storage;\n        var willInvisibleEls = [];\n        var doRenderNode = zrUtil.curry(\n            renderNode, seriesModel,\n            thisStorage, oldStorage, reRoot,\n            lastsForAnimation, willInvisibleEls\n        );\n\n        // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow),\n        // the oldTree is actually losted, so we can not find all of the old graphic\n        // elements from tree. So we use this stragegy: make element storage, move\n        // from old storage to new storage, clear old storage.\n\n        dualTravel(\n            thisTree.root ? [thisTree.root] : [],\n            (oldTree && oldTree.root) ? [oldTree.root] : [],\n            containerGroup,\n            thisTree === oldTree || !oldTree,\n            0\n        );\n\n        // Process all removing.\n        var willDeleteEls = clearStorage(oldStorage);\n\n        this._oldTree = thisTree;\n        this._storage = thisStorage;\n\n        return {\n            lastsForAnimation: lastsForAnimation,\n            willDeleteEls: willDeleteEls,\n            renderFinally: renderFinally\n        };\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))\n                    .add(processNode)\n                    .update(processNode)\n                    .remove(zrUtil.curry(processNode, null))\n                    .execute();\n            }\n\n            function getKey(node) {\n                // Identify by name or raw index.\n                return node.getId();\n            }\n\n            function processNode(newIndex, oldIndex) {\n                var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;\n                var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;\n\n                var group = doRenderNode(thisNode, oldNode, parentGroup, depth);\n\n                group && dualTravel(\n                    thisNode && thisNode.viewChildren || [],\n                    oldNode && oldNode.viewChildren || [],\n                    group,\n                    sameTree,\n                    depth + 1\n                );\n            }\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), el.__tmWillDelete = 1);\n                });\n            });\n            return willDeleteEls;\n        }\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\n    /**\n     * @private\n     */\n    _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) {\n        if (!seriesModel.get('animation')) {\n            return;\n        }\n\n        var duration = seriesModel.get('animationDurationUpdate');\n        var easing = seriesModel.get('animationEasing');\n        var animationWrap = animationUtil.createWrap();\n\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\n                var parent = el.parent; // Always has parent, and parent is nodeGroup.\n                var target;\n\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: parent.__tmNodeWidth,\n                                height: parent.__tmNodeHeight\n                            },\n                            style: {\n                                opacity: 0\n                            }\n                        }\n                        // Others.\n                        : {style: {opacity: 0}};\n                }\n                else {\n                    var targetX = 0;\n                    var targetY = 0;\n\n                    if (!parent.__tmWillDelete) {\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 = parent.__tmNodeWidth / 2;\n                        targetY = parent.__tmNodeHeight / 2;\n                    }\n\n                    target = storageName === 'nodeGroup'\n                        ? {position: [targetX, targetY], style: {opacity: 0}}\n                        : {\n                            shape: {x: targetX, y: targetY, width: 0, height: 0},\n                            style: {opacity: 0}\n                        };\n                }\n\n                target && animationWrap.add(el, target, duration, easing);\n            });\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\n                if (!last) {\n                    return;\n                }\n\n                if (storageName === 'nodeGroup') {\n                    if (last.old) {\n                        target.position = el.position.slice();\n                        el.attr('position', last.old);\n                    }\n                }\n                else {\n                    if (last.old) {\n                        target.shape = zrUtil.extend({}, el.shape);\n                        el.setShape(last.old);\n                    }\n\n                    if (last.fadein) {\n                        el.setStyle('opacity', 0);\n                        target.style = {opacity: 1};\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 = {opacity: 1};\n                    }\n                }\n\n                animationWrap.add(el, target, duration, easing);\n            });\n        }, this);\n\n        this._state = 'animating';\n\n        animationWrap\n            .done(bind(function () {\n                this._state = 'ready';\n                renderResult.renderFinally();\n            }, this))\n            .start();\n    },\n\n    /**\n     * @private\n     */\n    _resetController: function (api) {\n        var controller = this._controller;\n\n        // Init controller.\n        if (!controller) {\n            controller = this._controller = new RoamController(api.getZr());\n            controller.enable(this.seriesModel.get('roam'));\n            controller.on('pan', bind(this._onPan, this));\n            controller.on('zoom', bind(this._onZoom, this));\n        }\n\n        var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight());\n        controller.setPointerChecker(function (e, x, y) {\n            return rect.contain(x, y);\n        });\n    },\n\n    /**\n     * @private\n     */\n    _clearController: function () {\n        var controller = this._controller;\n        if (controller) {\n            controller.dispose();\n            controller = null;\n        }\n    },\n\n    /**\n     * @private\n     */\n    _onPan: function (e) {\n        if (this._state !== 'animating'\n            && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)\n        ) {\n            // These param must not be cached.\n            var root = this.seriesModel.getData().tree.root;\n\n            if (!root) {\n                return;\n            }\n\n            var rootLayout = root.getLayout();\n\n            if (!rootLayout) {\n                return;\n            }\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, y: rootLayout.y + e.dy,\n                    width: rootLayout.width, height: rootLayout.height\n                }\n            });\n        }\n    },\n\n    /**\n     * @private\n     */\n    _onZoom: function (e) {\n        var mouseX = e.originX;\n        var mouseY = e.originY;\n\n        if (this._state !== 'animating') {\n            // These param must not be cached.\n            var root = this.seriesModel.getData().tree.root;\n\n            if (!root) {\n                return;\n            }\n\n            var rootLayout = root.getLayout();\n\n            if (!rootLayout) {\n                return;\n            }\n\n            var rect = new BoundingRect(\n                rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height\n            );\n            var layoutInfo = this.seriesModel.layoutInfo;\n\n            // Transform mouse coord from global to containerGroup.\n            mouseX -= layoutInfo.x;\n            mouseY -= layoutInfo.y;\n\n            // Scale root bounding rect.\n            var m = matrix.create();\n            matrix.translate(m, m, [-mouseX, -mouseY]);\n            matrix.scale(m, m, [e.scale, e.scale]);\n            matrix.translate(m, m, [mouseX, mouseY]);\n\n            rect.applyTransform(m);\n\n            this.api.dispatchAction({\n                type: 'treemapRender',\n                from: this.uid,\n                seriesId: this.seriesModel.id,\n                rootRect: {\n                    x: rect.x, y: rect.y,\n                    width: rect.width, height: rect.height\n                }\n            });\n        }\n    },\n\n    /**\n     * @private\n     */\n    _initEvents: function (containerGroup) {\n        containerGroup.on('click', function (e) {\n            if (this._state !== 'ready') {\n                return;\n            }\n\n            var nodeClick = this.seriesModel.get('nodeClick', true);\n\n            if (!nodeClick) {\n                return;\n            }\n\n            var targetInfo = this.findTarget(e.offsetX, e.offsetY);\n\n            if (!targetInfo) {\n                return;\n            }\n\n            var node = targetInfo.node;\n            if (node.getLayout().isLeafRoot) {\n                this._rootToNode(targetInfo);\n            }\n            else {\n                if (nodeClick === 'zoomToNode') {\n                    this._zoomToNode(targetInfo);\n                }\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 && window.open(link, linkTarget);\n                }\n            }\n\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _renderBreadcrumb: function (seriesModel, api, targetInfo) {\n        if (!targetInfo) {\n            targetInfo = seriesModel.get('leafDepth', true) != null\n                ? {node: seriesModel.getViewRoot()}\n                // FIXME\n                // better way?\n                // Find breadcrumb tail on center of containerGroup.\n                : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);\n\n            if (!targetInfo) {\n                targetInfo = {node: seriesModel.getData().tree.root};\n            }\n        }\n\n        (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group)))\n            .render(seriesModel, api, targetInfo.node, bind(onSelect, this));\n\n        function onSelect(node) {\n            if (this._state !== 'animating') {\n                helper.aboveViewRoot(seriesModel.getViewRoot(), node)\n                    ? this._rootToNode({node: node})\n                    : this._zoomToNode({node: node});\n            }\n        }\n    },\n\n    /**\n     * @override\n     */\n    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\n    dispose: function () {\n        this._clearController();\n    },\n\n    /**\n     * @private\n     */\n    _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\n    /**\n     * @private\n     */\n    _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    /**\n     * @public\n     * @param {number} x Global coord x.\n     * @param {number} y Global coord y.\n     * @return {Object} info If not found, return undefined;\n     * @return {number} info.node Target node.\n     * @return {number} info.offsetX x refer to target node.\n     * @return {number} info.offsetY y refer to target node.\n     */\n    findTarget: function (x, y) {\n        var targetInfo;\n        var viewRoot = this.seriesModel.getViewRoot();\n\n        viewRoot.eachNode({attr: 'viewChildren', order: 'preorder'}, 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\n                // For performance consideration, dont use 'getBoundingRect'.\n                if (shape.x <= point[0]\n                    && point[0] <= shape.x + shape.width\n                    && shape.y <= point[1]\n                    && point[1] <= shape.y + shape.height\n                ) {\n                    targetInfo = {node: node, offsetX: point[0], offsetY: point[1]};\n                }\n                else {\n                    return false; // Suppress visit subtree.\n                }\n            }\n        }, this);\n\n        return targetInfo;\n    }\n\n});\n\n/**\n * @inner\n */\nfunction createStorage() {\n    return {nodeGroup: [], background: [], content: []};\n}\n\n/**\n * @inner\n * @return Return undefined means do not travel further.\n */\nfunction renderNode(\n    seriesModel, thisStorage, oldStorage, reRoot,\n    lastsForAnimation, willInvisibleEls,\n    thisNode, oldNode, parentGroup, depth\n) {\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    // -------------------------------------------------------------------\n    // Start of closure variables available in \"Procedures in renderNode\".\n\n    var thisLayout = thisNode.getLayout();\n\n    if (!thisLayout || !thisLayout.isInView) {\n        return;\n    }\n\n    var thisWidth = thisLayout.width;\n    var thisHeight = thisLayout.height;\n    var borderWidth = thisLayout.borderWidth;\n    var thisInvisible = thisLayout.invisible;\n\n    var thisRawIndex = thisNode.getRawIndex();\n    var oldRawIndex = oldNode && oldNode.getRawIndex();\n\n    var thisViewChildren = thisNode.viewChildren;\n    var upperHeight = thisLayout.upperHeight;\n    var isParent = thisViewChildren && thisViewChildren.length;\n    var itemStyleNormalModel = thisNode.getModel('itemStyle');\n    var itemStyleEmphasisModel = thisNode.getModel('emphasis.itemStyle');\n\n    // End of closure ariables available in \"Procedures in renderNode\".\n    // -----------------------------------------------------------------\n\n    // Node group\n    var group = giveGraphic('nodeGroup', Group);\n\n    if (!group) {\n        return;\n    }\n\n    parentGroup.add(group);\n    // x,y are not set when el is above view root.\n    group.attr('position', [thisLayout.x || 0, thisLayout.y || 0]);\n    group.__tmNodeWidth = thisWidth;\n    group.__tmNodeHeight = thisHeight;\n\n    if (thisLayout.isAboveViewRoot) {\n        return group;\n    }\n\n    // Background\n    var bg = giveGraphic('background', Rect, depth, Z_BG);\n    bg && renderBackground(group, bg, isParent && thisLayout.upperHeight);\n\n    // No children, render content.\n    if (!isParent) {\n        var content = giveGraphic('content', Rect, depth, Z_CONTENT);\n        content && renderContent(group, content);\n    }\n\n    return group;\n\n    // ----------------------------\n    // | Procedures in renderNode |\n    // ----------------------------\n\n    function renderBackground(group, bg, useUpperLabel) {\n        // For tooltip.\n        bg.dataIndex = thisNode.dataIndex;\n        bg.seriesIndex = seriesModel.seriesIndex;\n\n        bg.setShape({x: 0, y: 0, width: thisWidth, height: thisHeight});\n        var visualBorderColor = thisNode.getVisual('borderColor', true);\n        var emphasisBorderColor = itemStyleEmphasisModel.get('borderColor');\n\n        updateStyle(bg, function () {\n            var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n            normalStyle.fill = visualBorderColor;\n            var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel);\n            emphasisStyle.fill = emphasisBorderColor;\n\n            if (useUpperLabel) {\n                var upperLabelWidth = thisWidth - 2 * borderWidth;\n\n                prepareText(\n                    normalStyle, emphasisStyle, visualBorderColor, upperLabelWidth, upperHeight,\n                    {x: borderWidth, y: 0, width: upperLabelWidth, height: upperHeight}\n                );\n            }\n            // For old bg.\n            else {\n                normalStyle.text = emphasisStyle.text = null;\n            }\n\n            bg.setStyle(normalStyle);\n            graphic.setHoverStyle(bg, emphasisStyle);\n        });\n\n        group.add(bg);\n    }\n\n    function renderContent(group, content) {\n        // For tooltip.\n        content.dataIndex = thisNode.dataIndex;\n        content.seriesIndex = seriesModel.seriesIndex;\n\n        var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);\n        var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);\n\n        content.culling = true;\n        content.setShape({\n            x: borderWidth,\n            y: borderWidth,\n            width: contentWidth,\n            height: contentHeight\n        });\n\n        var visualColor = thisNode.getVisual('color', true);\n        updateStyle(content, function () {\n            var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n            normalStyle.fill = visualColor;\n            var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel);\n\n            prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight);\n\n            content.setStyle(normalStyle);\n            graphic.setHoverStyle(content, emphasisStyle);\n        });\n\n        group.add(content);\n    }\n\n    function updateStyle(element, cb) {\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            cb();\n\n            if (!element.__tmWillVisible) {\n                element.invisible = false;\n            }\n        }\n        else {\n            // Delay invisible setting utill animation finished,\n            // avoid element vanish suddenly before animation.\n            !element.invisible && willInvisibleEls.push(element);\n        }\n    }\n\n    function prepareText(normalStyle, emphasisStyle, visualColor, width, height, upperLabelRect) {\n        var nodeModel = thisNode.getModel();\n        var text = zrUtil.retrieve(\n            seriesModel.getFormattedLabel(\n                thisNode.dataIndex, 'normal', null, null, upperLabelRect ? 'upperLabel' : 'label'\n            ),\n            nodeModel.get('name')\n        );\n        if (!upperLabelRect && thisLayout.isLeafRoot) {\n            var iconChar = seriesModel.get('drillDownIcon', true);\n            text = iconChar ? iconChar + ' ' + text : text;\n        }\n\n        var normalLabelModel = nodeModel.getModel(\n            upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL\n        );\n        var emphasisLabelModel = nodeModel.getModel(\n            upperLabelRect ? PATH_UPPERLABEL_EMPHASIS : PATH_LABEL_EMPHASIS\n        );\n\n        var isShow = normalLabelModel.getShallow('show');\n\n        graphic.setLabelStyle(\n            normalStyle, emphasisStyle, normalLabelModel, emphasisLabelModel,\n            {\n                defaultText: isShow ? text : null,\n                autoColor: visualColor,\n                isRectText: true\n            }\n        );\n\n        upperLabelRect && (normalStyle.textRect = zrUtil.clone(upperLabelRect));\n\n        normalStyle.truncate = (isShow && normalLabelModel.get('ellipsis'))\n            ? {\n                outerWidth: width,\n                outerHeight: height,\n                minChar: 2\n            }\n            : null;\n    }\n\n    function giveGraphic(storageName, Ctor, depth, z) {\n        var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];\n        var lasts = lastsForAnimation[storageName];\n\n        if (element) {\n            // Remove from oldStorage\n            oldStorage[storageName][oldRawIndex] = null;\n            prepareAnimationWhenHasOld(lasts, element, storageName);\n        }\n        // If invisible and no old element, do not create new element (for optimizing).\n        else if (!thisInvisible) {\n            element = new Ctor({z: calculateZ(depth, z)});\n            element.__tmDepth = depth;\n            element.__tmStorageName = storageName;\n            prepareAnimationWhenNoOld(lasts, element, storageName);\n        }\n\n        // Set to thisStorage\n        return (thisStorage[storageName][thisRawIndex] = element);\n    }\n\n    function prepareAnimationWhenHasOld(lasts, element, storageName) {\n        var lastCfg = lasts[thisRawIndex] = {};\n        lastCfg.old = storageName === 'nodeGroup'\n            ? element.position.slice()\n            : zrUtil.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, storageName) {\n        var lastCfg = lasts[thisRawIndex] = {};\n        var parentNode = thisNode.parentNode;\n\n        if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {\n            var parentOldX = 0;\n            var parentOldY = 0;\n\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.old) {\n                parentOldX = parentOldBg.old.width;\n                parentOldY = parentOldBg.old.height;\n            }\n\n            // When no parent old shape found, its parent is new too,\n            // so we can just use {x:0, y:0}.\n            lastCfg.old = storageName === 'nodeGroup'\n                ? [0, parentOldY]\n                : {x: parentOldX, y: parentOldY, width: 0, height: 0};\n        }\n\n        // Fade in, user can be aware that these nodes are new.\n        lastCfg.fadein = storageName !== 'nodeGroup';\n    }\n}\n\n// We can not set all backgroud 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 that lowser background element 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 calculateZ(depth, zInLevel) {\n    var zb = depth * Z_BASE + zInLevel;\n    return (zb - 1) / zb;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @file Treemap action\n */\n\nimport * as echarts from '../../echarts';\nimport * as helper from '../helper/treeHelper';\n\nvar noop = function () {};\n\nvar actionTypes = [\n    'treemapZoomToNode',\n    'treemapRender',\n    'treemapMove'\n];\n\nfor (var i = 0; i < actionTypes.length; i++) {\n    echarts.registerAction({type: actionTypes[i], update: 'updateView'}, noop);\n}\n\necharts.registerAction(\n    {type: 'treemapRootToNode', update: 'updateView'},\n    function (payload, ecModel) {\n\n        ecModel.eachComponent(\n            {mainType: 'series', subType: 'treemap', query: payload},\n            handleRootToNode\n        );\n\n        function handleRootToNode(model, index) {\n            var types = ['treemapZoomToNode', 'treemapRootToNode'];\n            var targetInfo = helper.retrieveTargetInfo(payload, types, model);\n\n            if (targetInfo) {\n                var originViewRoot = model.getViewRoot();\n                if (originViewRoot) {\n                    payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node)\n                        ? '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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as zrColor from 'zrender/src/tool/color';\nimport {linearMap} from '../util/number';\n\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\n\nvar CATEGORY_DEFAULT_VISUAL_INDEX = -1;\n\n/**\n * @param {Object} option\n * @param {string} [option.type] See visualHandlers.\n * @param {string} [option.mappingMethod] 'linear' or 'piecewise' or 'category' or 'fixed'\n * @param {Array.<number>=} [option.dataExtent] [minExtent, maxExtent],\n *                                              required when mappingMethod is 'linear'\n * @param {Array.<Object>=} [option.pieceList] [\n *                                             {value: someValue},\n *                                             {interval: [min1, max1], visual: {...}},\n *                                             {interval: [min2, max2]}\n *                                             ],\n *                                            required when mappingMethod is 'piecewise'.\n *                                            Visual for only each piece can be specified.\n * @param {Array.<string|Object>=} [option.categories] ['cate1', 'cate2']\n *                                            required when mappingMethod is 'category'.\n *                                            If no option.categories, categories is set\n *                                            as [0, 1, 2, ...].\n * @param {boolean} [option.loop=false] Whether loop mapping when mappingMethod is 'category'.\n * @param {(Array|Object|*)} [option.visual]  Visual data.\n *                                            when mappingMethod is 'category',\n *                                            visual data can be array or object\n *                                            (like: {cate1: '#222', none: '#fff'})\n *                                            or primary types (which represents\n *                                            defualt category visual), otherwise visual\n *                                            can be array or primary (which will be\n *                                            normalized to array).\n *\n */\nvar VisualMapping = function (option) {\n    var mappingMethod = option.mappingMethod;\n    var visualType = option.type;\n\n    /**\n     * @readOnly\n     * @type {Object}\n     */\n    var thisOption = this.option = zrUtil.clone(option);\n\n    /**\n     * @readOnly\n     * @type {string}\n     */\n    this.type = visualType;\n\n    /**\n     * @readOnly\n     * @type {string}\n     */\n    this.mappingMethod = mappingMethod;\n\n    /**\n     * @private\n     * @type {Function}\n     */\n    this._normalizeData = normalizers[mappingMethod];\n\n    var visualHandler = visualHandlers[visualType];\n\n    /**\n     * @public\n     * @type {Function}\n     */\n    this.applyVisual = visualHandler.applyVisual;\n\n    /**\n     * @public\n     * @type {Function}\n     */\n    this.getColorMapper = visualHandler.getColorMapper;\n\n    /**\n     * @private\n     * @type {Function}\n     */\n    this._doMap = visualHandler._doMap[mappingMethod];\n\n    if (mappingMethod === 'piecewise') {\n        normalizeVisualRange(thisOption);\n        preprocessForPiecewise(thisOption);\n    }\n    else if (mappingMethod === 'category') {\n        thisOption.categories\n            ? 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    }\n    else { // mappingMethod === 'linear' or 'fixed'\n        zrUtil.assert(mappingMethod !== 'linear' || thisOption.dataExtent);\n        normalizeVisualRange(thisOption);\n    }\n};\n\nVisualMapping.prototype = {\n\n    constructor: VisualMapping,\n\n    mapValueToVisual: function (value) {\n        var normalized = this._normalizeData(value);\n        return this._doMap(normalized, value);\n    },\n\n    getNormalizer: function () {\n        return zrUtil.bind(this._normalizeData, this);\n    }\n};\n\nvar visualHandlers = VisualMapping.visualHandlers = {\n\n    color: {\n\n        applyVisual: makeApplyVisual('color'),\n\n        /**\n         * Create a mapper function\n         * @return {Function}\n         */\n        getColorMapper: function () {\n            var thisOption = this.option;\n\n            return zrUtil.bind(\n                thisOption.mappingMethod === 'category'\n                    ? function (value, isNormalized) {\n                        !isNormalized && (value = this._normalizeData(value));\n                        return doMapCategory.call(this, value);\n                    }\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                    },\n                this\n            );\n        },\n\n        _doMap: {\n            linear: function (normalized) {\n                return zrColor.stringify(\n                    zrColor.fastLerp(normalized, this.option.parsedVisual),\n                    'rgba'\n                );\n            },\n            category: doMapCategory,\n            piecewise: function (normalized, value) {\n                var result = getSpecifiedVisual.call(this, value);\n                if (result == null) {\n                    result = zrColor.stringify(\n                        zrColor.fastLerp(normalized, this.option.parsedVisual),\n                        'rgba'\n                    );\n                }\n                return result;\n            },\n            fixed: doMapFixed\n        }\n    },\n\n    colorHue: makePartialColorVisualHandler(function (color, value) {\n        return zrColor.modifyHSL(color, value);\n    }),\n\n    colorSaturation: makePartialColorVisualHandler(function (color, value) {\n        return zrColor.modifyHSL(color, null, value);\n    }),\n\n    colorLightness: makePartialColorVisualHandler(function (color, value) {\n        return zrColor.modifyHSL(color, null, null, value);\n    }),\n\n    colorAlpha: makePartialColorVisualHandler(function (color, value) {\n        return zrColor.modifyAlpha(color, value);\n    }),\n\n    opacity: {\n        applyVisual: makeApplyVisual('opacity'),\n        _doMap: makeDoMap([0, 1])\n    },\n\n    liftZ: {\n        applyVisual: makeApplyVisual('liftZ'),\n        _doMap: {\n            linear: doMapFixed,\n            category: doMapFixed,\n            piecewise: doMapFixed,\n            fixed: doMapFixed\n        }\n    },\n\n    symbol: {\n        applyVisual: function (value, getter, setter) {\n            var symbolCfg = this.mapValueToVisual(value);\n            if (zrUtil.isString(symbolCfg)) {\n                setter('symbol', symbolCfg);\n            }\n            else if (isObject(symbolCfg)) {\n                for (var name in symbolCfg) {\n                    if (symbolCfg.hasOwnProperty(name)) {\n                        setter(name, symbolCfg[name]);\n                    }\n                }\n            }\n        },\n        _doMap: {\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\n    symbolSize: {\n        applyVisual: makeApplyVisual('symbolSize'),\n        _doMap: makeDoMap([0, 1])\n    }\n};\n\n\nfunction preprocessForPiecewise(thisOption) {\n    var pieceList = thisOption.pieceList;\n    thisOption.hasSpecialVisual = false;\n\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}\n\nfunction preprocessForSpecifiedCategory(thisOption) {\n    // Hash categories.\n    var categories = thisOption.categories;\n    var visual = thisOption.visual;\n\n    var categoryMap = thisOption.categoryMap = {};\n    each(categories, function (cate, index) {\n        categoryMap[cate] = index;\n    });\n\n    // Process visual map input.\n    if (!zrUtil.isArray(visual)) {\n        var visualArr = [];\n\n        if (zrUtil.isObject(visual)) {\n            each(visual, function (v, cate) {\n                var index = categoryMap[cate];\n                visualArr[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v;\n            });\n        }\n        else { // Is primary type, represents default visual.\n            visualArr[CATEGORY_DEFAULT_VISUAL_INDEX] = visual;\n        }\n\n        visual = setVisualToOption(thisOption, visualArr);\n    }\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}\n\nfunction normalizeVisualRange(thisOption, isCategory) {\n    var visual = thisOption.visual;\n    var visualArr = [];\n\n    if (zrUtil.isObject(visual)) {\n        each(visual, function (v) {\n            visualArr.push(v);\n        });\n    }\n    else if (visual != null) {\n        visualArr.push(visual);\n    }\n\n    var doNotNeedPair = {color: 1, symbol: 1};\n\n    if (!isCategory\n        && visualArr.length === 1\n        && !doNotNeedPair.hasOwnProperty(thisOption.type)\n    ) {\n        // Do not care visualArr.length === 0, which is illegal.\n        visualArr[1] = visualArr[0];\n    }\n\n    setVisualToOption(thisOption, visualArr);\n}\n\nfunction makePartialColorVisualHandler(applyValue) {\n    return {\n        applyVisual: function (value, getter, setter) {\n            value = this.mapValueToVisual(value);\n            // Must not be array value\n            setter('color', applyValue(getter('color'), value));\n        },\n        _doMap: makeDoMap([0, 1])\n    };\n}\n\nfunction doMapToArray(normalized) {\n    var visual = this.option.visual;\n    return visual[\n        Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))\n    ] || {};\n}\n\nfunction makeApplyVisual(visualType) {\n    return function (value, getter, setter) {\n        setter(visualType, this.mapValueToVisual(value));\n    };\n}\n\nfunction doMapCategory(normalized) {\n    var visual = this.option.visual;\n    return visual[\n        (this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX)\n            ? normalized % visual.length\n            : normalized\n    ];\n}\n\nfunction doMapFixed() {\n    return this.option.visual[0];\n}\n\nfunction makeDoMap(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}\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}\n\nfunction setVisualToOption(thisOption, visualArr) {\n    thisOption.visual = visualArr;\n    if (thisOption.type === 'color') {\n        thisOption.parsedVisual = zrUtil.map(visualArr, function (item) {\n            return zrColor.parse(item);\n        });\n    }\n    return visualArr;\n}\n\n\n/**\n * Normalizers by mapping methods.\n */\nvar normalizers = {\n\n    linear: function (value) {\n        return linearMap(value, this.option.dataExtent, [0, 1], true);\n    },\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\n    category: function (value) {\n        var index = this.option.categories\n            ? this.option.categoryMap[value]\n            : value; // ordinal\n        return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index;\n    },\n\n    fixed: zrUtil.noop\n};\n\n\n\n/**\n * List available visual types.\n *\n * @public\n * @return {Array.<string>}\n */\nVisualMapping.listVisualTypes = function () {\n    var visualTypes = [];\n    zrUtil.each(visualHandlers, function (handler, key) {\n        visualTypes.push(key);\n    });\n    return visualTypes;\n};\n\n/**\n * @public\n */\nVisualMapping.addVisualHandler = function (name, handler) {\n    visualHandlers[name] = handler;\n};\n\n/**\n * @public\n */\nVisualMapping.isValidType = function (visualType) {\n    return visualHandlers.hasOwnProperty(visualType);\n};\n\n/**\n * Convinent method.\n * Visual can be Object or Array or primary type.\n *\n * @public\n */\nVisualMapping.eachVisual = function (visual, callback, context) {\n    if (zrUtil.isObject(visual)) {\n        zrUtil.each(visual, callback, context);\n    }\n    else {\n        callback.call(context, visual);\n    }\n};\n\nVisualMapping.mapVisual = function (visual, callback, context) {\n    var isPrimary;\n    var newVisual = zrUtil.isArray(visual)\n        ? []\n        : zrUtil.isObject(visual)\n        ? {}\n        : (isPrimary = true, null);\n\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/**\n * @public\n * @param {Object} obj\n * @return {Object} new object containers visual values.\n *                 If no visuals, return null.\n */\nVisualMapping.retrieveVisuals = function (obj) {\n    var ret = {};\n    var hasVisual;\n\n    obj && each(visualHandlers, function (h, visualType) {\n        if (obj.hasOwnProperty(visualType)) {\n            ret[visualType] = obj[visualType];\n            hasVisual = true;\n        }\n    });\n\n    return hasVisual ? ret : null;\n};\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 */\nVisualMapping.prepareVisualTypes = function (visualTypes) {\n    if (isObject(visualTypes)) {\n        var types = [];\n        each(visualTypes, function (item, type) {\n            types.push(type);\n        });\n        visualTypes = types;\n    }\n    else if (zrUtil.isArray(visualTypes)) {\n        visualTypes = visualTypes.slice();\n    }\n    else {\n        return [];\n    }\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)\n            ? 1 : -1;\n    });\n\n    return visualTypes;\n};\n\n/**\n * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'.\n * Other visuals are only depends on themself.\n *\n * @public\n * @param {string} visualType1\n * @param {string} visualType2\n * @return {boolean}\n */\nVisualMapping.dependsOn = function (visualType1, visualType2) {\n    return visualType2 === 'color'\n        ? !!(visualType1 && visualType1.indexOf(visualType2) === 0)\n        : visualType1 === visualType2;\n};\n\n/**\n * @param {number} value\n * @param {Array.<Object>} pieceList [{value: ..., interval: [min, max]}, ...]\n *                         Always from small to big.\n * @param {boolean} [findClosestWhenOutside=false]\n * @return {number} index\n */\nVisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) {\n    var possibleI;\n    var abs = Infinity;\n\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                || (typeof pieceValue === 'string' && pieceValue === value + '')\n            ) {\n                return i;\n            }\n            findClosestWhenOutside && updatePossible(pieceValue, i);\n        }\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 = piece.close;\n\n        if (interval) {\n            if (interval[0] === -Infinity) {\n                if (littleThan(close[1], value, interval[1])) {\n                    return i;\n                }\n            }\n            else if (interval[1] === Infinity) {\n                if (littleThan(close[0], interval[0], value)) {\n                    return i;\n                }\n            }\n            else if (\n                littleThan(close[0], interval[0], value)\n                && littleThan(close[1], value, interval[1])\n            ) {\n                return i;\n            }\n            findClosestWhenOutside && updatePossible(interval[0], i);\n            findClosestWhenOutside && updatePossible(interval[1], i);\n        }\n    }\n\n    if (findClosestWhenOutside) {\n        return value === Infinity\n            ? pieceList.length - 1\n            : value === -Infinity\n            ? 0\n            : possibleI;\n    }\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};\n\nfunction littleThan(close, a, b) {\n    return close ? a <= b : a < b;\n}\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\nimport VisualMapping from '../../visual/VisualMapping';\nimport * as zrColor from 'zrender/src/tool/color';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar isArray = zrUtil.isArray;\n\nvar ITEM_STYLE_NORMAL = 'itemStyle';\n\nexport default {\n    seriesType: 'treemap',\n    reset: function (seriesModel, ecModel, api, payload) {\n        var tree = seriesModel.getData().tree;\n        var root = tree.root;\n        var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL);\n\n        if (root.isRemoved()) {\n            return;\n        }\n\n        var levelItemStyles = zrUtil.map(tree.levelModels, function (levelModel) {\n            return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null;\n        });\n\n        travelTree(\n            root, // Visual should calculate from tree root but not view root.\n            {},\n            levelItemStyles,\n            seriesItemStyleModel,\n            seriesModel.getViewRoot().getAncestors(),\n            seriesModel\n        );\n    }\n};\n\nfunction travelTree(\n    node, designatedVisual, levelItemStyles, seriesItemStyleModel,\n    viewRootAncestors, seriesModel\n) {\n    var nodeModel = node.getModel();\n    var nodeLayout = node.getLayout();\n\n    // Optimize\n    if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {\n        return;\n    }\n\n    var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL);\n    var levelItemStyle = levelItemStyles[node.depth];\n    var visuals = buildVisuals(\n        nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel\n    );\n\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, node);\n        borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);\n    }\n    node.setVisual('borderColor', borderColor);\n\n    var viewChildren = node.viewChildren;\n    if (!viewChildren || !viewChildren.length) {\n        thisNodeColor = calculateColor(visuals, node);\n        // Apply visual to this node.\n        node.setVisual('color', thisNodeColor);\n    }\n    else {\n        var mapping = buildVisualMapping(\n            node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren\n        );\n\n        // Designate visual to children.\n        zrUtil.each(viewChildren, function (child, index) {\n            // If higher than viewRoot, only ancestors of viewRoot is needed to visit.\n            if (child.depth >= viewRootAncestors.length\n                || child === viewRootAncestors[child.depth]\n            ) {\n                var childVisual = mapVisual(\n                    nodeModel, visuals, child, index, mapping, seriesModel\n                );\n                travelTree(\n                    child, childVisual, levelItemStyles, seriesItemStyleModel,\n                    viewRootAncestors, seriesModel\n                );\n            }\n        });\n    }\n}\n\nfunction buildVisuals(\n    nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel\n) {\n    var visuals = zrUtil.extend({}, designatedVisual);\n\n    zrUtil.each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {\n        // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel\n        var val = nodeItemStyleModel.get(visualName, true); // Ignore parent\n        val == null && levelItemStyle && (val = levelItemStyle[visualName]);\n        val == null && (val = designatedVisual[visualName]);\n        val == null && (val = seriesItemStyleModel.get(visualName));\n\n        val != null && (visuals[visualName] = val);\n    });\n\n    return visuals;\n}\n\nfunction calculateColor(visuals) {\n    var color = getValueVisualDefine(visuals, 'color');\n\n    if (color) {\n        var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');\n        var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');\n        if (colorSaturation) {\n            color = zrColor.modifyHSL(color, null, null, colorSaturation);\n        }\n        if (colorAlpha) {\n            color = zrColor.modifyAlpha(color, colorAlpha);\n        }\n\n        return color;\n    }\n}\n\nfunction calculateBorderColor(borderColorSaturation, thisNodeColor) {\n    return thisNodeColor != null\n            ? zrColor.modifyHSL(thisNodeColor, null, null, borderColorSaturation)\n            : null;\n}\n\nfunction getValueVisualDefine(visuals, name) {\n    var value = visuals[name];\n    if (value != null && value !== 'none') {\n        return value;\n    }\n}\n\nfunction buildVisualMapping(\n    node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren\n) {\n    if (!viewChildren || !viewChildren.length) {\n        return;\n    }\n\n    var rangeVisual = getRangeVisual(nodeModel, 'color')\n        || (\n            visuals.color != null\n            && visuals.color !== 'none'\n            && (\n                getRangeVisual(nodeModel, 'colorAlpha')\n                || getRangeVisual(nodeModel, 'colorSaturation')\n            )\n        );\n\n    if (!rangeVisual) {\n        return;\n    }\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\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'\n        && (colorMappingBy === 'index' || colorMappingBy === 'id')\n    ) {\n        opt.mappingMethod = 'category';\n        opt.loop = true;\n        // categories is ordinal, so do not set opt.categories.\n    }\n    else {\n        opt.mappingMethod = 'linear';\n    }\n\n    var mapping = new VisualMapping(opt);\n    mapping.__drColorMappingBy = colorMappingBy;\n\n    return mapping;\n}\n\n// Notice: If we dont 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 dont have children, and its siblings has children,\n// and colorRange is set on level-1, then the node can not be colored.\n// So we separate 'colorRange' and 'color' to different attributes.\nfunction getRangeVisual(nodeModel, name) {\n    // 'colorRange', 'colorARange', 'colorSRange'.\n    // If not exsits on this node, fetch from levels and series.\n    var range = nodeModel.get(name);\n    return (isArray(range) && range.length) ? {name: name, range: range} : null;\n}\n\nfunction mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {\n    var childVisuals = zrUtil.extend({}, visuals);\n\n    if (mapping) {\n        var mappingType = mapping.type;\n        var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy;\n        var value = colorMappingBy === 'index'\n            ? index\n            : colorMappingBy === 'id'\n            ? seriesModel.mapIdToIndex(child.getId())\n            : child.getValue(nodeModel.get('visualDimension'));\n\n        childVisuals[mappingType] = mapping.mapValueToVisual(value);\n    }\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* A third-party license is embeded 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*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {parsePercent, MAX_SAFE_INTEGER} from '../../util/number';\nimport * as layout from '../../util/layout';\nimport * as helper from '../helper/treeHelper';\n\nvar mathMax = Math.max;\nvar mathMin = Math.min;\nvar retrieveValue = zrUtil.retrieve;\nvar each = zrUtil.each;\n\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 ecWidth = api.getWidth();\n        var ecHeight = api.getHeight();\n        var seriesOption = seriesModel.option;\n\n        var layoutInfo = layout.getLayoutRect(\n            seriesModel.getBoxLayoutParams(),\n            {\n                width: api.getWidth(),\n                height: api.getHeight()\n            }\n        );\n\n        var size = seriesOption.size || []; // Compatible with ec2.\n        var containerWidth = parsePercent(\n            retrieveValue(layoutInfo.width, size[0]),\n            ecWidth\n        );\n        var containerHeight = parsePercent(\n            retrieveValue(layoutInfo.height, size[1]),\n            ecHeight\n        );\n\n        // Fetch payload info.\n        var payloadType = payload && payload.type;\n        var types = ['treemapZoomToNode', 'treemapRootToNode'];\n        var targetInfo = helper\n            .retrieveTargetInfo(payload, types, seriesModel);\n        var rootRect = (payloadType === 'treemapRender' || payloadType === 'treemapMove')\n            ? payload.rootRect : null;\n        var viewRoot = seriesModel.getViewRoot();\n        var viewAbovePath = helper.getPathToRoot(viewRoot);\n\n        if (payloadType !== 'treemapMove') {\n            var rootSize = payloadType === 'treemapZoomToNode'\n                ? estimateRootSize(\n                    seriesModel, targetInfo, viewRoot, containerWidth, containerHeight\n                )\n                : rootRect\n                ? [rootRect.width, rootRect.height]\n                : [containerWidth, containerHeight];\n\n            var sort = seriesOption.sort;\n            if (sort && sort !== 'asc' && sort !== 'desc') {\n                sort = 'desc';\n            }\n            var options = {\n                squareRatio: seriesOption.squareRatio,\n                sort: sort,\n                leafDepth: seriesOption.leafDepth\n            };\n\n            // layout should be cleared because using updateView but not update.\n            viewRoot.hostTree.clearLayouts();\n\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\n            var viewRootLayout = {\n                x: 0, y: 0,\n                width: rootSize[0], height: rootSize[1],\n                area: rootSize[0] * rootSize[1]\n            };\n            viewRoot.setLayout(viewRootLayout);\n\n            squarify(viewRoot, options, false, 0);\n            // Supplement layout.\n            var viewRootLayout = 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], borderWidth: 0, upperHeight: 0},\n                    viewRootLayout\n                ));\n            });\n        }\n\n        var treeRoot = seriesModel.getData().tree.root;\n\n        treeRoot.setLayout(\n            calculateRootPosition(layoutInfo, rootRect, targetInfo),\n            true\n        );\n\n        seriesModel.setLayoutInfo(layoutInfo);\n\n        // FIXME\n        // 现在没有clip功能，暂时取ec高宽。\n        prunning(\n            treeRoot,\n            // Transform to base element coordinate system.\n            new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight),\n            viewAbovePath,\n            viewRoot,\n            0\n        );\n    }\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\n    if (node.isRemoved()) {\n        return;\n    }\n\n    var thisLayout = node.getLayout();\n    width = thisLayout.width;\n    height = thisLayout.height;\n\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    var nodeModel = node.getModel();\n\n    node.setLayout({\n        borderWidth: borderWidth,\n        upperHeight: upperHeight,\n        upperLabelHeight: upperLabelHeight\n    }, true);\n\n    width = mathMax(width - 2 * layoutOffset, 0);\n    height = mathMax(height - layoutOffset - layoutOffsetUpper, 0);\n\n    var totalArea = width * height;\n    var viewChildren = initChildren(\n        node, nodeModel, totalArea, options, hideChildren, depth\n    );\n\n    if (!viewChildren.length) {\n        return;\n    }\n\n    var rect = {x: layoutOffset, y: layoutOffsetUpper, width: width, height: height};\n    var rowFixedLength = mathMin(width, height);\n    var best = Infinity; // the best row score so far\n    var row = [];\n    row.area = 0;\n\n    for (var i = 0, len = viewChildren.length; i < len;) {\n        var child = viewChildren[i];\n\n        row.push(child);\n        row.area += child.getLayout().area;\n        var score = worst(row, rowFixedLength, options.squareRatio);\n\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\n    if (row.length) {\n        position(row, rowFixedLength, rect, halfGapWidth, true);\n    }\n\n    if (!hideChildren) {\n        var childrenVisibleMin = nodeModel.get('childrenVisibleMin');\n        if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {\n            hideChildren = true;\n        }\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/**\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\n    var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth;\n\n    // leafDepth has higher priority.\n    if (hideChildren && !overLeafDepth) {\n        return (node.viewChildren = []);\n    }\n\n    // Sort children, order by desc.\n    viewChildren = zrUtil.filter(viewChildren, function (child) {\n        return !child.isRemoved();\n    });\n\n    sort(viewChildren, orderBy);\n\n    var info = statistic(nodeModel, viewChildren, orderBy);\n\n    if (info.sum === 0) {\n        return (node.viewChildren = []);\n    }\n\n    info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);\n\n    if (info.sum === 0) {\n        return (node.viewChildren = []);\n    }\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({area: area});\n    }\n\n    if (overLeafDepth) {\n        viewChildren.length && node.setLayout({isLeafRoot: true}, true);\n        viewChildren.length = 0;\n    }\n\n    node.viewChildren = viewChildren;\n    node.setLayout({dataExtent: info.dataExtent}, true);\n\n    return viewChildren;\n}\n\n/**\n * Consider 'visibleMin'. Modify viewChildren and get new sum.\n */\nfunction filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {\n\n    // visibleMin is not supported yet when no option.sort.\n    if (!orderBy) {\n        return sum;\n    }\n\n    var visibleMin = nodeModel.get('visibleMin');\n    var len = orderedChildren.length;\n    var deletePoint = len;\n\n    // Always travel from little value to big value.\n    for (var i = len - 1; i >= 0; i--) {\n        var value = orderedChildren[\n            orderBy === 'asc' ? len - i - 1 : i\n        ].getValue();\n\n        if (value / sum * totalArea < visibleMin) {\n            deletePoint = i;\n            sum -= value;\n        }\n    }\n\n    orderBy === 'asc'\n        ? orderedChildren.splice(0, len - deletePoint)\n        : orderedChildren.splice(deletePoint, len - deletePoint);\n\n    return sum;\n}\n\n/**\n * Sort\n */\nfunction sort(viewChildren, orderBy) {\n    if (orderBy) {\n        viewChildren.sort(function (a, b) {\n            var diff = orderBy === 'asc'\n                ? a.getValue() - b.getValue() : b.getValue() - a.getValue();\n            return diff === 0\n                ? (orderBy === 'asc'\n                    ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex\n                )\n                : diff;\n        });\n    }\n    return viewChildren;\n}\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\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\n    var dimension = nodeModel.get('visualDimension');\n    var dataExtent;\n\n    // The same as area dimension.\n    if (!children || !children.length) {\n        dataExtent = [NaN, NaN];\n    }\n    else if (dimension === 'value' && orderBy) {\n        dataExtent = [\n            children[children.length - 1].getValue(),\n            children[0].getValue()\n        ];\n        orderBy === 'asc' && dataExtent.reverse();\n    }\n    // Other dimension.\n    else {\n        var 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\n    return {sum: sum, 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\n    for (var i = 0, area, 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\n    var squareArea = row.area * row.area;\n    var f = rowFixedLength * rowFixedLength * ratio;\n\n    return squareArea\n        ? mathMax(\n            (f * areaMax) / squareArea,\n            squareArea / (f * areaMin)\n        )\n        : Infinity;\n}\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\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\n    var last = rect[xy[idx0WhenH]];\n    var rowOtherLength = rowFixedLength\n        ? row.area / rowFixedLength : 0;\n\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\n            ? node.getLayout().area / rowOtherLength : 0;\n\n        var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax(rowOtherLength - 2 * halfGapWidth, 0);\n\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\n        nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin(halfGapWidth, wh1 / 2);\n        nodeLayout[xy[idx0WhenH]] = last + mathMin(halfGapWidth, wh0 / 2);\n\n        last += modWH;\n        node.setLayout(nodeLayout, true);\n    }\n\n    rect[xy[idx1WhenH]] += rowOtherLength;\n    rect[wh[idx1WhenH]] -= rowOtherLength;\n}\n\n// Return [containerWidth, containerHeight] as defualt.\nfunction estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {\n    // If targetInfo.node exists, we zoom to the node,\n    // so estimate whold width and heigth by target node.\n    var currNode = (targetInfo || {}).node;\n    var defaultSize = [containerWidth, containerHeight];\n\n    if (!currNode || currNode === viewRoot) {\n        return defaultSize;\n    }\n\n    var parent;\n    var viewArea = containerWidth * containerHeight;\n    var area = viewArea * seriesModel.option.zoomToNodeRatio;\n\n    while (parent = currNode.parentNode) { // jshint ignore:line\n        var sum = 0;\n        var siblings = parent.children;\n\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\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, borderWidth));\n        area += 4 * borderWidth * borderWidth\n            + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5);\n\n        area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER);\n\n        currNode = parent;\n    }\n\n    area < viewArea && (area = viewArea);\n    var scale = Math.pow(area / viewArea, 0.5);\n\n    return [containerWidth * scale, containerHeight * scale];\n}\n\n// Root postion base on coord of containerGroup\nfunction calculateRootPosition(layoutInfo, rootRect, targetInfo) {\n    if (rootRect) {\n        return {x: rootRect.x, y: rootRect.y};\n    }\n\n    var defaultPosition = {x: 0, y: 0};\n    if (!targetInfo) {\n        return defaultPosition;\n    }\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\n    var targetNode = targetInfo.node;\n    var layout = targetNode.getLayout();\n\n    if (!layout) {\n        return defaultPosition;\n    }\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\n    return {\n        x: layoutInfo.width / 2 - targetCenter[0],\n        y: layoutInfo.height / 2 - targetCenter[1]\n    };\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\n    if (\n        (nodeInViewAbovePath && !isAboveViewRoot)\n        || (depth === viewAbovePath.length && node !== viewRoot)\n    ) {\n        return;\n    }\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\n    // Transform to child coordinate.\n    var childClipRect = new BoundingRect(\n        clipRect.x - nodeLayout.x,\n        clipRect.y - nodeLayout.y,\n        clipRect.width,\n        clipRect.height\n    );\n\n    each(node.viewChildren || [], function (child) {\n        prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);\n    });\n}\n\nfunction getUpperLabelHeight(model) {\n    return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0;\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './treemap/TreemapSeries';\nimport './treemap/TreemapView';\nimport './treemap/treemapAction';\n\nimport treemapVisual from './treemap/treemapVisual';\nimport treemapLayout from './treemap/treemapLayout';\n\necharts.registerVisual(treemapVisual);\necharts.registerLayout(treemapLayout);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {enableClassCheck} from '../util/clazz';\n\n// id may be function name of Object, add a prefix to avoid this problem.\nfunction generateNodeKey(id) {\n    return '_EC_' + id;\n}\n/**\n * @alias module:echarts/data/Graph\n * @constructor\n * @param {boolean} directed\n */\nvar Graph = function (directed) {\n    /**\n     * 是否是有向图\n     * @type {boolean}\n     * @private\n     */\n    this._directed = directed || false;\n\n    /**\n     * @type {Array.<module:echarts/data/Graph.Node>}\n     * @readOnly\n     */\n    this.nodes = [];\n\n    /**\n     * @type {Array.<module:echarts/data/Graph.Edge>}\n     * @readOnly\n     */\n    this.edges = [];\n\n    /**\n     * @type {Object.<string, module:echarts/data/Graph.Node>}\n     * @private\n     */\n    this._nodesMap = {};\n    /**\n     * @type {Object.<string, module:echarts/data/Graph.Edge>}\n     * @private\n     */\n    this._edgesMap = {};\n\n    /**\n     * @type {module:echarts/data/List}\n     * @readOnly\n     */\n    this.data;\n\n    /**\n     * @type {module:echarts/data/List}\n     * @readOnly\n     */\n    this.edgeData;\n};\n\nvar graphProto = Graph.prototype;\n/**\n * @type {string}\n */\ngraphProto.type = 'graph';\n\n/**\n * If is directed graph\n * @return {boolean}\n */\ngraphProto.isDirected = function () {\n    return this._directed;\n};\n\n/**\n * Add a new node\n * @param {string} id\n * @param {number} [dataIndex]\n */\ngraphProto.addNode = function (id, dataIndex) {\n    id = id == null ? ('' + dataIndex) : ('' + id);\n\n    var nodesMap = this._nodesMap;\n\n    if (nodesMap[generateNodeKey(id)]) {\n        if (__DEV__) {\n            console.error('Graph nodes have duplicate name or id');\n        }\n        return;\n    }\n\n    var node = new Node(id, dataIndex);\n    node.hostGraph = this;\n\n    this.nodes.push(node);\n\n    nodesMap[generateNodeKey(id)] = node;\n    return node;\n};\n\n/**\n * Get node by data index\n * @param  {number} dataIndex\n * @return {module:echarts/data/Graph~Node}\n */\ngraphProto.getNodeByIndex = function (dataIndex) {\n    var rawIdx = this.data.getRawIndex(dataIndex);\n    return this.nodes[rawIdx];\n};\n/**\n * Get node by id\n * @param  {string} id\n * @return {module:echarts/data/Graph.Node}\n */\ngraphProto.getNodeById = function (id) {\n    return this._nodesMap[generateNodeKey(id)];\n};\n\n/**\n * Add a new edge\n * @param {number|string|module:echarts/data/Graph.Node} n1\n * @param {number|string|module:echarts/data/Graph.Node} n2\n * @param {number} [dataIndex=-1]\n * @return {module:echarts/data/Graph.Edge}\n */\ngraphProto.addEdge = function (n1, n2, dataIndex) {\n    var nodesMap = this._nodesMap;\n    var edgesMap = this._edgesMap;\n\n    // PNEDING\n    if (typeof n1 === 'number') {\n        n1 = this.nodes[n1];\n    }\n    if (typeof n2 === 'number') {\n        n2 = this.nodes[n2];\n    }\n\n    if (!Node.isInstance(n1)) {\n        n1 = nodesMap[generateNodeKey(n1)];\n    }\n    if (!Node.isInstance(n2)) {\n        n2 = nodesMap[generateNodeKey(n2)];\n    }\n    if (!n1 || !n2) {\n        return;\n    }\n\n    var key = n1.id + '-' + n2.id;\n    // PENDING\n    if (edgesMap[key]) {\n        return;\n    }\n\n    var edge = new Edge(n1, n2, dataIndex);\n    edge.hostGraph = this;\n\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\n    this.edges.push(edge);\n    edgesMap[key] = edge;\n\n    return edge;\n};\n\n/**\n * Get edge by data index\n * @param  {number} dataIndex\n * @return {module:echarts/data/Graph~Node}\n */\ngraphProto.getEdgeByIndex = function (dataIndex) {\n    var rawIdx = this.edgeData.getRawIndex(dataIndex);\n    return this.edges[rawIdx];\n};\n/**\n * Get edge by two linked nodes\n * @param  {module:echarts/data/Graph.Node|string} n1\n * @param  {module:echarts/data/Graph.Node|string} n2\n * @return {module:echarts/data/Graph.Edge}\n */\ngraphProto.getEdge = function (n1, n2) {\n    if (Node.isInstance(n1)) {\n        n1 = n1.id;\n    }\n    if (Node.isInstance(n2)) {\n        n2 = n2.id;\n    }\n\n    var edgesMap = this._edgesMap;\n\n    if (this._directed) {\n        return edgesMap[n1 + '-' + n2];\n    }\n    else {\n        return edgesMap[n1 + '-' + n2]\n            || edgesMap[n2 + '-' + n1];\n    }\n};\n\n/**\n * Iterate all nodes\n * @param  {Function} cb\n * @param  {*} [context]\n */\ngraphProto.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 * @param  {Function} cb\n * @param  {*} [context]\n */\ngraphProto.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\n            && edges[i].node1.dataIndex >= 0\n            && edges[i].node2.dataIndex >= 0\n        ) {\n            cb.call(context, edges[i], i);\n        }\n    }\n};\n\n/**\n * Breadth first traverse\n * @param {Function} cb\n * @param {module:echarts/data/Graph.Node} startNode\n * @param {string} [direction='none'] 'none'|'in'|'out'\n * @param {*} [context]\n */\ngraphProto.breadthFirstTraverse = function (\n    cb, startNode, direction, context\n) {\n    if (!Node.isInstance(startNode)) {\n        startNode = this._nodesMap[generateNodeKey(startNode)];\n    }\n    if (!startNode) {\n        return;\n    }\n\n    var edgeType = direction === 'out'\n        ? 'outEdges' : (direction === 'in' ? 'inEdges' : 'edges');\n\n    for (var i = 0; i < this.nodes.length; i++) {\n        this.nodes[i].__visited = false;\n    }\n\n    if (cb.call(context, startNode, null)) {\n        return;\n    }\n\n    var queue = [startNode];\n    while (queue.length) {\n        var currentNode = queue.shift();\n        var edges = currentNode[edgeType];\n\n        for (var i = 0; i < edges.length; i++) {\n            var e = edges[i];\n            var otherNode = e.node1 === currentNode\n                ? 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// graphProto.depthFirstTraverse = function (\n//     cb, startNode, direction, context\n// ) {\n\n// };\n\n// Filter update\ngraphProto.update = function () {\n    var data = this.data;\n    var edgeData = this.edgeData;\n    var nodes = this.nodes;\n    var edges = this.edges;\n\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    edgeData.filterSelf(function (idx) {\n        var edge = edges[edgeData.getRawIndex(idx)];\n        return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;\n    });\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 */\ngraphProto.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\n/**\n * @alias module:echarts/data/Graph.Node\n */\nfunction Node(id, dataIndex) {\n    /**\n    * @type {string}\n    */\n    this.id = id == null ? '' : id;\n\n    /**\n    * @type {Array.<module:echarts/data/Graph.Edge>}\n    */\n    this.inEdges = [];\n    /**\n    * @type {Array.<module:echarts/data/Graph.Edge>}\n    */\n    this.outEdges = [];\n    /**\n    * @type {Array.<module:echarts/data/Graph.Edge>}\n    */\n    this.edges = [];\n    /**\n     * @type {module:echarts/data/Graph}\n     */\n    this.hostGraph;\n\n    /**\n     * @type {number}\n     */\n    this.dataIndex = dataIndex == null ? -1 : dataIndex;\n}\n\nNode.prototype = {\n\n    constructor: Node,\n\n    /**\n     * @return {number}\n     */\n    degree: function () {\n        return this.edges.length;\n    },\n\n    /**\n     * @return {number}\n     */\n    inDegree: function () {\n        return this.inEdges.length;\n    },\n\n    /**\n    * @return {number}\n    */\n    outDegree: function () {\n        return this.outEdges.length;\n    },\n\n    /**\n     * @param {string} [path]\n     * @return {module:echarts/model/Model}\n     */\n    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\n        return itemModel.getModel(path);\n    }\n};\n\n/**\n * 图边\n * @alias module:echarts/data/Graph.Edge\n * @param {module:echarts/data/Graph.Node} n1\n * @param {module:echarts/data/Graph.Node} n2\n * @param {number} [dataIndex=-1]\n */\nfunction Edge(n1, n2, dataIndex) {\n\n    /**\n     * 节点1，如果是有向图则为源节点\n     * @type {module:echarts/data/Graph.Node}\n     */\n    this.node1 = n1;\n\n    /**\n     * 节点2，如果是有向图则为目标节点\n     * @type {module:echarts/data/Graph.Node}\n     */\n    this.node2 = n2;\n\n    this.dataIndex = dataIndex == null ? -1 : dataIndex;\n}\n\n/**\n * @param {string} [path]\n * @return {module:echarts/model/Model}\n */\nEdge.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\n    return itemModel.getModel(path);\n};\n\nvar createGraphDataProxyMixin = function (hostName, dataName) {\n    return {\n        /**\n         * @param {string=} [dimension='value'] Default 'value'. can be 'a', 'b', 'c', 'd', 'e'.\n         * @return {number}\n         */\n        getValue: function (dimension) {\n            var data = this[hostName][dataName];\n            return data.get(data.getDimension(dimension || 'value'), this.dataIndex);\n        },\n\n        /**\n         * @param {Object|string} key\n         * @param {*} [value]\n         */\n        setVisual: function (key, value) {\n            this.dataIndex >= 0\n                && this[hostName][dataName].setItemVisual(this.dataIndex, key, value);\n        },\n\n        /**\n         * @param {string} key\n         * @return {boolean}\n         */\n        getVisual: function (key, ignoreParent) {\n            return this[hostName][dataName].getItemVisual(this.dataIndex, key, ignoreParent);\n        },\n\n        /**\n         * @param {Object} layout\n         * @return {boolean} [merge=false]\n         */\n        setLayout: function (layout, merge) {\n            this.dataIndex >= 0\n                && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge);\n        },\n\n        /**\n         * @return {Object}\n         */\n        getLayout: function () {\n            return this[hostName][dataName].getItemLayout(this.dataIndex);\n        },\n\n        /**\n         * @return {module:zrender/Element}\n         */\n        getGraphicEl: function () {\n            return this[hostName][dataName].getItemGraphicEl(this.dataIndex);\n        },\n\n        /**\n         * @return {number}\n         */\n        getRawIndex: function () {\n            return this[hostName][dataName].getRawIndex(this.dataIndex);\n        }\n    };\n};\n\nzrUtil.mixin(Node, createGraphDataProxyMixin('hostGraph', 'data'));\nzrUtil.mixin(Edge, createGraphDataProxyMixin('hostGraph', 'edgeData'));\n\nGraph.Node = Node;\nGraph.Edge = Edge;\n\nenableClassCheck(Node);\nenableClassCheck(Edge);\n\nexport default Graph;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport List from '../../data/List';\nimport Graph from '../../data/Graph';\nimport linkList from '../../data/helper/linkList';\nimport createDimensions from '../../data/helper/createDimensions';\nimport CoordinateSystem from '../../CoordinateSystem';\nimport createListFromArray from './createListFromArray';\n\nexport default function (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\n        ), i);\n    }\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(link.id, source + ' > ' + target));\n            linkCount++;\n        }\n    }\n\n    var coordSys = seriesModel.get('coordinateSystem');\n    var nodeData;\n    if (coordSys === 'cartesian2d' || coordSys === 'polar') {\n        nodeData = createListFromArray(nodes, seriesModel);\n    }\n    else {\n        var coordSysCtor = CoordinateSystem.get(coordSys);\n        var coordDimensions = (coordSysCtor && coordSysCtor.type !== 'view')\n            ? (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\n        var dimensionNames = createDimensions(nodes, {\n            coordDimensions: coordDimensions\n        });\n        nodeData = new List(dimensionNames, seriesModel);\n        nodeData.initData(nodes);\n    }\n\n    var edgeData = new List(['value'], seriesModel);\n    edgeData.initData(validEdges, linkNameList);\n\n    beforeLink && beforeLink(nodeData, edgeData);\n\n    linkList({\n        mainData: nodeData,\n        struct: graph,\n        structAttr: 'graph',\n        datas: {node: nodeData, edge: edgeData},\n        datasAttr: {node: 'data', edge: 'edgeData'}\n    });\n\n    // Update dataIndex of nodes and edges because invalid edge may be removed\n    graph.update();\n\n    return graph;\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport List from '../../data/List';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {defaultEmphasis} from '../../util/model';\nimport Model from '../../model/Model';\nimport {encodeHTML} from '../../util/format';\nimport createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge';\n\nvar GraphSeries = echarts.extendSeriesModel({\n\n    type: 'series.graph',\n\n    init: function (option) {\n        GraphSeries.superApply(this, 'init', arguments);\n\n        // Provide data for legend select\n        this.legendDataProvider = function () {\n            return this._categoriesData;\n        };\n\n        this.fillDataTextStyle(option.edges || option.links);\n\n        this._updateCategoriesData();\n    },\n\n    mergeOption: function (option) {\n        GraphSeries.superApply(this, 'mergeOption', arguments);\n\n        this.fillDataTextStyle(option.edges || option.links);\n\n        this._updateCategoriesData();\n    },\n\n    mergeDefaultAndTheme: function (option) {\n        GraphSeries.superApply(this, 'mergeDefaultAndTheme', arguments);\n        defaultEmphasis(option, ['edgeLabel'], ['show']);\n    },\n\n    getInitialData: function (option, ecModel) {\n        var edges = option.edges || option.links || [];\n        var nodes = option.data || option.nodes || [];\n        var self = this;\n\n        if (nodes && edges) {\n            return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;\n        }\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\n            var edgeLabelModel = self.getModel('edgeLabel');\n            // For option `edgeLabel` can be found by label.xxx.xxx on item mode.\n            var fakeSeriesModel = new Model(\n                {label: edgeLabelModel.option},\n                edgeLabelModel.parentModel,\n                ecModel\n            );\n            var emphasisEdgeLabelModel = self.getModel('emphasis.edgeLabel');\n            var emphasisFakeSeriesModel = new Model(\n                {emphasis: {label: emphasisEdgeLabelModel.option}},\n                emphasisEdgeLabelModel.parentModel,\n                ecModel\n            );\n\n            edgeData.wrapMethod('getItemModel', function (model) {\n                model.customizeGetParent(edgeGetParent);\n                return model;\n            });\n\n            function edgeGetParent(path) {\n                path = this.parsePath(path);\n                return (path && path[0] === 'label')\n                    ? fakeSeriesModel\n                    : (path && path[0] === 'emphasis' && path[1] === 'label')\n                    ? emphasisFakeSeriesModel\n                    : this.parentModel;\n            }\n        }\n    },\n\n    /**\n     * @return {module:echarts/data/Graph}\n     */\n    getGraph: function () {\n        return this.getData().graph;\n    },\n\n    /**\n     * @return {module:echarts/data/List}\n     */\n    getEdgeData: function () {\n        return this.getGraph().edgeData;\n    },\n\n    /**\n     * @return {module:echarts/data/List}\n     */\n    getCategoriesData: function () {\n        return this._categoriesData;\n    },\n\n    /**\n     * @override\n     */\n    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\n            var html = [];\n            sourceName != null && html.push(sourceName);\n            targetName != null && html.push(targetName);\n            html = encodeHTML(html.join(' > '));\n\n            if (params.value) {\n                html += ' : ' + encodeHTML(params.value);\n            }\n            return html;\n        }\n        else { // dataType === 'node' or empty\n            return GraphSeries.superApply(this, 'formatTooltip', arguments);\n        }\n    },\n\n    _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 List(['value'], this);\n        categoriesData.initData(categories);\n\n        this._categoriesData = categoriesData;\n\n        this._categoriesModels = categoriesData.mapArray(function (idx) {\n            return categoriesData.getItemModel(idx, true);\n        });\n    },\n\n    setZoom: function (zoom) {\n        this.option.zoom = zoom;\n    },\n\n    setCenter: function (center) {\n        this.option.center = center;\n    },\n\n    isAnimationEnabled: function () {\n        return GraphSeries.superCall(this, 'isAnimationEnabled')\n            // Not enable animation when do force layout\n            && !(this.get('layout') === 'force' && this.get('force.layoutAnimation'));\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n\n        coordinateSystem: 'view',\n\n        // Default option for all coordinate systems\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n        // polarIndex: 0,\n        // geoIndex: 0,\n\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n\n        layout: null,\n\n        focusNodeAdjacency: false,\n\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\n            // Edge length. Can be an array to represent range.\n            edgeLength: 30,\n\n            layoutAnimation: true\n        },\n\n        left: 'center',\n        top: 'center',\n        // right: null,\n        // bottom: null,\n        // width: '80%',\n        // height: '80%',\n\n        symbol: 'circle',\n        symbolSize: 10,\n\n        edgeSymbol: ['none', 'none'],\n        edgeSymbolSize: 10,\n        edgeLabel: {\n            position: 'middle'\n        },\n\n        draggable: false,\n\n        roam: false,\n\n        // Default on center of graph\n        center: null,\n\n        zoom: 1,\n        // Symbol size scale ratio in roam\n        nodeScaleRatio: 0.6,\n        // cursor: null,\n\n        // categories: [],\n\n        // data: []\n        // Or\n        // nodes: []\n        //\n        // links: []\n        // Or\n        // edges: []\n\n        label: {\n            show: false,\n            formatter: '{b}'\n        },\n\n        itemStyle: {},\n\n        lineStyle: {\n            color: '#aaa',\n            width: 1,\n            curveness: 0,\n            opacity: 0.5\n        },\n        emphasis: {\n            label: {\n                show: true\n            }\n        }\n    }\n});\n\nexport default GraphSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Line path for bezier and straight line draw\n */\n\nimport * as graphic from '../../util/graphic';\nimport * as vec2 from 'zrender/src/core/vector';\n\nvar straightLineProto = graphic.Line.prototype;\nvar bezierCurveProto = graphic.BezierCurve.prototype;\n\nfunction isLine(shape) {\n    return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);\n}\n\nexport default graphic.extendShape({\n\n    type: 'ec-line',\n\n    style: {\n        stroke: '#000',\n        fill: null\n    },\n\n    shape: {\n        x1: 0,\n        y1: 0,\n        x2: 0,\n        y2: 0,\n        percent: 1,\n        cpx1: null,\n        cpy1: null\n    },\n\n    buildPath: function (ctx, shape) {\n        this[isLine(shape) ? '_buildPathLine' : '_buildPathCurve'](ctx, shape);\n    },\n    _buildPathLine: straightLineProto.buildPath,\n    _buildPathCurve: bezierCurveProto.buildPath,\n\n    pointAt: function (t) {\n        return this[isLine(this.shape) ? '_pointAtLine' : '_pointAtCurve'](t);\n    },\n    _pointAtLine: straightLineProto.pointAt,\n    _pointAtCurve: bezierCurveProto.pointAt,\n\n    tangentAt: function (t) {\n        var shape = this.shape;\n        var p = isLine(shape)\n            ? [shape.x2 - shape.x1, shape.y2 - shape.y1]\n            : this._tangentAtCurve(t);\n        return vec2.normalize(p, p);\n    },\n    _tangentAtCurve: bezierCurveProto.tangentAt\n\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/chart/helper/Line\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as vector from 'zrender/src/core/vector';\nimport * as symbolUtil from '../../util/symbol';\nimport LinePath from './LinePath';\nimport * as graphic from '../../util/graphic';\nimport {round} from '../../util/number';\n\nvar SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol'];\n\nfunction makeSymbolTypeKey(symbolCategory) {\n    return '_' + symbolCategory + 'Type';\n}\n/**\n * @inner\n */\nfunction createSymbol(name, lineData, idx) {\n    var color = lineData.getItemVisual(idx, 'color');\n    var symbolType = lineData.getItemVisual(idx, name);\n    var symbolSize = lineData.getItemVisual(idx, name + 'Size');\n\n    if (!symbolType || symbolType === 'none') {\n        return;\n    }\n\n    if (!zrUtil.isArray(symbolSize)) {\n        symbolSize = [symbolSize, symbolSize];\n    }\n    var symbolPath = symbolUtil.createSymbol(\n        symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2,\n        symbolSize[0], symbolSize[1], color\n    );\n\n    symbolPath.name = name;\n\n    return symbolPath;\n}\n\nfunction createLine(points) {\n    var line = new LinePath({\n        name: 'line',\n        subPixelOptimize: true\n    });\n    setLinePoints(line.shape, points);\n    return line;\n}\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\n    var cp1 = points[2];\n    if (cp1) {\n        targetShape.cpx1 = cp1[0];\n        targetShape.cpy1 = cp1[1];\n    }\n    else {\n        targetShape.cpx1 = NaN;\n        targetShape.cpy1 = NaN;\n    }\n}\n\nfunction updateSymbolAndLabelBeforeLineUpdate() {\n    var lineGroup = this;\n    var symbolFrom = lineGroup.childOfName('fromSymbol');\n    var symbolTo = lineGroup.childOfName('toSymbol');\n    var label = lineGroup.childOfName('label');\n    // Quick reject\n    if (!symbolFrom && !symbolTo && label.ignore) {\n        return;\n    }\n\n    var invScale = 1;\n    var parentNode = this.parent;\n    while (parentNode) {\n        if (parentNode.scale) {\n            invScale /= parentNode.scale[0];\n        }\n        parentNode = parentNode.parent;\n    }\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\n    var percent = line.shape.percent;\n    var fromPos = line.pointAt(0);\n    var toPos = line.pointAt(percent);\n\n    var d = vector.sub([], toPos, fromPos);\n    vector.normalize(d, d);\n\n    if (symbolFrom) {\n        symbolFrom.attr('position', fromPos);\n        var tangent = line.tangentAt(0);\n        symbolFrom.attr('rotation', Math.PI / 2 - Math.atan2(\n            tangent[1], tangent[0]\n        ));\n        symbolFrom.attr('scale', [invScale * percent, invScale * percent]);\n    }\n    if (symbolTo) {\n        symbolTo.attr('position', toPos);\n        var tangent = line.tangentAt(1);\n        symbolTo.attr('rotation', -Math.PI / 2 - Math.atan2(\n            tangent[1], tangent[0]\n        ));\n        symbolTo.attr('scale', [invScale * percent, invScale * percent]);\n    }\n\n    if (!label.ignore) {\n        label.attr('position', toPos);\n\n        var textPosition;\n        var textAlign;\n        var textVerticalAlign;\n\n        var distance = 5 * invScale;\n        // End\n        if (label.__position === 'end') {\n            textPosition = [d[0] * distance + toPos[0], d[1] * distance + 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        }\n        // Middle\n        else if (label.__position === 'middle') {\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            textPosition = [cp[0] + n[0] * distance, cp[1] + n[1] * distance];\n            textAlign = 'center';\n            textVerticalAlign = 'bottom';\n            var rotation = -Math.atan2(tangent[1], tangent[0]);\n            if (toPos[0] < fromPos[0]) {\n                rotation = Math.PI + rotation;\n            }\n            label.attr('rotation', rotation);\n        }\n        // Start\n        else {\n            textPosition = [-d[0] * distance + fromPos[0], -d[1] * distance + 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        }\n        label.attr({\n            style: {\n                // Use the user specified text align and baseline first\n                textVerticalAlign: label.__verticalAlign || textVerticalAlign,\n                textAlign: label.__textAlign || textAlign\n            },\n            position: textPosition,\n            scale: [invScale, invScale]\n        });\n    }\n}\n\n/**\n * @constructor\n * @extends {module:zrender/graphic/Group}\n * @alias {module:echarts/chart/helper/Line}\n */\nfunction Line(lineData, idx, seriesScope) {\n    graphic.Group.call(this);\n\n    this._createLine(lineData, idx, seriesScope);\n}\n\nvar lineProto = Line.prototype;\n\n// Update symbol position and rotation\nlineProto.beforeUpdate = updateSymbolAndLabelBeforeLineUpdate;\n\nlineProto._createLine = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n    var linePoints = lineData.getItemLayout(idx);\n    var line = createLine(linePoints);\n    line.shape.percent = 0;\n    graphic.initProps(line, {\n        shape: {\n            percent: 1\n        }\n    }, seriesModel, idx);\n\n    this.add(line);\n\n    var label = new graphic.Text({\n        name: 'label',\n        // FIXME\n        // Temporary solution for `focusNodeAdjacency`.\n        // line label do not use the opacity of lineStyle.\n        lineLabelOriginalOpacity: 1\n    });\n    this.add(label);\n\n    zrUtil.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)] = lineData.getItemVisual(idx, symbolCategory);\n    }, this);\n\n    this._updateCommonStl(lineData, idx, seriesScope);\n};\n\nlineProto.updateData = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n\n    var line = this.childOfName('line');\n    var linePoints = lineData.getItemLayout(idx);\n    var target = {\n        shape: {}\n    };\n\n    setLinePoints(target.shape, linePoints);\n    graphic.updateProps(line, target, seriesModel, idx);\n\n    zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {\n        var symbolType = lineData.getItemVisual(idx, symbolCategory);\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\n    this._updateCommonStl(lineData, idx, seriesScope);\n};\n\nlineProto._updateCommonStl = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n\n    var line = this.childOfName('line');\n\n    var lineStyle = seriesScope && seriesScope.lineStyle;\n    var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;\n    var labelModel = seriesScope && seriesScope.labelModel;\n    var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel;\n\n    // Optimization for large dataset\n    if (!seriesScope || lineData.hasItemOption) {\n        var itemModel = lineData.getItemModel(idx);\n\n        lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n        hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();\n\n        labelModel = itemModel.getModel('label');\n        hoverLabelModel = itemModel.getModel('emphasis.label');\n    }\n\n    var visualColor = lineData.getItemVisual(idx, 'color');\n    var visualOpacity = zrUtil.retrieve3(\n        lineData.getItemVisual(idx, 'opacity'),\n        lineStyle.opacity,\n        1\n    );\n\n    line.useStyle(zrUtil.defaults(\n        {\n            strokeNoScale: true,\n            fill: 'none',\n            stroke: visualColor,\n            opacity: visualOpacity\n        },\n        lineStyle\n    ));\n    line.hoverStyle = hoverLineStyle;\n\n    // Update symbol\n    zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {\n        var symbol = this.childOfName(symbolCategory);\n        if (symbol) {\n            symbol.setColor(visualColor);\n            symbol.setStyle({\n                opacity: visualOpacity\n            });\n        }\n    }, this);\n\n    var showLabel = labelModel.getShallow('show');\n    var hoverShowLabel = hoverLabelModel.getShallow('show');\n\n    var label = this.childOfName('label');\n    var defaultLabelColor;\n    var baseText;\n\n    // FIXME: the logic below probably should be merged to `graphic.setLabelStyle`.\n    if (showLabel || hoverShowLabel) {\n        defaultLabelColor = visualColor || '#000';\n\n        baseText = seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType);\n        if (baseText == null) {\n            var rawVal = seriesModel.getRawValue(idx);\n            baseText = rawVal == null\n                ? lineData.getName(idx)\n                : isFinite(rawVal)\n                ? round(rawVal)\n                : rawVal;\n        }\n    }\n    var normalText = showLabel ? baseText : null;\n    var emphasisText = hoverShowLabel\n        ? zrUtil.retrieve2(\n            seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType),\n            baseText\n        )\n        : null;\n\n    var labelStyle = label.style;\n\n    // Always set `textStyle` even if `normalStyle.text` is null, because default\n    // values have to be set on `normalStyle`.\n    if (normalText != null || emphasisText != null) {\n        graphic.setTextStyle(label.style, labelModel, {\n            text: normalText\n        }, {\n            autoColor: defaultLabelColor\n        });\n\n        label.__textAlign = labelStyle.textAlign;\n        label.__verticalAlign = labelStyle.textVerticalAlign;\n        // 'start', 'middle', 'end'\n        label.__position = labelModel.get('position') || 'middle';\n    }\n\n    if (emphasisText != null) {\n        // Only these properties supported in this emphasis style here.\n        label.hoverStyle = {\n            text: emphasisText,\n            textFill: hoverLabelModel.getTextColor(true),\n            // For merging hover style to normal style, do not use\n            // `hoverLabelModel.getFont()` here.\n            fontStyle: hoverLabelModel.getShallow('fontStyle'),\n            fontWeight: hoverLabelModel.getShallow('fontWeight'),\n            fontSize: hoverLabelModel.getShallow('fontSize'),\n            fontFamily: hoverLabelModel.getShallow('fontFamily')\n        };\n    }\n    else {\n        label.hoverStyle = {\n            text: null\n        };\n    }\n\n    label.ignore = !showLabel && !hoverShowLabel;\n\n    graphic.setHoverStyle(this);\n};\n\nlineProto.highlight = function () {\n    this.trigger('emphasis');\n};\n\nlineProto.downplay = function () {\n    this.trigger('normal');\n};\n\nlineProto.updateLayout = function (lineData, idx) {\n    this.setLinePoints(lineData.getItemLayout(idx));\n};\n\nlineProto.setLinePoints = function (points) {\n    var linePath = this.childOfName('line');\n    setLinePoints(linePath.shape, points);\n    linePath.dirty();\n};\n\nzrUtil.inherits(Line, graphic.Group);\n\nexport default Line;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/chart/helper/LineDraw\n */\n\nimport * as graphic from '../../util/graphic';\nimport LineGroup from './Line';\n// import IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable';\n\n/**\n * @alias module:echarts/component/marker/LineDraw\n * @constructor\n */\nfunction LineDraw(ctor) {\n    this._ctor = ctor || LineGroup;\n\n    this.group = new graphic.Group();\n}\n\nvar lineDrawProto = LineDraw.prototype;\n\nlineDrawProto.isPersistent = function () {\n    return true;\n};\n\n/**\n * @param {module:echarts/data/List} lineData\n */\nlineDrawProto.updateData = function (lineData) {\n    var lineDraw = this;\n    var group = lineDraw.group;\n\n    var oldLineData = lineDraw._lineData;\n    lineDraw._lineData = lineData;\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 (!oldLineData) {\n        group.removeAll();\n    }\n\n    var seriesScope = makeSeriesScope(lineData);\n\n    lineData.diff(oldLineData)\n        .add(function (idx) {\n            doAdd(lineDraw, lineData, idx, seriesScope);\n        })\n        .update(function (newIdx, oldIdx) {\n            doUpdate(lineDraw, oldLineData, lineData, oldIdx, newIdx, seriesScope);\n        })\n        .remove(function (idx) {\n            group.remove(oldLineData.getItemGraphicEl(idx));\n        })\n        .execute();\n};\n\nfunction doAdd(lineDraw, lineData, idx, seriesScope) {\n    var itemLayout = lineData.getItemLayout(idx);\n\n    if (!lineNeedsDraw(itemLayout)) {\n        return;\n    }\n\n    var el = new lineDraw._ctor(lineData, idx, seriesScope);\n    lineData.setItemGraphicEl(idx, el);\n    lineDraw.group.add(el);\n}\n\nfunction doUpdate(lineDraw, oldLineData, newLineData, oldIdx, newIdx, seriesScope) {\n    var itemEl = oldLineData.getItemGraphicEl(oldIdx);\n\n    if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) {\n        lineDraw.group.remove(itemEl);\n        return;\n    }\n\n    if (!itemEl) {\n        itemEl = new lineDraw._ctor(newLineData, newIdx, seriesScope);\n    }\n    else {\n        itemEl.updateData(newLineData, newIdx, seriesScope);\n    }\n\n    newLineData.setItemGraphicEl(newIdx, itemEl);\n\n    lineDraw.group.add(itemEl);\n}\n\nlineDrawProto.updateLayout = function () {\n    var lineData = this._lineData;\n\n    // Do not support update layout in incremental mode.\n    if (!lineData) {\n        return;\n    }\n\n    lineData.eachItemGraphicEl(function (el, idx) {\n        el.updateLayout(lineData, idx);\n    }, this);\n};\n\nlineDrawProto.incrementalPrepareUpdate = function (lineData) {\n    this._seriesScope = makeSeriesScope(lineData);\n    this._lineData = null;\n    this.group.removeAll();\n};\n\nlineDrawProto.incrementalUpdate = function (taskParams, lineData) {\n    function updateIncrementalAndHover(el) {\n        if (!el.isGroup) {\n            el.incremental = el.useHoverLayer = true;\n        }\n    }\n\n    for (var idx = taskParams.start; idx < taskParams.end; idx++) {\n        var itemLayout = lineData.getItemLayout(idx);\n\n        if (lineNeedsDraw(itemLayout)) {\n            var el = new this._ctor(lineData, idx, this._seriesScope);\n            el.traverse(updateIncrementalAndHover);\n\n            this.group.add(el);\n            lineData.setItemGraphicEl(idx, el);\n        }\n    }\n};\n\nfunction makeSeriesScope(lineData) {\n    var hostModel = lineData.hostModel;\n    return {\n        lineStyle: hostModel.getModel('lineStyle').getLineStyle(),\n        hoverLineStyle: hostModel.getModel('emphasis.lineStyle').getLineStyle(),\n        labelModel: hostModel.getModel('label'),\n        hoverLabelModel: hostModel.getModel('emphasis.label')\n    };\n}\n\nlineDrawProto.remove = function () {\n    this._clearIncremental();\n    this._incremental = null;\n    this.group.removeAll();\n};\n\nlineDrawProto._clearIncremental = function () {\n    var incremental = this._incremental;\n    if (incremental) {\n        incremental.clearDisplaybles();\n    }\n};\n\nfunction isPointNaN(pt) {\n    return isNaN(pt[0]) || isNaN(pt[1]);\n}\n\nfunction lineNeedsDraw(pts) {\n    return !isPointNaN(pts[0]) && !isPointNaN(pts[1]);\n}\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\nexport function getNodeGlobalScale(seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys.type !== 'view') {\n        return 1;\n    }\n\n    var nodeScaleRatio = seriesModel.option.nodeScaleRatio;\n\n    var groupScale = coordSys.scale;\n    var groupZoom = (groupScale && groupScale[0]) || 1;\n    // Scale node when zoom changes\n    var roamZoom = coordSys.getZoom();\n    var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n\n    return nodeScale / groupZoom;\n}\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","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as curveTool from 'zrender/src/core/curve';\nimport * as vec2 from 'zrender/src/core/vector';\nimport {getSymbolSize} from './graphHelper';\n\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\n    var d = Infinity;\n    var t;\n    var radiusSquare = radius * radius;\n    var interval = 0.1;\n\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\n    // Assume the segment is monotone，Find root through Bisection method\n    // At most 32 iteration\n    for (var i = 0; i < 32; i++) {\n        // var 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\n        var diff = v2DistSquare(v2, center) - radiusSquare;\n        if (mathAbs(diff) < 1e-2) {\n            break;\n        }\n\n        // var prevDiff = v2DistSquare(v1, center) - radiusSquare;\n        var nextDiff = v2DistSquare(v3, center) - radiusSquare;\n\n        interval /= 2;\n        if (diff < 0) {\n            if (nextDiff >= 0) {\n                t = t + interval;\n            }\n            else {\n                t = t - interval;\n            }\n        }\n        else {\n            if (nextDiff >= 0) {\n                t = t - interval;\n            }\n            else {\n                t = t + interval;\n            }\n        }\n    }\n\n    return t;\n}\n\n// Adjust edge to avoid\nexport default function (graph, scale) {\n    var tmp0 = [];\n    var quadraticSubdivide = curveTool.quadraticSubdivide;\n    var pts = [[], [], []];\n    var pts2 = [[], []];\n    var v = [];\n    scale /= 2;\n\n    graph.eachEdge(function (edge, idx) {\n        var linePoints = edge.getLayout();\n        var fromSymbol = edge.getVisual('fromSymbol');\n        var toSymbol = edge.getVisual('toSymbol');\n\n        if (!linePoints.__original) {\n            linePoints.__original = [\n                vec2.clone(linePoints[0]),\n                vec2.clone(linePoints[1])\n            ];\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\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\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\n            vec2.sub(v, pts2[1], pts2[0]);\n            vec2.normalize(v, v);\n            if (fromSymbol && fromSymbol !== 'none') {\n\n                var symbolSize = getSymbolSize(edge.node1);\n\n                vec2.scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);\n            }\n            if (toSymbol && toSymbol !== 'none') {\n                var symbolSize = getSymbolSize(edge.node2);\n\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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport SymbolDraw from '../helper/SymbolDraw';\nimport LineDraw from '../helper/LineDraw';\nimport RoamController from '../../component/helper/RoamController';\nimport * as roamHelper from '../../component/helper/roamHelper';\nimport {onIrrelevantElement} from '../../component/helper/cursorHelper';\nimport * as graphic from '../../util/graphic';\nimport adjustEdge from './adjustEdge';\nimport {getNodeGlobalScale} from './graphHelper';\n\nvar FOCUS_ADJACENCY = '__focusNodeAdjacency';\nvar UNFOCUS_ADJACENCY = '__unfocusNodeAdjacency';\n\nvar nodeOpacityPath = ['itemStyle', 'opacity'];\nvar lineOpacityPath = ['lineStyle', 'opacity'];\n\nfunction getItemOpacity(item, opacityPath) {\n    var opacity = item.getVisual('opacity');\n    return opacity != null ? opacity : item.getModel().get(opacityPath);\n}\n\nfunction fadeOutItem(item, opacityPath, opacityRatio) {\n    var el = item.getGraphicEl();\n    var opacity = getItemOpacity(item, opacityPath);\n\n    if (opacityRatio != null) {\n        opacity == null && (opacity = 1);\n        opacity *= opacityRatio;\n    }\n\n    el.downplay && el.downplay();\n    el.traverse(function (child) {\n        if (!child.isGroup) {\n            var opct = child.lineLabelOriginalOpacity;\n            if (opct == null || opacityRatio != null) {\n                opct = opacity;\n            }\n            child.setStyle('opacity', opct);\n        }\n    });\n}\n\nfunction fadeInItem(item, opacityPath) {\n    var opacity = getItemOpacity(item, opacityPath);\n    var el = item.getGraphicEl();\n    // Should go back to normal opacity first, consider hoverLayer,\n    // where current state is copied to elMirror, and support\n    // emphasis opacity here.\n    el.traverse(function (child) {\n        !child.isGroup && child.setStyle('opacity', opacity);\n    });\n    el.highlight && el.highlight();\n}\n\nexport default echarts.extendChartView({\n\n    type: 'graph',\n\n    init: function (ecModel, api) {\n        var symbolDraw = new SymbolDraw();\n        var lineDraw = new LineDraw();\n        var group = this.group;\n\n        this._controller = new RoamController(api.getZr());\n        this._controllerHost = {target: group};\n\n        group.add(symbolDraw.group);\n        group.add(lineDraw.group);\n\n        this._symbolDraw = symbolDraw;\n        this._lineDraw = lineDraw;\n\n        this._firstRender = true;\n    },\n\n    render: function (seriesModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n\n        this._model = seriesModel;\n\n        var symbolDraw = this._symbolDraw;\n        var lineDraw = this._lineDraw;\n\n        var group = this.group;\n\n        if (coordSys.type === 'view') {\n            var groupNewProp = {\n                position: coordSys.position,\n                scale: coordSys.scale\n            };\n            if (this._firstRender) {\n                group.attr(groupNewProp);\n            }\n            else {\n                graphic.updateProps(group, groupNewProp, seriesModel);\n            }\n        }\n        // Fix edge contact point with node\n        adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n\n        var data = seriesModel.getData();\n        symbolDraw.updateData(data);\n\n        var edgeData = seriesModel.getEdgeData();\n        lineDraw.updateData(edgeData);\n\n        this._updateNodeAndLinkScale();\n\n        this._updateController(seriesModel, ecModel, api);\n\n        clearTimeout(this._layoutTimeout);\n        var forceLayout = seriesModel.forceLayout;\n        var layoutAnimation = seriesModel.get('force.layoutAnimation');\n        if (forceLayout) {\n            this._startForceLayoutIteration(forceLayout, layoutAnimation);\n        }\n\n        data.eachItemGraphicEl(function (el, idx) {\n            var itemModel = data.getItemModel(idx);\n            // Update draggable\n            el.off('drag').off('dragend');\n            var draggable = itemModel.get('draggable');\n            if (draggable) {\n                el.on('drag', function () {\n                    if (forceLayout) {\n                        forceLayout.warmUp();\n                        !this._layouting\n                            && this._startForceLayoutIteration(forceLayout, layoutAnimation);\n                        forceLayout.setFixed(idx);\n                        // Write position back to layout\n                        data.setItemLayout(idx, el.position);\n                    }\n                }, this).on('dragend', function () {\n                    if (forceLayout) {\n                        forceLayout.setUnfixed(idx);\n                    }\n                }, this);\n            }\n            el.setDraggable(draggable && forceLayout);\n\n            el[FOCUS_ADJACENCY] && el.off('mouseover', el[FOCUS_ADJACENCY]);\n            el[UNFOCUS_ADJACENCY] && el.off('mouseout', el[UNFOCUS_ADJACENCY]);\n\n            if (itemModel.get('focusNodeAdjacency')) {\n                el.on('mouseover', el[FOCUS_ADJACENCY] = function () {\n                    api.dispatchAction({\n                        type: 'focusNodeAdjacency',\n                        seriesId: seriesModel.id,\n                        dataIndex: el.dataIndex\n                    });\n                });\n                el.on('mouseout', el[UNFOCUS_ADJACENCY] = function () {\n                    api.dispatchAction({\n                        type: 'unfocusNodeAdjacency',\n                        seriesId: seriesModel.id\n                    });\n                });\n            }\n\n        }, this);\n\n        data.graph.eachEdge(function (edge) {\n            var el = edge.getGraphicEl();\n\n            el[FOCUS_ADJACENCY] && el.off('mouseover', el[FOCUS_ADJACENCY]);\n            el[UNFOCUS_ADJACENCY] && el.off('mouseout', el[UNFOCUS_ADJACENCY]);\n\n            if (edge.getModel().get('focusNodeAdjacency')) {\n                el.on('mouseover', el[FOCUS_ADJACENCY] = function () {\n                    api.dispatchAction({\n                        type: 'focusNodeAdjacency',\n                        seriesId: seriesModel.id,\n                        edgeDataIndex: edge.dataIndex\n                    });\n                });\n                el.on('mouseout', el[UNFOCUS_ADJACENCY] = function () {\n                    api.dispatchAction({\n                        type: 'unfocusNodeAdjacency',\n                        seriesId: seriesModel.id\n                    });\n                });\n            }\n        });\n\n        var circularRotateLabel = seriesModel.get('layout') === 'circular'\n            && seriesModel.get('circular.rotateLabel');\n        var cx = data.getLayout('cx');\n        var cy = data.getLayout('cy');\n        data.eachItemGraphicEl(function (el, idx) {\n            var itemModel = data.getItemModel(idx);\n            var labelRotate = itemModel.get('label.rotate') || 0;\n            var symbolPath = el.getSymbolPath();\n            if (circularRotateLabel) {\n                var pos = data.getItemLayout(idx);\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                graphic.modifyLabelStyle(\n                    symbolPath,\n                    {\n                        textRotation: -rad,\n                        textPosition: textPosition,\n                        textOrigin: 'center'\n                    },\n                    {\n                        textPosition: textPosition\n                    }\n                );\n            }\n            else {\n                graphic.modifyLabelStyle(\n                    symbolPath,\n                    {\n                        textRotation: labelRotate *= Math.PI / 180\n                    }\n                );\n            }\n        });\n\n        this._firstRender = false;\n    },\n\n    dispose: function () {\n        this._controller && this._controller.dispose();\n        this._controllerHost = {};\n    },\n\n    focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {\n        var data = this._model.getData();\n        var graph = data.graph;\n        var dataIndex = payload.dataIndex;\n        var edgeDataIndex = payload.edgeDataIndex;\n\n        var node = graph.getNodeByIndex(dataIndex);\n        var edge = graph.getEdgeByIndex(edgeDataIndex);\n\n        if (!node && !edge) {\n            return;\n        }\n\n        graph.eachNode(function (node) {\n            fadeOutItem(node, nodeOpacityPath, 0.1);\n        });\n        graph.eachEdge(function (edge) {\n            fadeOutItem(edge, lineOpacityPath, 0.1);\n        });\n\n        if (node) {\n            fadeInItem(node, nodeOpacityPath);\n            zrUtil.each(node.edges, function (adjacentEdge) {\n                if (adjacentEdge.dataIndex < 0) {\n                    return;\n                }\n                fadeInItem(adjacentEdge, lineOpacityPath);\n                fadeInItem(adjacentEdge.node1, nodeOpacityPath);\n                fadeInItem(adjacentEdge.node2, nodeOpacityPath);\n            });\n        }\n        if (edge) {\n            fadeInItem(edge, lineOpacityPath);\n            fadeInItem(edge.node1, nodeOpacityPath);\n            fadeInItem(edge.node2, nodeOpacityPath);\n        }\n    },\n\n    unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {\n        var graph = this._model.getData().graph;\n\n        graph.eachNode(function (node) {\n            fadeOutItem(node, nodeOpacityPath);\n        });\n        graph.eachEdge(function (edge) {\n            fadeOutItem(edge, lineOpacityPath);\n        });\n    },\n\n    _startForceLayoutIteration: function (forceLayout, layoutAnimation) {\n        var self = this;\n        (function step() {\n            forceLayout.step(function (stopped) {\n                self.updateLayout(self._model);\n                (self._layouting = !stopped) && (\n                    layoutAnimation\n                        ? (self._layoutTimeout = setTimeout(step, 16))\n                        : step()\n                );\n            });\n        })();\n    },\n\n    _updateController: function (seriesModel, ecModel, api) {\n        var controller = this._controller;\n        var controllerHost = this._controllerHost;\n        var group = this.group;\n\n        controller.setPointerChecker(function (e, x, y) {\n            var rect = group.getBoundingRect();\n            rect.applyTransform(group.transform);\n            return rect.contain(x, y)\n                && !onIrrelevantElement(e, api, seriesModel);\n        });\n\n        if (seriesModel.coordinateSystem.type !== 'view') {\n            controller.disable();\n            return;\n        }\n        controller.enable(seriesModel.get('roam'));\n        controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n        controllerHost.zoom = seriesModel.coordinateSystem.getZoom();\n\n        controller\n            .off('pan')\n            .off('zoom')\n            .on('pan', function (e) {\n                roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy);\n                api.dispatchAction({\n                    seriesId: seriesModel.id,\n                    type: 'graphRoam',\n                    dx: e.dx,\n                    dy: e.dy\n                });\n            })\n            .on('zoom', function (e) {\n                roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n                api.dispatchAction({\n                    seriesId: seriesModel.id,\n                    type: 'graphRoam',\n                    zoom: e.scale,\n                    originX: e.originX,\n                    originY: e.originY\n                });\n                this._updateNodeAndLinkScale();\n                adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n                this._lineDraw.updateLayout();\n            }, this);\n    },\n\n    _updateNodeAndLinkScale: function () {\n        var seriesModel = this._model;\n        var data = seriesModel.getData();\n\n        var nodeScale = getNodeGlobalScale(seriesModel);\n        var invScale = [nodeScale, nodeScale];\n\n        data.eachItemGraphicEl(function (el, idx) {\n            el.attr('scale', invScale);\n        });\n    },\n\n    updateLayout: function (seriesModel) {\n        adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n\n        this._symbolDraw.updateLayout();\n        this._lineDraw.updateLayout();\n    },\n\n    remove: function (ecModel, api) {\n        this._symbolDraw && this._symbolDraw.remove();\n        this._lineDraw && this._lineDraw.remove();\n    }\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\n\n/**\n * @payload\n * @property {number} [seriesIndex]\n * @property {string} [seriesId]\n * @property {string} [seriesName]\n * @property {number} [dataIndex]\n */\necharts.registerAction({\n    type: 'focusNodeAdjacency',\n    event: 'focusNodeAdjacency',\n    update: 'series:focusNodeAdjacency'\n}, function () {});\n\n/**\n * @payload\n * @property {number} [seriesIndex]\n * @property {string} [seriesId]\n * @property {string} [seriesName]\n */\necharts.registerAction({\n    type: 'unfocusNodeAdjacency',\n    event: 'unfocusNodeAdjacency',\n    update: 'series:unfocusNodeAdjacency'\n}, function () {});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport {updateCenterAndZoom} from '../../action/roamHelper';\nimport '../helper/focusNodeAdjacencyAction';\n\nvar actionInfo = {\n    type: 'graphRoam',\n    event: 'graphRoam',\n    update: 'none'\n};\n\n/**\n * @payload\n * @property {string} name Series name\n * @property {number} [dx]\n * @property {number} [dy]\n * @property {number} [zoom]\n * @property {number} [originX]\n * @property {number} [originY]\n */\necharts.registerAction(actionInfo, function (payload, ecModel) {\n    ecModel.eachComponent({mainType: 'series', query: payload}, function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n\n        var res = updateCenterAndZoom(coordSys, payload);\n\n        seriesModel.setCenter\n            && seriesModel.setCenter(res.center);\n\n        seriesModel.setZoom\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\nexport default function (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\n        var categoryNames = categoriesData.mapArray(categoriesData.getName);\n\n        data.filterSelf(function (idx) {\n            var model = data.getItemModel(idx);\n            var category = model.getShallow('category');\n            if (category != null) {\n                if (typeof category === 'number') {\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    }, this);\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nexport default function (ecModel) {\n\n    var paletteScope = {};\n    ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var categoriesData = seriesModel.getCategoriesData();\n        var data = seriesModel.getData();\n\n        var categoryNameIdxMap = {};\n\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\n            var color = itemModel.get('itemStyle.color')\n                || seriesModel.getColorFromPalette(name, paletteScope);\n            categoriesData.setItemVisual(idx, 'color', color);\n\n            var itemStyleList = ['opacity', 'symbol', 'symbolSize', 'symbolKeepAspect'];\n            for (var i = 0; i < itemStyleList.length; i++) {\n                var itemStyle = itemModel.getShallow(itemStyleList[i], true);\n                if (itemStyle != null) {\n                    categoriesData.setItemVisual(idx, itemStyleList[i], itemStyle);\n                }\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 category = model.getShallow('category');\n                if (category != null) {\n                    if (typeof category === 'string') {\n                        category = categoryNameIdxMap['ec-' + category];\n                    }\n\n                    var itemStyleList = ['color', 'opacity', 'symbol', 'symbolSize', 'symbolKeepAspect'];\n\n                    for (var i = 0; i < itemStyleList.length; i++) {\n                        if (data.getItemVisual(idx, itemStyleList[i], true) == null) {\n                            data.setItemVisual(\n                                idx, itemStyleList[i],\n                                categoriesData.getItemVisual(category, itemStyleList[i])\n                            );\n                        }\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\nfunction normalize(a) {\n    if (!(a instanceof Array)) {\n        a = [a, a];\n    }\n    return a;\n}\n\nexport default function (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\n        var colorQuery = 'lineStyle.color'.split('.');\n        var opacityQuery = 'lineStyle.opacity'.split('.');\n\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('color', seriesModel.get(colorQuery));\n        edgeData.setVisual('opacity', seriesModel.get(opacityQuery));\n\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 color = itemModel.get(colorQuery);\n            var opacity = itemModel.get(opacityQuery);\n            switch (color) {\n                case 'source':\n                    color = edge.node1.getVisual('color');\n                    break;\n                case 'target':\n                    color = edge.node2.getVisual('color');\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            edge.setVisual('color', color);\n            edge.setVisual('opacity', opacity);\n        });\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as vec2 from 'zrender/src/core/vector';\n\nexport function simpleLayout(seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && coordSys.type !== 'view') {\n        return;\n    }\n    var graph = seriesModel.getGraph();\n\n    graph.eachNode(function (node) {\n        var model = node.getModel();\n        node.setLayout([+model.get('x'), +model.get('y')]);\n    });\n\n    simpleLayoutEdge(graph);\n}\n\nexport function simpleLayoutEdge(graph) {\n    graph.eachEdge(function (edge) {\n        var curveness = edge.getModel().get('lineStyle.curveness') || 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([\n                (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness,\n                (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness\n            ]);\n        }\n        edge.setLayout(points);\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {each} from 'zrender/src/core/util';\nimport {simpleLayout, simpleLayoutEdge} from './simpleLayoutHelper';\n\nexport default function (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 = seriesModel.getData();\n\n            var dimensions = [];\n            each(coordSys.dimensions, function (coordDim) {\n                dimensions = dimensions.concat(data.mapDimension(coordDim, true));\n            });\n\n            for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {\n                var value = [];\n                var hasValue = false;\n                for (var i = 0; i < dimensions.length; i++) {\n                    var val = data.get(dimensions[i], dataIndex);\n                    if (!isNaN(val)) {\n                        hasValue = true;\n                    }\n                    value.push(val);\n                }\n                if (hasValue) {\n                    data.setItemLayout(dataIndex, coordSys.dataToPoint(value));\n                }\n                else {\n                    // Also {Array.<number>}, not undefined to avoid if...else... statement\n                    data.setItemLayout(dataIndex, [NaN, NaN]);\n                }\n            }\n\n            simpleLayoutEdge(data.graph);\n        }\n        else if (!layout || layout === 'none') {\n            simpleLayout(seriesModel);\n        }\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as vec2 from 'zrender/src/core/vector';\nimport {getSymbolSize, getNodeGlobalScale} from './graphHelper';\n\nvar PI = Math.PI;\n\nvar _symbolRadiansHalf = [];\n\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 *\n * @param {module:echarts/src/model/Series} seriesModel\n * @param {string} basedOn 'value' or 'symbolSize'\n */\nexport function circularLayout(seriesModel, basedOn) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && coordSys.type !== 'view') {\n        return;\n    }\n\n    var rect = coordSys.getBoundingRect();\n\n    var nodeData = seriesModel.getData();\n    var graph = nodeData.graph;\n\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\n    nodeData.setLayout({\n        cx: cx,\n        cy: cy\n    });\n\n    if (!count) {\n        return;\n    }\n\n    _layoutNodesBasedOn[basedOn](seriesModel, coordSys, graph, nodeData, r, cx, cy, count);\n\n    graph.eachEdge(function (edge) {\n        var curveness = edge.getModel().get('lineStyle.curveness') || 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 = [\n                cx * curveness + x12 * (1 - curveness),\n                cy * curveness + y12 * (1 - curveness)\n            ];\n        }\n        edge.setLayout([p1, p2, cp1]);\n    });\n}\n\nvar _layoutNodesBasedOn = {\n\n    value: function (seriesModel, coordSys, 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\n        graph.eachNode(function (node) {\n            var value = node.getValue('value');\n            var radianHalf = unitAngle * (sum ? value : 1) / 2;\n\n            angle += radianHalf;\n            node.setLayout([\n                r * Math.cos(angle) + cx,\n                r * Math.sin(angle) + cy\n            ]);\n            angle += radianHalf;\n        });\n    },\n\n    symbolSize: function (seriesModel, coordSys, graph, nodeData, r, cx, cy, count) {\n        var sumRadian = 0;\n        _symbolRadiansHalf.length = count;\n\n        var nodeScale = getNodeGlobalScale(seriesModel);\n\n        graph.eachNode(function (node) {\n            var symbolSize = getSymbolSize(node);\n\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\n            symbolSize *= nodeScale;\n\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\n        var halfRemainRadian = (2 * PI - sumRadian) / count / 2;\n\n        var angle = 0;\n        graph.eachNode(function (node) {\n            var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex];\n\n            angle += radianHalf;\n            node.setLayout([\n                r * Math.cos(angle) + cx,\n                r * Math.sin(angle) + cy\n            ]);\n            angle += radianHalf;\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\nimport {circularLayout} from './circularLayoutHelper';\n\nexport default function (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* A third-party license is embeded 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*/\n\nimport * as vec2 from 'zrender/src/core/vector';\n\nvar scaleAndAdd = vec2.scaleAndAdd;\n\n// function adjacentNode(n, e) {\n//     return e.n1 === n ? e.n2 : e.n1;\n// }\n\nexport function forceLayout(nodes, edges, opts) {\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    // var scale = opts.scale || 1;\n    var gravity = opts.gravity == null ? 0.1 : opts.gravity;\n\n    // for (var i = 0; i < edges.length; i++) {\n    //     var e = edges[i];\n    //     var n1 = e.n1;\n    //     var 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(\n                width * (Math.random() - 0.5) + center[0],\n                height * (Math.random() - 0.5) + center[1]\n            );\n        }\n        n.pp = vec2.clone(n.p);\n        n.edges = null;\n    }\n\n    // Formula in 'Graph Drawing by Force-directed Placement'\n    // var k = scale * Math.sqrt(width * height / nodes.length);\n    // var k2 = k * k;\n\n    var friction = 0.6;\n\n    return {\n        warmUp: function () {\n            friction = 0.5;\n        },\n\n        setFixed: function (idx) {\n            nodes[idx].fixed = true;\n        },\n\n        setUnfixed: function (idx) {\n            nodes[idx].fixed = false;\n        },\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            var v12 = [];\n            var nLen = nodes.length;\n            for (var i = 0; i < edges.length; i++) {\n                var e = edges[i];\n                var n1 = e.n1;\n                var n2 = e.n2;\n\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\n                if (isNaN(w)) {\n                    w = 0;\n                }\n\n                vec2.normalize(v12, v12);\n\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                    // var d = vec2.len(v12);\n                    // vec2.scale(v12, v12, 1 / d);\n                    // var gravityFactor = gravity;\n                    scaleAndAdd(n.p, n.p, v12, gravity * friction);\n                }\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\n            friction = friction * 0.992;\n\n            cb && cb(nodes, edges, friction < 0.01);\n        }\n    };\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {forceLayout} from './forceHelper';\nimport {simpleLayout} from './simpleLayoutHelper';\nimport {circularLayout} from './circularLayoutHelper';\nimport {linearMap} from '../../util/number';\nimport * as vec2 from 'zrender/src/core/vector';\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (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 = graphSeries.preservedPoints || {};\n            var graph = graphSeries.getGraph();\n            var nodeData = graph.data;\n            var edgeData = graph.edgeData;\n            var forceModel = graphSeries.getModel('force');\n            var initLayout = forceModel.get('initLayout');\n            if (graphSeries.preservedPoints) {\n                nodeData.each(function (idx) {\n                    var id = nodeData.getId(idx);\n                    nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);\n                });\n            }\n            else if (!initLayout || initLayout === 'none') {\n                simpleLayout(graphSeries);\n            }\n            else if (initLayout === 'circular') {\n                circularLayout(graphSeries, 'value');\n            }\n\n            var nodeDataExtent = nodeData.getDataExtent('value');\n            var edgeDataExtent = edgeData.getDataExtent('value');\n            // var edgeDataExtent = edgeData.getDataExtent('value');\n            var repulsion = forceModel.get('repulsion');\n            var edgeLength = forceModel.get('edgeLength');\n            if (!zrUtil.isArray(repulsion)) {\n                repulsion = [repulsion, repulsion];\n            }\n            if (!zrUtil.isArray(edgeLength)) {\n                edgeLength = [edgeLength, edgeLength];\n            }\n            // Larger value has smaller length\n            edgeLength = [edgeLength[1], edgeLength[0]];\n\n            var nodes = nodeData.mapArray('value', function (value, idx) {\n                var point = nodeData.getItemLayout(idx);\n                var rep = linearMap(value, nodeDataExtent, repulsion);\n                if (isNaN(rep)) {\n                    rep = (repulsion[0] + repulsion[1]) / 2;\n                }\n                return {\n                    w: rep,\n                    rep: rep,\n                    fixed: nodeData.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.getEdgeByIndex(idx);\n                var d = linearMap(value, edgeDataExtent, edgeLength);\n                if (isNaN(d)) {\n                    d = (edgeLength[0] + edgeLength[1]) / 2;\n                }\n                return {\n                    n1: nodes[edge.node1.dataIndex],\n                    n2: nodes[edge.node2.dataIndex],\n                    d: d,\n                    curveness: edge.getModel().get('lineStyle.curveness') || 0\n                };\n            });\n\n            var coordSys = graphSeries.coordinateSystem;\n            var rect = coordSys.getBoundingRect();\n            var forceInstance = forceLayout(nodes, edges, {\n                rect: rect,\n                gravity: forceModel.get('gravity')\n            });\n            var oldStep = forceInstance.step;\n            forceInstance.step = function (cb) {\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.getNodeByIndex(i).getLayout());\n                    }\n                }\n                oldStep(function (nodes, edges, stopped) {\n                    for (var i = 0, l = nodes.length; i < l; i++) {\n                        if (!nodes[i].fixed) {\n                            graph.getNodeByIndex(i).setLayout(nodes[i].p);\n                        }\n                        preservedPoints[nodeData.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.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] = [\n                                (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness,\n                                (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness\n                            ];\n                        }\n                        edge.setLayout(points);\n                    }\n                    // Update layout\n\n                    cb && cb(stopped);\n                });\n            };\n            graphSeries.forceLayout = forceInstance;\n            graphSeries.preservedPoints = preservedPoints;\n\n            // Step to get the layout\n            forceInstance.step();\n        }\n        else {\n            // Remove prev injected forceLayout instance\n            graphSeries.forceLayout = 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// FIXME Where to create the simple view coordinate system\nimport View from '../../coord/View';\nimport {getLayoutRect} from '../../util/layout';\nimport * as bbox from 'zrender/src/core/bbox';\n\nfunction getViewRect(seriesModel, api, aspect) {\n    var option = seriesModel.getBoxLayoutParams();\n    option.aspect = aspect;\n    return getLayoutRect(option, {\n        width: api.getWidth(),\n        height: api.getHeight()\n    });\n}\n\nexport default function (ecModel, api) {\n    var viewList = [];\n    ecModel.eachSeriesByType('graph', function (seriesModel) {\n        var coordSysType = seriesModel.get('coordinateSystem');\n        if (!coordSysType || coordSysType === 'view') {\n\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\n            var min = [];\n            var max = [];\n\n            bbox.fromPoints(positions, min, max);\n\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\n            var bbWidth = max[0] - min[0];\n            var bbHeight = max[1] - min[1];\n\n            var viewWidth = viewRect.width;\n            var viewHeight = viewRect.height;\n\n            var viewCoordSys = seriesModel.coordinateSystem = new View();\n            viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n\n            viewCoordSys.setBoundingRect(\n                min[0], min[1], bbWidth, bbHeight\n            );\n            viewCoordSys.setViewRect(\n                viewRect.x, viewRect.y, viewWidth, viewHeight\n            );\n\n            // Update roam info\n            viewCoordSys.setCenter(seriesModel.get('center'));\n            viewCoordSys.setZoom(seriesModel.get('zoom'));\n\n            viewList.push(viewCoordSys);\n        }\n    });\n\n    return viewList;\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './graph/GraphSeries';\nimport './graph/GraphView';\nimport './graph/graphAction';\n\nimport categoryFilter from './graph/categoryFilter';\nimport visualSymbol from '../visual/symbol';\nimport categoryVisual from './graph/categoryVisual';\nimport edgeVisual from './graph/edgeVisual';\nimport simpleLayout from './graph/simpleLayout';\nimport circularLayout from './graph/circularLayout';\nimport forceLayout from './graph/forceLayout';\nimport createView from './graph/createView';\n\necharts.registerProcessor(categoryFilter);\n\necharts.registerVisual(visualSymbol('graph', 'circle', null));\necharts.registerVisual(categoryVisual);\necharts.registerVisual(edgeVisual);\n\necharts.registerLayout(simpleLayout);\necharts.registerLayout(echarts.PRIORITY.VISUAL.POST_CHART_LAYOUT, circularLayout);\necharts.registerLayout(forceLayout);\n\n// Graph view coordinate system\necharts.registerCoordinateSystem('graphView', {\n    create: createView\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport createListSimply from '../helper/createListSimply';\nimport SeriesModel from '../../model/Series';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar GaugeSeries = SeriesModel.extend({\n\n    type: 'series.gauge',\n\n    getInitialData: function (option, ecModel) {\n        var dataOpt = option.data || [];\n        if (!zrUtil.isArray(dataOpt)) {\n            dataOpt = [dataOpt];\n        }\n        option.data = dataOpt;\n        return createListSimply(this, ['value']);\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        // 默认全局居中\n        center: ['50%', '50%'],\n        legendHoverLink: true,\n        radius: '75%',\n        startAngle: 225,\n        endAngle: -45,\n        clockwise: true,\n        // 最小值\n        min: 0,\n        // 最大值\n        max: 100,\n        // 分割段数，默认为10\n        splitNumber: 10,\n        // 坐标轴线\n        axisLine: {\n            // 默认显示，属性show控制显示与否\n            show: true,\n            lineStyle: {       // 属性lineStyle控制线条样式\n                color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']],\n                width: 30\n            }\n        },\n        // 分隔线\n        splitLine: {\n            // 默认显示，属性show控制显示与否\n            show: true,\n            // 属性length控制线长\n            length: 30,\n            // 属性lineStyle（详见lineStyle）控制线条样式\n            lineStyle: {\n                color: '#eee',\n                width: 2,\n                type: 'solid'\n            }\n        },\n        // 坐标轴小标记\n        axisTick: {\n            // 属性show控制显示与否，默认不显示\n            show: true,\n            // 每份split细分多少段\n            splitNumber: 5,\n            // 属性length控制线长\n            length: 8,\n            // 属性lineStyle控制线条样式\n            lineStyle: {\n                color: '#eee',\n                width: 1,\n                type: 'solid'\n            }\n        },\n        axisLabel: {\n            show: true,\n            distance: 5,\n            // formatter: null,\n            color: 'auto'\n        },\n        pointer: {\n            show: true,\n            length: '80%',\n            width: 8\n        },\n        itemStyle: {\n            color: 'auto'\n        },\n        title: {\n            show: true,\n            // x, y，单位px\n            offsetCenter: [0, '-40%'],\n            // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n            color: '#333',\n            fontSize: 15\n        },\n        detail: {\n            show: true,\n            backgroundColor: 'rgba(0,0,0,0)',\n            borderWidth: 0,\n            borderColor: '#ccc',\n            width: 100,\n            height: null, // self-adaption\n            padding: [5, 10],\n            // x, y，单位px\n            offsetCenter: [0, '40%'],\n            // formatter: null,\n            // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n            color: 'auto',\n            fontSize: 30\n        }\n    }\n});\n\nexport default GaugeSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport Path from 'zrender/src/graphic/Path';\n\nexport default Path.extend({\n\n    type: 'echartsGaugePointer',\n\n    shape: {\n        angle: 0,\n\n        width: 10,\n\n        r: 10,\n\n        x: 0,\n\n        y: 0\n    },\n\n    buildPath: function (ctx, shape) {\n        var mathCos = Math.cos;\n        var mathSin = Math.sin;\n\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\n        angle = shape.angle - Math.PI / 2;\n        ctx.moveTo(x, y);\n        ctx.lineTo(\n            shape.x + mathCos(angle) * width,\n            shape.y + mathSin(angle) * width\n        );\n        ctx.lineTo(\n            shape.x + mathCos(shape.angle) * r,\n            shape.y + mathSin(shape.angle) * r\n        );\n        ctx.lineTo(\n            shape.x - mathCos(angle) * width,\n            shape.y - mathSin(angle) * width\n        );\n        ctx.lineTo(x, y);\n        return;\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport PointerPath from './PointerPath';\nimport * as graphic from '../../util/graphic';\nimport ChartView from '../../view/Chart';\nimport {parsePercent, round, linearMap} from '../../util/number';\n\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\n    return {\n        cx: cx,\n        cy: cy,\n        r: r\n    };\n}\n\nfunction formatLabel(label, labelFormatter) {\n    if (labelFormatter) {\n        if (typeof labelFormatter === 'string') {\n            label = labelFormatter.replace('{value}', label != null ? label : '');\n        }\n        else if (typeof labelFormatter === 'function') {\n            label = labelFormatter(label);\n        }\n    }\n\n    return label;\n}\n\nvar PI2 = Math.PI * 2;\n\nvar GaugeView = ChartView.extend({\n\n    type: 'gauge',\n\n    render: function (seriesModel, ecModel, api) {\n\n        this.group.removeAll();\n\n        var colorList = seriesModel.get('axisLine.lineStyle.color');\n        var posInfo = parsePosition(seriesModel, api);\n\n        this._renderMain(\n            seriesModel, ecModel, api, colorList, posInfo\n        );\n    },\n\n    dispose: function () {},\n\n    _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) {\n        var group = this.group;\n\n        var axisLineModel = seriesModel.getModel('axisLine');\n        var lineStyleModel = axisLineModel.getModel('lineStyle');\n\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\n        var angleRangeSpan = (endAngle - startAngle) % PI2;\n\n        var prevEndAngle = startAngle;\n        var axisLineWidth = lineStyleModel.get('width');\n        var showAxis = axisLineModel.get('show');\n        \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            var endAngle = startAngle + angleRangeSpan * percent;\n            var sector = new graphic.Sector({\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\n            sector.setStyle({\n                fill: colorList[i][1]\n            });\n\n            sector.setStyle(lineStyleModel.getLineStyle(\n                // Because we use sector to simulate arc\n                // so the properties for stroking are useless\n                ['color', 'borderWidth', 'borderColor']\n            ));\n\n            group.add(sector);\n\n            prevEndAngle = endAngle;\n        }\n\n        var getColor = function (percent) {\n            // Less than 0\n            if (percent <= 0) {\n                return colorList[0][1];\n            }\n            for (var i = 0; i < colorList.length; i++) {\n                if (colorList[i][0] >= percent\n                    && (i === 0 ? 0 : colorList[i - 1][0]) < percent\n                ) {\n                    return colorList[i][1];\n                }\n            }\n            // More than 1\n            return colorList[i - 1][1];\n        };\n\n        if (!clockwise) {\n            var tmp = startAngle;\n            startAngle = endAngle;\n            endAngle = tmp;\n        }\n\n        this._renderTicks(\n            seriesModel, ecModel, api, getColor, posInfo,\n            startAngle, endAngle, clockwise\n        );\n\n        this._renderPointer(\n            seriesModel, ecModel, api, getColor, posInfo,\n            startAngle, endAngle, clockwise\n        );\n\n        this._renderTitle(\n            seriesModel, ecModel, api, getColor, posInfo\n        );\n        this._renderDetail(\n            seriesModel, ecModel, api, getColor, posInfo\n        );\n    },\n\n    _renderTicks: function (\n        seriesModel, ecModel, api, getColor, posInfo,\n        startAngle, endAngle, clockwise\n    ) {\n        var group = this.group;\n        var cx = posInfo.cx;\n        var cy = posInfo.cy;\n        var r = posInfo.r;\n\n        var minVal = +seriesModel.get('min');\n        var maxVal = +seriesModel.get('max');\n\n        var splitLineModel = seriesModel.getModel('splitLine');\n        var tickModel = seriesModel.getModel('axisTick');\n        var labelModel = seriesModel.getModel('axisLabel');\n\n        var splitNumber = seriesModel.get('splitNumber');\n        var subSplitNumber = tickModel.get('splitNumber');\n\n        var splitLineLen = parsePercent(\n            splitLineModel.get('length'), r\n        );\n        var tickLen = parsePercent(\n            tickModel.get('length'), r\n        );\n\n        var angle = startAngle;\n        var step = (endAngle - startAngle) / splitNumber;\n        var subStep = step / subSplitNumber;\n\n        var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();\n        var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();\n\n        for (var i = 0; i <= splitNumber; i++) {\n            var unitX = Math.cos(angle);\n            var unitY = Math.sin(angle);\n            // Split line\n            if (splitLineModel.get('show')) {\n                var splitLine = new graphic.Line({\n                    shape: {\n                        x1: unitX * r + cx,\n                        y1: unitY * r + cy,\n                        x2: unitX * (r - splitLineLen) + cx,\n                        y2: unitY * (r - splitLineLen) + 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\n                group.add(splitLine);\n            }\n\n            // Label\n            if (labelModel.get('show')) {\n                var label = formatLabel(\n                    round(i / splitNumber * (maxVal - minVal) + minVal),\n                    labelModel.get('formatter')\n                );\n                var distance = labelModel.get('distance');\n                var autoColor = getColor(i / splitNumber);\n\n                group.add(new graphic.Text({\n                    style: graphic.setTextStyle({}, labelModel, {\n                        text: label,\n                        x: unitX * (r - splitLineLen - distance) + cx,\n                        y: unitY * (r - splitLineLen - distance) + cy,\n                        textVerticalAlign: unitY < -0.4 ? 'top' : (unitY > 0.4 ? 'bottom' : 'middle'),\n                        textAlign: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center')\n                    }, {autoColor: autoColor}),\n                    silent: true\n                }));\n            }\n\n            // Axis tick\n            if (tickModel.get('show') && i !== splitNumber) {\n                for (var j = 0; j <= subSplitNumber; j++) {\n                    var unitX = Math.cos(angle);\n                    var unitY = Math.sin(angle);\n                    var tickLine = new graphic.Line({\n                        shape: {\n                            x1: unitX * r + cx,\n                            y1: unitY * r + cy,\n                            x2: unitX * (r - tickLen) + cx,\n                            y2: unitY * (r - tickLen) + cy\n                        },\n                        silent: true,\n                        style: tickLineStyle\n                    });\n\n                    if (tickLineStyle.stroke === 'auto') {\n                        tickLine.setStyle({\n                            stroke: getColor((i + j / subSplitNumber) / splitNumber)\n                        });\n                    }\n\n                    group.add(tickLine);\n                    angle += subStep;\n                }\n                angle -= subStep;\n            }\n            else {\n                angle += step;\n            }\n        }\n    },\n\n    _renderPointer: function (\n        seriesModel, ecModel, api, getColor, posInfo,\n        startAngle, endAngle, clockwise\n    ) {\n\n        var group = this.group;\n        var oldData = this._data;\n\n        if (!seriesModel.get('pointer.show')) {\n            // Remove old element\n            oldData && oldData.eachItemGraphicEl(function (el) {\n                group.remove(el);\n            });\n            return;\n        }\n\n        var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];\n        var angleExtent = [startAngle, endAngle];\n\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n\n        data.diff(oldData)\n            .add(function (idx) {\n                var pointer = new PointerPath({\n                    shape: {\n                        angle: startAngle\n                    }\n                });\n\n                graphic.initProps(pointer, {\n                    shape: {\n                        angle: linearMap(data.get(valueDim, idx), valueExtent, angleExtent, true)\n                    }\n                }, seriesModel);\n\n                group.add(pointer);\n                data.setItemGraphicEl(idx, pointer);\n            })\n            .update(function (newIdx, oldIdx) {\n                var pointer = oldData.getItemGraphicEl(oldIdx);\n\n                graphic.updateProps(pointer, {\n                    shape: {\n                        angle: linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, true)\n                    }\n                }, seriesModel);\n\n                group.add(pointer);\n                data.setItemGraphicEl(newIdx, pointer);\n            })\n            .remove(function (idx) {\n                var pointer = oldData.getItemGraphicEl(idx);\n                group.remove(pointer);\n            })\n            .execute();\n\n        data.eachItemGraphicEl(function (pointer, idx) {\n            var itemModel = data.getItemModel(idx);\n            var pointerModel = itemModel.getModel('pointer');\n\n            pointer.setShape({\n                x: posInfo.cx,\n                y: posInfo.cy,\n                width: parsePercent(\n                    pointerModel.get('width'), posInfo.r\n                ),\n                r: parsePercent(pointerModel.get('length'), posInfo.r)\n            });\n\n            pointer.useStyle(itemModel.getModel('itemStyle').getItemStyle());\n\n            if (pointer.style.fill === 'auto') {\n                pointer.setStyle('fill', getColor(\n                    linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true)\n                ));\n            }\n\n            graphic.setHoverStyle(\n                pointer, itemModel.getModel('emphasis.itemStyle').getItemStyle()\n            );\n        });\n\n        this._data = data;\n    },\n\n    _renderTitle: function (\n        seriesModel, ecModel, api, getColor, posInfo\n    ) {\n        var data = seriesModel.getData();\n        var valueDim = data.mapDimension('value');\n        var titleModel = seriesModel.getModel('title');\n        if (titleModel.get('show')) {\n            var offsetCenter = titleModel.get('offsetCenter');\n            var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);\n            var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);\n\n            var minVal = +seriesModel.get('min');\n            var maxVal = +seriesModel.get('max');\n            var value = seriesModel.getData().get(valueDim, 0);\n            var autoColor = getColor(\n                linearMap(value, [minVal, maxVal], [0, 1], true)\n            );\n\n            this.group.add(new graphic.Text({\n                silent: true,\n                style: graphic.setTextStyle({}, titleModel, {\n                    x: x,\n                    y: y,\n                    // FIXME First data name ?\n                    text: data.getName(0),\n                    textAlign: 'center',\n                    textVerticalAlign: 'middle'\n                }, {autoColor: autoColor, forceRich: true})\n            }));\n        }\n    },\n\n    _renderDetail: function (\n        seriesModel, ecModel, api, getColor, posInfo\n    ) {\n        var detailModel = seriesModel.getModel('detail');\n        var minVal = +seriesModel.get('min');\n        var maxVal = +seriesModel.get('max');\n        if (detailModel.get('show')) {\n            var offsetCenter = detailModel.get('offsetCenter');\n            var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);\n            var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);\n            var width = parsePercent(detailModel.get('width'), posInfo.r);\n            var height = parsePercent(detailModel.get('height'), posInfo.r);\n            var data = seriesModel.getData();\n            var value = data.get(data.mapDimension('value'), 0);\n            var autoColor = getColor(\n                linearMap(value, [minVal, maxVal], [0, 1], true)\n            );\n\n            this.group.add(new graphic.Text({\n                silent: true,\n                style: graphic.setTextStyle({}, detailModel, {\n                    x: x,\n                    y: y,\n                    text: formatLabel(\n                        // FIXME First data name ?\n                        value, detailModel.get('formatter')\n                    ),\n                    textWidth: isNaN(width) ? null : width,\n                    textHeight: isNaN(height) ? null : height,\n                    textAlign: 'center',\n                    textVerticalAlign: 'middle'\n                }, {autoColor: autoColor, forceRich: true})\n            }));\n        }\n    }\n});\n\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\nimport './gauge/GaugeSeries';\nimport './gauge/GaugeView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport createListSimply from '../helper/createListSimply';\nimport {defaultEmphasis} from '../../util/model';\n\nvar FunnelSeries = echarts.extendSeriesModel({\n\n    type: 'series.funnel',\n\n    init: function (option) {\n        FunnelSeries.superApply(this, 'init', arguments);\n\n        // Enable legend selection for each data item\n        // Use a function instead of direct access because data reference may changed\n        this.legendDataProvider = function () {\n            return this.getRawData();\n        };\n        // Extend labelLine emphasis\n        this._defaultLabelLine(option);\n    },\n\n    getInitialData: function (option, ecModel) {\n        return createListSimply(this, ['value']);\n    },\n\n    _defaultLabelLine: function (option) {\n        // Extend labelLine emphasis\n        defaultEmphasis(option, 'labelLine', ['show']);\n\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\n            && option.label.show;\n        labelLineEmphasisOpt.show = labelLineEmphasisOpt.show\n            && option.emphasis.label.show;\n    },\n\n    // Overwrite\n    getDataParams: function (dataIndex) {\n        var data = this.getData();\n        var params = FunnelSeries.superCall(this, 'getDataParams', 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\n        params.$vars.push('percent');\n        return params;\n    },\n\n    defaultOption: {\n        zlevel: 0,                  // 一级层叠\n        z: 2,                       // 二级层叠\n        legendHoverLink: true,\n        left: 80,\n        top: 60,\n        right: 80,\n        bottom: 60,\n        // width: {totalWidth} - left - right,\n        // height: {totalHeight} - top - bottom,\n\n        // 默认取数据最小最大值\n        // min: 0,\n        // max: 100,\n        minSize: '0%',\n        maxSize: '100%',\n        sort: 'descending', // 'ascending', 'descending'\n        gap: 0,\n        funnelAlign: 'center',\n        label: {\n            show: true,\n            position: 'outer'\n            // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n        },\n        labelLine: {\n            show: true,\n            length: 20,\n            lineStyle: {\n                // color: 各异,\n                width: 1,\n                type: 'solid'\n            }\n        },\n        itemStyle: {\n            // color: 各异,\n            borderColor: '#fff',\n            borderWidth: 1\n        },\n        emphasis: {\n            label: {\n                show: true\n            }\n        }\n    }\n});\n\nexport default FunnelSeries;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as graphic from '../../util/graphic';\nimport * as zrUtil from 'zrender/src/core/util';\nimport ChartView from '../../view/Chart';\n\n/**\n * Piece of pie including Sector, Label, LabelLine\n * @constructor\n * @extends {module:zrender/graphic/Group}\n */\nfunction FunnelPiece(data, idx) {\n\n    graphic.Group.call(this);\n\n    var polygon = new graphic.Polygon();\n    var labelLine = new graphic.Polyline();\n    var text = new graphic.Text();\n    this.add(polygon);\n    this.add(labelLine);\n    this.add(text);\n\n    this.highDownOnUpdate = function (fromState, toState) {\n        if (toState === 'emphasis') {\n            labelLine.ignore = labelLine.hoverIgnore;\n            text.ignore = text.hoverIgnore;\n        }\n        else {\n            labelLine.ignore = labelLine.normalIgnore;\n            text.ignore = text.normalIgnore;\n        }\n    };\n\n    this.updateData(data, idx, true);\n}\n\nvar funnelPieceProto = FunnelPiece.prototype;\n\nvar opacityAccessPath = ['itemStyle', 'opacity'];\nfunnelPieceProto.updateData = function (data, idx, firstCreate) {\n\n    var polygon = this.childAt(0);\n\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var opacity = data.getItemModel(idx).get(opacityAccessPath);\n    opacity = opacity == null ? 1 : opacity;\n\n    // Reset style\n    polygon.useStyle({});\n\n    if (firstCreate) {\n        polygon.setShape({\n            points: layout.points\n        });\n        polygon.setStyle({opacity: 0});\n        graphic.initProps(polygon, {\n            style: {\n                opacity: opacity\n            }\n        }, seriesModel, idx);\n    }\n    else {\n        graphic.updateProps(polygon, {\n            style: {\n                opacity: opacity\n            },\n            shape: {\n                points: layout.points\n            }\n        }, seriesModel, idx);\n    }\n\n    // Update common style\n    var itemStyleModel = itemModel.getModel('itemStyle');\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    polygon.setStyle(\n        zrUtil.defaults(\n            {\n                lineJoin: 'round',\n                fill: visualColor\n            },\n            itemStyleModel.getItemStyle(['opacity'])\n        )\n    );\n    polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();\n\n    this._updateLabel(data, idx);\n\n    graphic.setHoverStyle(this);\n};\n\nfunnelPieceProto._updateLabel = function (data, idx) {\n\n    var labelLine = this.childAt(1);\n    var labelText = this.childAt(2);\n\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var labelLayout = layout.label;\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    graphic.updateProps(labelLine, {\n        shape: {\n            points: labelLayout.linePoints || labelLayout.linePoints\n        }\n    }, seriesModel, idx);\n\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        origin: [labelLayout.x, labelLayout.y],\n        z2: 10\n    });\n\n    var labelModel = itemModel.getModel('label');\n    var labelHoverModel = itemModel.getModel('emphasis.label');\n    var labelLineModel = itemModel.getModel('labelLine');\n    var labelLineHoverModel = itemModel.getModel('emphasis.labelLine');\n    var visualColor = data.getItemVisual(idx, 'color');\n\n    graphic.setLabelStyle(\n        labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel,\n        {\n            labelFetcher: data.hostModel,\n            labelDataIndex: idx,\n            defaultText: data.getName(idx),\n            autoColor: visualColor,\n            useInsideStyle: !!labelLayout.inside\n        },\n        {\n            textAlign: labelLayout.textAlign,\n            textVerticalAlign: labelLayout.verticalAlign\n        }\n    );\n\n    labelText.ignore = labelText.normalIgnore = !labelModel.get('show');\n    labelText.hoverIgnore = !labelHoverModel.get('show');\n\n    labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');\n    labelLine.hoverIgnore = !labelLineHoverModel.get('show');\n\n    // Default use item visual color\n    labelLine.setStyle({\n        stroke: visualColor\n    });\n    labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());\n\n    labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();\n};\n\nzrUtil.inherits(FunnelPiece, graphic.Group);\n\n\nvar FunnelView = ChartView.extend({\n\n    type: 'funnel',\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var oldData = this._data;\n\n        var group = this.group;\n\n        data.diff(oldData)\n            .add(function (idx) {\n                var funnelPiece = new FunnelPiece(data, idx);\n\n                data.setItemGraphicEl(idx, funnelPiece);\n\n                group.add(funnelPiece);\n            })\n            .update(function (newIdx, oldIdx) {\n                var piePiece = oldData.getItemGraphicEl(oldIdx);\n\n                piePiece.updateData(data, newIdx);\n\n                group.add(piePiece);\n                data.setItemGraphicEl(newIdx, piePiece);\n            })\n            .remove(function (idx) {\n                var piePiece = oldData.getItemGraphicEl(idx);\n                group.remove(piePiece);\n            })\n            .execute();\n\n        this._data = data;\n    },\n\n    remove: function () {\n        this.group.removeAll();\n        this._data = null;\n    },\n\n    dispose: function () {}\n});\n\nexport default FunnelView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as layout from '../../util/layout';\nimport {parsePercent, linearMap} from '../../util/number';\n\nfunction getViewRect(seriesModel, api) {\n    return layout.getLayoutRect(\n        seriesModel.getBoxLayoutParams(), {\n            width: api.getWidth(),\n            height: api.getHeight()\n        }\n    );\n}\n\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\n    // Add custom sortable function & none sortable opetion by \"options.sort\"\n    if (typeof sort === 'function') {\n        indices.sort(sort);\n    }\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}\n\nfunction labelLayout(data) {\n    data.each(function (idx) {\n        var itemModel = data.getItemModel(idx);\n        var labelModel = itemModel.getModel('label');\n        var labelPosition = labelModel.get('position');\n\n        var labelLineModel = itemModel.getModel('labelLine');\n\n        var layout = data.getItemLayout(idx);\n        var points = layout.points;\n\n        var isLabelInside = labelPosition === 'inner'\n            || labelPosition === 'inside' || labelPosition === 'center'\n            || labelPosition === 'insideLeft' || labelPosition === 'insideRight';\n\n        var textAlign;\n        var textX;\n        var textY;\n        var linePoints;\n\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            }\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            }\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 = [\n                [textX, textY], [textX, textY]\n            ];\n        }\n        else {\n            var x1;\n            var y1;\n            var x2;\n            var labelLineLen = labelLineModel.get('length');\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            } \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            } \n            else if (labelPosition === 'rightTop') {\n                // RightTop side\n                x1 = points[1][0];\n                y1 = points[1][1];\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                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 = points[1][1];\n                x2 = x1 - labelLineLen;\n                textX = x2 - 5;\n                textAlign = 'right';\n            } \n            else if (labelPosition === 'leftBottom') {\n                // LeftBottom side\n                x1 = points[3][0];\n                y1 = points[2][1];\n                x2 = x1 - labelLineLen;\n                textX = x2 - 5;\n                textAlign = 'right';\n            } \n            else {\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            }\n            var y2 = y1;\n\n            linePoints = [[x1, y1], [x2, y2]];\n            textY = y2;\n        }\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}\n\nexport default function (ecModel, api, payload) {\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 viewRect = getViewRect(seriesModel, api);\n        var indices = getSortedIndices(data, sort);\n\n        var sizeExtent = [\n            parsePercent(seriesModel.get('minSize'), viewRect.width),\n            parsePercent(seriesModel.get('maxSize'), viewRect.width)\n        ];\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\n        var funnelAlign = seriesModel.get('funnelAlign');\n        var gap = seriesModel.get('gap');\n        var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count();\n\n        var y = viewRect.y;\n\n        var getLinePoints = function (idx, offY) {\n            // End point index is data.count() and we assign it 0\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 = viewRect.x;\n                    break;\n                case 'center':\n                    x0 = viewRect.x + (viewRect.width - itemWidth) / 2;\n                    break;\n                case 'right':\n                    x0 = viewRect.x + viewRect.width - itemWidth;\n                    break;\n            }\n            return [\n                [x0, offY],\n                [x0 + itemWidth, offY]\n            ];\n        };\n\n        if (sort === 'ascending') {\n            // From bottom to top\n            itemHeight = -itemHeight;\n            gap = -gap;\n            y += viewRect.height;\n            indices = indices.reverse();\n        }\n\n        for (var i = 0; i < indices.length; i++) {\n            var idx = indices[i];\n            var nextIdx = indices[i + 1];\n\n            var itemModel = data.getItemModel(idx);\n            var height = itemModel.get('itemStyle.height');\n            if (height == null) {\n                height = itemHeight;\n            }\n            else {\n                height = parsePercent(height, viewRect.height);\n                if (sort === 'ascending') {\n                    height = -height;\n                }\n            }\n\n            var start = getLinePoints(idx, y);\n            var end = getLinePoints(nextIdx, y + height);\n\n            y += height + gap;\n\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\nimport * as echarts from '../echarts';\n\nimport './funnel/FunnelSeries';\nimport './funnel/FunnelView';\n\nimport dataColor from '../visual/dataColor';\nimport funnelLayout from './funnel/funnelLayout';\nimport dataFilter from '../processor/dataFilter';\n\necharts.registerVisual(dataColor('funnel'));\necharts.registerLayout(funnelLayout);\necharts.registerProcessor(dataFilter('funnel'));","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../../util/model';\n\nexport default function (option) {\n    createParallelIfNeeded(option);\n    mergeAxisOptionFromParallel(option);\n}\n\n/**\n * Create a parallel coordinate if not exists.\n * @inner\n */\nfunction createParallelIfNeeded(option) {\n    if (option.parallel) {\n        return;\n    }\n\n    var hasParallelSeries = false;\n\n    zrUtil.each(option.series, function (seriesOpt) {\n        if (seriesOpt && seriesOpt.type === 'parallel') {\n            hasParallelSeries = true;\n        }\n    });\n\n    if (hasParallelSeries) {\n        option.parallel = [{}];\n    }\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\n    zrUtil.each(axes, function (axisOption) {\n        if (!zrUtil.isObject(axisOption)) {\n            return;\n        }\n\n        var parallelIndex = axisOption.parallelIndex || 0;\n        var parallelOption = modelUtil.normalizeToArray(option.parallel)[parallelIndex];\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../Axis';\n\n/**\n * @constructor module:echarts/coord/parallel/ParallelAxis\n * @extends {module:echarts/coord/Axis}\n * @param {string} dim\n * @param {*} scale\n * @param {Array.<number>} coordExtent\n * @param {string} axisType\n */\nvar ParallelAxis = function (dim, scale, coordExtent, axisType, axisIndex) {\n\n    Axis.call(this, dim, scale, coordExtent);\n\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = axisType || 'value';\n\n    /**\n     * @type {number}\n     * @readOnly\n     */\n    this.axisIndex = axisIndex;\n};\n\nParallelAxis.prototype = {\n\n    constructor: ParallelAxis,\n\n    /**\n     * Axis model\n     * @param {module:echarts/coord/parallel/AxisModel}\n     */\n    model: null,\n\n    /**\n     * @override\n     */\n    isHorizontal: function () {\n        return this.coordinateSystem.getModel().get('layout') !== 'horizontal';\n    }\n\n};\n\nzrUtil.inherits(ParallelAxis, Axis);\n\nexport default ParallelAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\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 {number} delta Move length.\n * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1].\n *              handleEnds will be modified in this method.\n * @param {Array.<number>} extent handleEnds is restricted by extent.\n *              extent[0] should less or equals than extent[1].\n * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds.\n * @param {number} [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 {number} [maxSpan] The range of dataZoom can not be larger than that.\n * @return {Array.<number>} The input handleEnds.\n */\nexport default function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {\n\n    delta = delta || 0;\n\n    var extentSpan = extent[1] - extent[0];\n\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\n    handleEnds[0] = restrict(handleEnds[0], extent);\n    handleEnds[1] = restrict(handleEnds[1], extent);\n\n    var originalDistSign = getSpanSign(handleEnds, handleIndex);\n\n    handleEnds[handleIndex] += delta;\n\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\n    // Expand span.\n    var currDistSign = getSpanSign(handleEnds, handleIndex);\n    if (minSpan != null && (\n        currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan\n    )) {\n        // If minSpan exists, 'cross' is forbidden.\n        handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;\n    }\n\n    // Shrink span.\n    var currDistSign = getSpanSign(handleEnds, handleIndex);\n    if (maxSpan != null && currDistSign.span > maxSpan) {\n        handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;\n    }\n\n    return handleEnds;\n}\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 {span: Math.abs(dist), sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1};\n}\n\nfunction restrict(value, extend) {\n    return Math.min(\n        extend[1] != null ? extend[1] : Infinity,\n        Math.max(extend[0] != null ? extend[0] : -Infinity, 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 * Parallel Coordinates\n * <https://en.wikipedia.org/wiki/Parallel_coordinates>\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as layoutUtil from '../../util/layout';\nimport * as axisHelper from '../../coord/axisHelper';\nimport ParallelAxis from './ParallelAxis';\nimport * as graphic from '../../util/graphic';\nimport * as numberUtil from '../../util/number';\nimport sliderMove from '../../component/helper/sliderMove';\n\nvar each = zrUtil.each;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar round = numberUtil.round;\n\nvar PI = Math.PI;\n\nfunction Parallel(parallelModel, ecModel, api) {\n\n    /**\n     * key: dimension\n     * @type {Object.<string, module:echarts/coord/parallel/Axis>}\n     * @private\n     */\n    this._axesMap = zrUtil.createHashMap();\n\n    /**\n     * key: dimension\n     * value: {position: [], rotation, }\n     * @type {Object.<string, Object>}\n     * @private\n     */\n    this._axesLayout = {};\n\n    /**\n     * Always follow axis order.\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    this.dimensions = parallelModel.dimensions;\n\n    /**\n     * @type {module:zrender/core/BoundingRect}\n     */\n    this._rect;\n\n    /**\n     * @type {module:echarts/coord/parallel/ParallelModel}\n     */\n    this._model = parallelModel;\n\n    this._init(parallelModel, ecModel, api);\n}\n\nParallel.prototype = {\n\n    type: 'parallel',\n\n    constructor: Parallel,\n\n    /**\n     * Initialize cartesian coordinate systems\n     * @private\n     */\n    _init: function (parallelModel, ecModel, api) {\n\n        var dimensions = parallelModel.dimensions;\n        var parallelAxisIndex = parallelModel.parallelAxisIndex;\n\n        each(dimensions, function (dim, idx) {\n\n            var axisIndex = parallelAxisIndex[idx];\n            var axisModel = ecModel.getComponent('parallelAxis', axisIndex);\n\n            var axis = this._axesMap.set(dim, new ParallelAxis(\n                dim,\n                axisHelper.createScaleByModel(axisModel),\n                [0, 0],\n                axisModel.get('type'),\n                axisIndex\n            ));\n\n            var isCategory = axis.type === 'category';\n            axis.onBand = isCategory && axisModel.get('boundaryGap');\n            axis.inverse = axisModel.get('inverse');\n\n            // Injection\n            axisModel.axis = axis;\n            axis.model = axisModel;\n            axis.coordinateSystem = axisModel.coordinateSystem = this;\n\n        }, this);\n    },\n\n    /**\n     * Update axis scale after data processed\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    update: function (ecModel, api) {\n        this._updateAxesFromSeries(this._model, ecModel);\n    },\n\n    /**\n     * @override\n     */\n    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\n        return pAxis >= axisBase\n            && pAxis <= axisBase + layoutInfo.axisLength\n            && pLayout >= layoutBase\n            && pLayout <= layoutBase + layoutInfo.layoutLength;\n    },\n\n    getModel: function () {\n        return this._model;\n    },\n\n    /**\n     * Update properties from series\n     * @private\n     */\n    _updateAxesFromSeries: function (parallelModel, ecModel) {\n        ecModel.eachSeries(function (seriesModel) {\n\n            if (!parallelModel.contains(seriesModel, ecModel)) {\n                return;\n            }\n\n            var data = seriesModel.getData();\n\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    /**\n     * Resize the parallel coordinate system.\n     * @param {module:echarts/coord/parallel/ParallelModel} parallelModel\n     * @param {module:echarts/ExtensionAPI} api\n     */\n    resize: function (parallelModel, api) {\n        this._rect = layoutUtil.getLayoutRect(\n            parallelModel.getBoxLayoutParams(),\n            {\n                width: api.getWidth(),\n                height: api.getHeight()\n            }\n        );\n\n        this._layoutAxes();\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getRect: function () {\n        return this._rect;\n    },\n\n    /**\n     * @private\n     */\n    _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\n        var axisExpandWidth = restrict(parallelModel.get('axisExpandWidth'), layoutExtent);\n        var axisExpandCount = restrict(parallelModel.get('axisExpandCount') || 0, [0, axisCount]);\n        var axisExpandable = parallelModel.get('axisExpandable')\n            && axisCount > 3\n            && axisCount > axisExpandCount\n            && axisExpandCount > 1\n            && axisExpandWidth > 0\n            && layoutLength > 0;\n\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        }\n        else {\n                winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent);\n                axisExpandWindow[1] = axisExpandWindow[0] + winSize;\n        }\n\n        var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount);\n        // Avoid axisCollapseWidth is too small.\n        axisCollapseWidth < 3 && (axisCollapseWidth = 0);\n\n        // Find the first and last indices > ewin[0] and < ewin[1].\n        var winInnerIndices = [\n            mathFloor(round(axisExpandWindow[0] / axisExpandWidth, 1)) + 1,\n            mathCeil(round(axisExpandWindow[1] / axisExpandWidth, 1)) - 1\n        ];\n\n        // Pos in ec coordinates.\n        var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0];\n\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\n    /**\n     * @private\n     */\n    _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\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\n        each(dimensions, function (dim, idx) {\n            var posInfo = (layoutInfo.axisExpandable\n                ? layoutAxisWithExpand : layoutAxisWithoutExpand\n            )(idx, layoutInfo);\n\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\n            var position = [\n                positionTable[layout].x + rect.x,\n                positionTable[layout].y + rect.y\n            ];\n\n            var rotation = rotationTable[layout];\n            var transform = matrix.create();\n            matrix.rotate(transform, transform, rotation);\n            matrix.translate(transform, transform, position);\n\n            // TODO\n            // tick等排布信息。\n\n            // TODO\n            // 根据axis order 更新 dimensions顺序。\n\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    /**\n     * Get axis by dim.\n     * @param {string} dim\n     * @return {module:echarts/coord/parallel/ParallelAxis} [description]\n     */\n    getAxis: function (dim) {\n        return this._axesMap.get(dim);\n    },\n\n    /**\n     * Convert a dim value of a single item of series data to Point.\n     * @param {*} value\n     * @param {string} dim\n     * @return {Array}\n     */\n    dataToPoint: function (value, dim) {\n        return this.axisCoordToPoint(\n            this._axesMap.get(dim).dataToCoord(value),\n            dim\n        );\n    },\n\n    /**\n     * Travel data for one time, get activeState of each data item.\n     * @param {module:echarts/data/List} data\n     * @param {Functio} cb param: {string} activeState 'active' or 'inactive' or 'normal'\n     *                            {number} dataIndex\n     * @param {number} [start=0] the start dataIndex that travel from.\n     * @param {number} [end=data.count()] the next dataIndex of the last dataIndex will be travel.\n     */\n    eachActiveState: function (data, callback, start, end) {\n        start == null && (start = 0);\n        end == null && (end = data.count());\n\n        var axesMap = this._axesMap;\n        var dimensions = this.dimensions;\n        var dataDimensions = [];\n        var axisModels = [];\n\n        zrUtil.each(dimensions, function (axisDim) {\n            dataDimensions.push(data.mapDimension(axisDim));\n            axisModels.push(axesMap.get(axisDim).model);\n        });\n\n        var hasActiveSet = this.hasAxisBrushed();\n\n        for (var dataIndex = start; dataIndex < end; dataIndex++) {\n            var activeState;\n\n            if (!hasActiveSet) {\n                activeState = 'normal';\n            }\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\n                    if (state === 'inactive') {\n                        activeState = 'inactive';\n                        break;\n                    }\n                }\n            }\n\n            callback(activeState, dataIndex);\n        }\n    },\n\n    /**\n     * Whether has any activeSet.\n     * @return {boolean}\n     */\n    hasAxisBrushed: function () {\n        var dimensions = this.dimensions;\n        var axesMap = this._axesMap;\n        var hasActiveSet = false;\n\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\n        return hasActiveSet;\n    },\n\n    /**\n     * Convert coords of each axis to Point.\n     *  Return point. For example: [10, 20]\n     * @param {Array.<number>} coords\n     * @param {string} dim\n     * @return {Array.<number>}\n     */\n    axisCoordToPoint: function (coord, dim) {\n        var axisLayout = this._axesLayout[dim];\n        return graphic.applyTransform([coord, 0], axisLayout.transform);\n    },\n\n    /**\n     * Get axis layout.\n     */\n    getAxisLayout: function (dim) {\n        return zrUtil.clone(this._axesLayout[dim]);\n    },\n\n    /**\n     * @param {Array.<number>} point\n     * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}.\n     */\n    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\n        // Out of the area of coordinate system.\n        if (!this.containPoint(point)) {\n            return {behavior: 'none', axisExpandWindow: axisExpandWindow};\n        }\n\n        // Conver the point from global to expand coordinates.\n        var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos;\n\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\n        if (axisCollapseWidth) {\n            if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) {\n                behavior = 'jump';\n                delta = pointCoord - winSize * triggerArea[2];\n            }\n            else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) {\n                behavior = 'jump';\n                delta = pointCoord - winSize * (1 - triggerArea[2]);\n            }\n            else {\n                (delta = pointCoord - winSize * triggerArea[1]) >= 0\n                    && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0\n                    && (delta = 0);\n            }\n            delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;\n            delta\n                ? 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 winSize = axisExpandWindow[1] - axisExpandWindow[0];\n            var pos = extent[1] * pointCoord / winSize;\n            axisExpandWindow = [mathMax(0, pos - winSize / 2)];\n            axisExpandWindow[1] = mathMin(extent[1], axisExpandWindow[0] + winSize);\n            axisExpandWindow[0] = axisExpandWindow[1] - winSize;\n        }\n\n        return {\n            axisExpandWindow: axisExpandWindow,\n            behavior: behavior\n        };\n    }\n};\n\nfunction restrict(len, extent) {\n    return mathMin(mathMax(len, extent[0]), extent[1]);\n}\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}\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\n    var position;\n    var axisNameAvailableWidth = axisCollapseWidth;\n    var axisLabelShow = false;\n    var nameTruncateMaxWidth;\n\n    if (axisIndex < winInnerIndices[0]) {\n        position = axisIndex * axisCollapseWidth;\n        nameTruncateMaxWidth = axisCollapseWidth;\n    }\n    else if (axisIndex <= winInnerIndices[1]) {\n        position = layoutInfo.axisExpandWindow0Pos\n            + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0];\n        axisNameAvailableWidth = axisExpandWidth;\n        axisLabelShow = true;\n    }\n    else {\n        position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth;\n        nameTruncateMaxWidth = axisCollapseWidth;\n    }\n\n    return {\n        position: position,\n        axisNameAvailableWidth: axisNameAvailableWidth,\n        axisLabelShow: axisLabelShow,\n        nameTruncateMaxWidth: nameTruncateMaxWidth\n    };\n}\n\nexport default Parallel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Parallel coordinate system creater.\n */\n\nimport Parallel from './Parallel';\nimport CoordinateSystem from '../../CoordinateSystem';\n\nfunction create(ecModel, api) {\n    var coordSysList = [];\n\n    ecModel.eachComponent('parallel', function (parallelModel, idx) {\n        var coordSys = new Parallel(parallelModel, ecModel, api);\n\n        coordSys.name = 'parallel_' + idx;\n        coordSys.resize(parallelModel, api);\n\n        parallelModel.coordinateSystem = coordSys;\n        coordSys.model = parallelModel;\n\n        coordSysList.push(coordSys);\n    });\n\n    // Inject the coordinateSystems into seriesModel\n    ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.get('coordinateSystem') === 'parallel') {\n            var parallelModel = ecModel.queryComponents({\n                mainType: 'parallel',\n                index: seriesModel.get('parallelIndex'),\n                id: seriesModel.get('parallelId')\n            })[0];\n            seriesModel.coordinateSystem = parallelModel.coordinateSystem;\n        }\n    });\n\n    return coordSysList;\n}\n\nCoordinateSystem.register('parallel', {create: create});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport makeStyleMapper from '../../model/mixin/makeStyleMapper';\nimport axisModelCreator from '../axisModelCreator';\nimport * as numberUtil from '../../util/number';\nimport axisModelCommonMixin from '../axisModelCommonMixin';\n\nvar AxisModel = ComponentModel.extend({\n\n    type: 'baseParallelAxis',\n\n    /**\n     * @type {module:echarts/coord/parallel/Axis}\n     */\n    axis: null,\n\n    /**\n     * @type {Array.<Array.<number>}\n     * @readOnly\n     */\n    activeIntervals: [],\n\n    /**\n     * @return {Object}\n     */\n    getAreaSelectStyle: function () {\n        return makeStyleMapper(\n            [\n                ['fill', 'color'],\n                ['lineWidth', 'borderWidth'],\n                ['stroke', 'borderColor'],\n                ['width', 'width'],\n                ['opacity', 'opacity']\n            ]\n        )(this.getModel('areaSelectStyle'));\n    },\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 {Array.<Array<number>>} intervals interval.length === 0\n     *                                          means set all active.\n     * @public\n     */\n    setActiveIntervals: function (intervals) {\n        var activeIntervals = this.activeIntervals = zrUtil.clone(intervals);\n\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    /**\n     * @param {number|string} [value] When attempting to detect 'no activeIntervals set',\n     *                         value can not be input.\n     * @return {string} 'normal': no activeIntervals set,\n     *                  'active',\n     *                  'inactive'.\n     * @public\n     */\n    getActiveState: function (value) {\n        var activeIntervals = this.activeIntervals;\n\n        if (!activeIntervals.length) {\n            return 'normal';\n        }\n\n        if (value == null || isNaN(value)) {\n            return 'inactive';\n        }\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        }\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\n        return 'inactive';\n    }\n\n});\n\nvar defaultOption = {\n\n    type: 'value',\n\n    /**\n     * @type {Array.<number>}\n     */\n    dim: null, // 0, 1, 2, ...\n\n    // parallelIndex: null,\n\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\n    realtime: true, // Whether realtime update view when select.\n\n    z: 10\n};\n\nzrUtil.merge(AxisModel.prototype, axisModelCommonMixin);\n\nfunction getAxisType(axisName, option) {\n    return option.type || (option.data ? 'category' : 'value');\n}\n\naxisModelCreator('parallel', AxisModel, getAxisType, defaultOption);\n\nexport default AxisModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Component from '../../model/Component';\n\nimport './AxisModel';\n\nexport default Component.extend({\n\n    type: 'parallel',\n\n    dependencies: ['parallelAxis'],\n\n    /**\n     * @type {module:echarts/coord/parallel/Parallel}\n     */\n    coordinateSystem: null,\n\n    /**\n     * Each item like: 'dim0', 'dim1', 'dim2', ...\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    dimensions: null,\n\n    /**\n     * Coresponding to dimensions.\n     * @type {Array.<number>}\n     * @readOnly\n     */\n    parallelAxisIndex: null,\n\n    layoutMode: 'box',\n\n    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\n        layout: 'horizontal',      // 'horizontal' or 'vertical'\n\n        // FIXME\n        // naming?\n        axisExpandable: false,\n        axisExpandCenter: null,\n        axisExpandCount: 0,\n        axisExpandWidth: 50,      // FIXME '10%' ?\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', // 'mousemove' or 'click'\n\n        parallelAxisDefault: null\n    },\n\n    /**\n     * @override\n     */\n    init: function () {\n        Component.prototype.init.apply(this, arguments);\n\n        this.mergeOption({});\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function (newOption) {\n        var thisOption = this.option;\n\n        newOption && zrUtil.merge(thisOption, newOption, true);\n\n        this._initDimensions();\n    },\n\n    /**\n     * Whether series or axis is in this coordinate system.\n     * @param {module:echarts/model/Series|module:echarts/coord/parallel/AxisModel} model\n     * @param {module:echarts/model/Global} ecModel\n     */\n    contains: function (model, ecModel) {\n        var parallelIndex = model.get('parallelIndex');\n        return parallelIndex != null\n            && ecModel.getComponent('parallel', parallelIndex) === this;\n    },\n\n    setAxisExpand: function (opt) {\n        zrUtil.each(\n            ['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'],\n            function (name) {\n                if (opt.hasOwnProperty(name)) {\n                    this.option[name] = opt[name];\n                }\n            },\n            this\n        );\n    },\n\n    /**\n     * @private\n     */\n    _initDimensions: function () {\n        var dimensions = this.dimensions = [];\n        var parallelAxisIndex = this.parallelAxisIndex = [];\n\n        var axisModels = zrUtil.filter(this.dependentModels.parallelAxis, 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\n        zrUtil.each(axisModels, function (axisModel) {\n            dimensions.push('dim' + axisModel.get('dim'));\n            parallelAxisIndex.push(axisModel.componentIndex);\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\nimport * as echarts from '../../echarts';\n\n/**\n * @payload\n * @property {string} parallelAxisId\n * @property {Array.<Array.<number>>} intervals\n */\nvar actionInfo = {\n    type: 'axisAreaSelect',\n    event: 'axisAreaSelected'\n    // update: 'updateVisual'\n};\n\necharts.registerAction(actionInfo, function (payload, ecModel) {\n    ecModel.eachComponent(\n        {mainType: 'parallelAxis', query: payload},\n        function (parallelAxisModel) {\n            parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);\n        }\n    );\n});\n\n/**\n * @payload\n */\necharts.registerAction('parallelAxisExpand', function (payload, ecModel) {\n    ecModel.eachComponent(\n        {mainType: 'parallel', 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\nimport {__DEV__} from '../../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport Eventful from 'zrender/src/mixin/Eventful';\nimport * as graphic from '../../util/graphic';\nimport * as interactionMutex from './interactionMutex';\nimport DataDiffer from '../../data/DataDiffer';\n\nvar curry = zrUtil.curry;\nvar each = zrUtil.each;\nvar map = zrUtil.map;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathPow = Math.pow;\n\nvar COVER_Z = 10000;\nvar UNSELECT_THRESHOLD = 6;\nvar MIN_RESIZE_LINE_WIDTH = 6;\nvar MUTEX_RESOURCE_KEY = 'globalPan';\n\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: 'rgba(0,0,0,0.3)',\n        fill: 'rgba(0,0,0,0.1)'\n    },\n    transformable: true,\n    brushMode: 'single',\n    removeOnClick: false\n};\n\nvar baseUID = 0;\n\n/**\n * @alias module:echarts/component/helper/BrushController\n * @constructor\n * @mixin {module:zrender/mixin/Eventful}\n * @event module:echarts/component/helper/BrushController#brush\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 *\n * @param {module:zrender/zrender~ZRender} zr\n */\nfunction BrushController(zr) {\n\n    if (__DEV__) {\n        zrUtil.assert(zr);\n    }\n\n    Eventful.call(this);\n\n    /**\n     * @type {module:zrender/zrender~ZRender}\n     * @private\n     */\n    this._zr = zr;\n\n    /**\n     * @type {module:zrender/container/Group}\n     * @readOnly\n     */\n    this.group = new graphic.Group();\n\n    /**\n     * Only for drawing (after enabledBrush).\n     *     'line', 'rect', 'polygon' or false\n     *     If passing false/null/undefined, disable brush.\n     *     If passing 'auto', determined by panel.defaultBrushType\n     * @private\n     * @type {string}\n     */\n    this._brushType;\n\n    /**\n     * Only for drawing (after enabledBrush).\n     *\n     * @private\n     * @type {Object}\n     */\n    this._brushOption;\n\n    /**\n     * @private\n     * @type {Object}\n     */\n    this._panels;\n\n    /**\n     * @private\n     * @type {Array.<nubmer>}\n     */\n    this._track = [];\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._dragging;\n\n    /**\n     * @private\n     * @type {Array}\n     */\n    this._covers = [];\n\n    /**\n     * @private\n     * @type {moudule:zrender/container/Group}\n     */\n    this._creatingCover;\n\n    /**\n     * `true` means global panel\n     * @private\n     * @type {module:zrender/container/Group|boolean}\n     */\n    this._creatingPanel;\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._enableGlobalPan;\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    if (__DEV__) {\n        this._mounted;\n    }\n\n    /**\n     * @private\n     * @type {string}\n     */\n    this._uid = 'brushController_' + baseUID++;\n\n    /**\n     * @private\n     * @type {Object}\n     */\n    this._handlers = {};\n    each(mouseHandlers, function (handler, eventName) {\n        this._handlers[eventName] = zrUtil.bind(handler, this);\n    }, this);\n}\n\nBrushController.prototype = {\n\n    constructor: BrushController,\n\n    /**\n     * If set to null/undefined/false, select disabled.\n     * @param {Object} brushOption\n     * @param {string|boolean} brushOption.brushType 'line', 'rect', 'polygon' or false\n     *                          If passing false/null/undefined, disable brush.\n     *                          If passing 'auto', determined by panel.defaultBrushType.\n     *                              ('auto' can not be used in global panel)\n     * @param {number} [brushOption.brushMode='single'] 'single' or 'multiple'\n     * @param {boolean} [brushOption.transformable=true]\n     * @param {boolean} [brushOption.removeOnClick=false]\n     * @param {Object} [brushOption.brushStyle]\n     * @param {number} [brushOption.brushStyle.width]\n     * @param {number} [brushOption.brushStyle.lineWidth]\n     * @param {string} [brushOption.brushStyle.stroke]\n     * @param {string} [brushOption.brushStyle.fill]\n     * @param {number} [brushOption.z]\n     */\n    enableBrush: function (brushOption) {\n        if (__DEV__) {\n            zrUtil.assert(this._mounted);\n        }\n\n        this._brushType && doDisableBrush(this);\n        brushOption.brushType && doEnableBrush(this, brushOption);\n\n        return this;\n    },\n\n    /**\n     * @param {Array.<Object>} panelOpts If not pass, it is global brush.\n     *        Each items: {\n     *            panelId, // mandatory.\n     *            clipPath, // mandatory. function.\n     *            isTargetByCursor, // mandatory. function.\n     *            defaultBrushType, // optional, only used when brushType is 'auto'.\n     *            getLinearBrushOtherExtent, // optional. function.\n     *        }\n     */\n    setPanels: function (panelOpts) {\n        if (panelOpts && panelOpts.length) {\n            var panels = this._panels = {};\n            zrUtil.each(panelOpts, function (panelOpts) {\n                panels[panelOpts.panelId] = zrUtil.clone(panelOpts);\n            });\n        }\n        else {\n            this._panels = null;\n        }\n        return this;\n    },\n\n    /**\n     * @param {Object} [opt]\n     * @return {boolean} [opt.enableGlobalPan=false]\n     */\n    mount: function (opt) {\n        opt = opt || {};\n\n        if (__DEV__) {\n            this._mounted = true; // should be at first.\n        }\n\n        this._enableGlobalPan = opt.enableGlobalPan;\n\n        var thisGroup = this.group;\n        this._zr.add(thisGroup);\n\n        thisGroup.attr({\n            position: opt.position || [0, 0],\n            rotation: opt.rotation || 0,\n            scale: opt.scale || [1, 1]\n        });\n        this._transform = thisGroup.getLocalTransform();\n\n        return this;\n    },\n\n    eachCover: function (cb, context) {\n        each(this._covers, cb, context);\n    },\n\n    /**\n     * Update covers.\n     * @param {Array.<Object>} brushOptionList Like:\n     *        [\n     *            {id: 'xx', brushType: 'line', range: [23, 44], brushStyle, transformable},\n     *            {id: 'yy', brushType: 'rect', range: [[23, 44], [23, 54]]},\n     *            ...\n     *        ]\n     *        `brushType` is required in each cover info. (can not be 'auto')\n     *        `id` is not mandatory.\n     *        `brushStyle`, `transformable` is not mandatory, use DEFAULT_BRUSH_OPT by default.\n     *        If brushOptionList is null/undefined, all covers removed.\n     */\n    updateCovers: function (brushOptionList) {\n        if (__DEV__) {\n            zrUtil.assert(this._mounted);\n        }\n\n        brushOptionList = zrUtil.map(brushOptionList, function (brushOption) {\n            return zrUtil.merge(zrUtil.clone(DEFAULT_BRUSH_OPT), brushOption, true);\n        });\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\n        (new DataDiffer(oldCovers, brushOptionList, oldGetKey, getKey))\n            .add(addOrUpdate)\n            .update(addOrUpdate)\n            .remove(remove)\n            .execute();\n\n        return this;\n\n        function getKey(brushOption, index) {\n            return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index)\n                + '-' + brushOption.brushType;\n        }\n\n        function oldGetKey(cover, index) {\n            return getKey(cover.__brushOption, index);\n        }\n\n        function addOrUpdate(newIndex, oldIndex) {\n            var newBrushOption = brushOptionList[newIndex];\n            // Consider setOption in event listener of brushSelect,\n            // where updating cover when creating should be forbiden.\n            if (oldIndex != null && oldCovers[oldIndex] === creatingCover) {\n                newCovers[newIndex] = oldCovers[oldIndex];\n            }\n            else {\n                var cover = newCovers[newIndex] = oldIndex != null\n                    ? (\n                        oldCovers[oldIndex].__brushOption = newBrushOption,\n                        oldCovers[oldIndex]\n                    )\n                    : endCreating(controller, createCover(controller, newBrushOption));\n                updateCoverAfterCreation(controller, cover);\n            }\n        }\n\n        function remove(oldIndex) {\n            if (oldCovers[oldIndex] !== creatingCover) {\n                controller.group.remove(oldCovers[oldIndex]);\n            }\n        }\n    },\n\n    unmount: function () {\n        if (__DEV__) {\n            if (!this._mounted) {\n                return;\n            }\n        }\n\n        this.enableBrush(false);\n\n        // container may 'removeAll' outside.\n        clearCovers(this);\n        this._zr.remove(this.group);\n\n        if (__DEV__) {\n            this._mounted = false; // should be at last.\n        }\n\n        return this;\n    },\n\n    dispose: function () {\n        this.unmount();\n        this.off();\n    }\n};\n\nzrUtil.mixin(BrushController, Eventful);\n\nfunction doEnableBrush(controller, brushOption) {\n    var zr = controller._zr;\n\n    // Consider roam, which takes globalPan too.\n    if (!controller._enableGlobalPan) {\n        interactionMutex.take(zr, MUTEX_RESOURCE_KEY, controller._uid);\n    }\n\n    each(controller._handlers, function (handler, eventName) {\n        zr.on(eventName, handler);\n    });\n\n    controller._brushType = brushOption.brushType;\n    controller._brushOption = zrUtil.merge(zrUtil.clone(DEFAULT_BRUSH_OPT), brushOption, true);\n}\n\nfunction doDisableBrush(controller) {\n    var zr = controller._zr;\n\n    interactionMutex.release(zr, MUTEX_RESOURCE_KEY, controller._uid);\n\n    each(controller._handlers, function (handler, eventName) {\n        zr.off(eventName, handler);\n    });\n\n    controller._brushType = controller._brushOption = null;\n}\n\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}\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}\n\nfunction updateCoverShape(controller, cover) {\n    var brushOption = cover.__brushOption;\n    getCoverRenderer(cover).updateCoverShape(\n        controller, cover, brushOption.range, brushOption\n    );\n}\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}\n\nfunction updateCoverAfterCreation(controller, cover) {\n    getCoverRenderer(cover).updateCommon(controller, cover);\n    updateCoverShape(controller, cover);\n}\n\nfunction getCoverRenderer(cover) {\n    return coverRenderers[cover.__brushOption.brushType];\n}\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 true; // 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\n// Return a panel or true\nfunction getPanelByCover(controller, cover) {\n    var panels = controller._panels;\n    if (!panels) {\n        return true; // 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] : true;\n}\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\n    return !!originalLength;\n}\n\nfunction trigger(controller, opt) {\n    var areas = map(controller._covers, function (cover) {\n        var brushOption = cover.__brushOption;\n        var range = zrUtil.clone(brushOption.range);\n        return {\n            brushType: brushOption.brushType,\n            panelId: brushOption.panelId,\n            range: range\n        };\n    });\n\n    controller.trigger('brush', areas, {\n        isEnd: !!opt.isEnd,\n        removeOnClick: !!opt.removeOnClick\n    });\n}\n\nfunction shouldShowCover(controller) {\n    var track = controller._track;\n\n    if (!track.length) {\n        return false;\n    }\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\n    return dist > UNSELECT_THRESHOLD;\n}\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(doDrift, controller, brushOption, edgeNames) {\n    var cover = new graphic.Group();\n\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(doDrift, controller, cover, 'nswe'),\n        ondragend: curry(trigger, controller, {isEnd: true})\n    }));\n\n    each(\n        edgeNames,\n        function (name) {\n            cover.add(new graphic.Rect({\n                name: name,\n                style: {opacity: 0},\n                draggable: true,\n                silent: true,\n                invisible: true,\n                drift: curry(doDrift, controller, cover, name),\n                ondragend: curry(trigger, controller, {isEnd: true})\n            }));\n        }\n    );\n\n    return cover;\n}\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\n    updateRectShape(controller, cover, 'main', x, y, width, height);\n\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\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}\n\nfunction updateCommon(controller, cover) {\n    var brushOption = cover.__brushOption;\n    var transformable = brushOption.transformable;\n\n    var mainEl = cover.childAt(0);\n    mainEl.useStyle(makeStyle(brushOption));\n    mainEl.attr({\n        silent: !transformable,\n        cursor: transformable ? 'move' : 'default'\n    });\n\n    each(\n        ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw'],\n        function (name) {\n            var el = cover.childOfName(name);\n            var globalDir = getGlobalDirection(controller, name);\n\n            el && el.attr({\n                silent: !transformable,\n                invisible: !transformable,\n                cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null\n            });\n        }\n    );\n}\n\nfunction updateRectShape(controller, cover, name, x, y, w, h) {\n    var el = cover.childOfName(name);\n    el && el.setShape(pointsToRect(\n        clipByPanel(controller, cover, [[x, y], [x + w, y + h]])\n    ));\n}\n\nfunction makeStyle(brushOption) {\n    return zrUtil.defaults({strokeNoScale: true}, brushOption.brushStyle);\n}\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\n    return [\n        [min[0], max[0]], // x range\n        [min[1], max[1]] // y range\n    ];\n}\n\nfunction getTransform(controller) {\n    return graphic.getTransform(controller.group);\n}\n\nfunction getGlobalDirection(controller, localDirection) {\n    if (localDirection.length > 1) {\n        localDirection = localDirection.split('');\n        var globalDir = [\n            getGlobalDirection(controller, localDirection[0]),\n            getGlobalDirection(controller, localDirection[1])\n        ];\n        (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse();\n        return globalDir.join('');\n    }\n    else {\n        var map = {w: 'left', e: 'right', n: 'top', s: 'bottom'};\n        var inverseMap = {left: 'w', right: 'e', top: 'n', bottom: 's'};\n        var globalDir = graphic.transformDirection(\n            map[localDirection], getTransform(controller)\n        );\n        return inverseMap[globalDir];\n    }\n}\n\nfunction driftRect(toRectRange, fromRectRange, controller, cover, name, dx, dy, e) {\n    var brushOption = cover.__brushOption;\n    var rectRange = toRectRange(brushOption.range);\n    var localDelta = toLocalDelta(controller, dx, dy);\n\n    each(name.split(''), function (namePart) {\n        var ind = DIRECTION_MAP[namePart];\n        rectRange[ind[0]][ind[1]] += localDelta[ind[0]];\n    });\n\n    brushOption.range = fromRectRange(formatRectRange(\n        rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1]\n    ));\n\n    updateCoverAfterCreation(controller, cover);\n    trigger(controller, {isEnd: false});\n}\n\nfunction driftPolygon(controller, cover, dx, dy, e) {\n    var range = cover.__brushOption.range;\n    var localDelta = toLocalDelta(controller, dx, dy);\n\n    each(range, function (point) {\n        point[0] += localDelta[0];\n        point[1] += localDelta[1];\n    });\n\n    updateCoverAfterCreation(controller, cover);\n    trigger(controller, {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\n    return [localD[0] - localZero[0], localD[1] - localZero[1]];\n}\n\nfunction clipByPanel(controller, cover, data) {\n    var panel = getPanelByCover(controller, cover);\n\n    return (panel && panel !== true)\n        ? panel.clipPath(data, controller._transform)\n        : zrUtil.clone(data);\n}\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\n    return {\n        x: xmin,\n        y: ymin,\n        width: xmax - xmin,\n        height: ymax - ymin\n    };\n}\n\nfunction resetCursor(controller, e, localCursorPoint) {\n    // Check active\n    if (!controller._brushType) {\n        return;\n    }\n\n    var zr = controller._zr;\n    var covers = controller._covers;\n    var currPanel = getPanelByPoint(controller, e, localCursorPoint);\n\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\n                && (currPanel === true || brushOption.panelId === currPanel.panelId)\n                && coverRenderers[brushOption.brushType].contain(\n                    covers[i], localCursorPoint[0], localCursorPoint[1]\n                )\n            ) {\n                // Use cursor style set on cover.\n                return;\n            }\n        }\n    }\n\n    currPanel && zr.setCursorStyle('crosshair');\n}\n\nfunction preventDefault(e) {\n    var rawE = e.event;\n    rawE.preventDefault && rawE.preventDefault();\n}\n\nfunction mainShapeContain(cover, x, y) {\n    return cover.childOfName('main').contain(x, y);\n}\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\n    controller._track.push(localCursorPoint.slice());\n\n    if (shouldShowCover(controller) || creatingCover) {\n\n        if (panel && !creatingCover) {\n            thisBrushOption.brushMode === 'single' && clearCovers(controller);\n            var brushOption = zrUtil.clone(thisBrushOption);\n            brushOption.brushType = determineBrushType(brushOption.brushType, panel);\n            brushOption.panelId = panel === true ? null : panel.panelId;\n            creatingCover = controller._creatingCover = createCover(controller, brushOption);\n            controller._covers.push(creatingCover);\n        }\n\n        if (creatingCover) {\n            var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)];\n            var coverBrushOption = creatingCover.__brushOption;\n\n            coverBrushOption.range = coverRenderer.getCreatingRange(\n                clipByPanel(controller, creatingCover, controller._track)\n            );\n\n            if (isEnd) {\n                endCreating(controller, creatingCover);\n                coverRenderer.updateCommon(controller, creatingCover);\n            }\n\n            updateCoverShape(controller, creatingCover);\n\n            eventParams = {isEnd: isEnd};\n        }\n    }\n    else if (\n        isEnd\n        && thisBrushOption.brushMode === 'single'\n        && thisBrushOption.removeOnClick\n    ) {\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 = {isEnd: isEnd, removeOnClick: true};\n        }\n    }\n\n    return eventParams;\n}\n\nfunction determineBrushType(brushType, panel) {\n    if (brushType === 'auto') {\n        if (__DEV__) {\n            zrUtil.assert(\n                panel && panel.defaultBrushType,\n                'MUST have defaultBrushType when brushType is \"atuo\"'\n            );\n        }\n        return panel.defaultBrushType;\n    }\n    return brushType;\n}\n\nvar mouseHandlers = {\n\n    mousedown: function (e) {\n        if (this._dragging) {\n            // In case some browser do not support globalOut,\n            // and release mose out side the browser.\n            handleDragEnd.call(this, e);\n        }\n        else if (!e.target || !e.target.draggable) {\n\n            preventDefault(e);\n\n            var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);\n\n            this._creatingCover = null;\n            var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint);\n\n            if (panel) {\n                this._dragging = true;\n                this._track = [localCursorPoint.slice()];\n            }\n        }\n    },\n\n    mousemove: function (e) {\n        var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);\n\n        resetCursor(this, e, localCursorPoint);\n\n        if (this._dragging) {\n\n            preventDefault(e);\n\n            var eventParams = updateCoverByMouse(this, e, localCursorPoint, false);\n\n            eventParams && trigger(this, eventParams);\n        }\n    },\n\n    mouseup: handleDragEnd //,\n\n    // FIXME\n    // in tooltip, globalout should not be triggered.\n    // globalout: handleDragEnd\n};\n\nfunction handleDragEnd(e) {\n    if (this._dragging) {\n\n        preventDefault(e);\n\n        var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);\n        var eventParams = updateCoverByMouse(this, e, localCursorPoint, true);\n\n        this._dragging = false;\n        this._track = [];\n        this._creatingCover = null;\n\n        // trigger event shoule be at final, after procedure will be nested.\n        eventParams && trigger(this, eventParams);\n    }\n}\n\n/**\n * key: brushType\n * @type {Object}\n */\nvar coverRenderers = {\n\n    lineX: getLineRenderer(0),\n\n    lineY: getLineRenderer(1),\n\n    rect: {\n        createCover: function (controller, brushOption) {\n            return createBaseRectCover(\n                curry(\n                    driftRect,\n                    function (range) {\n                        return range;\n                    },\n                    function (range) {\n                        return range;\n                    }\n                ),\n                controller,\n                brushOption,\n                ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw']\n            );\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\n    polygon: {\n        createCover: function (controller, brushOption) {\n            var cover = new graphic.Group();\n\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\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, {isEnd: true})\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};\n\nfunction getLineRenderer(xyIndex) {\n    return {\n        createCover: function (controller, brushOption) {\n            return createBaseRectCover(\n                curry(\n                    driftRect,\n                    function (range) {\n                        var rectRange = [range, [0, 100]];\n                        xyIndex && rectRange.reverse();\n                        return rectRange;\n                    },\n                    function (rectRange) {\n                        return rectRange[xyIndex];\n                    }\n                ),\n                controller,\n                brushOption,\n                [['w', 'e'], ['n', 's']][xyIndex]\n            );\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\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 !== true && panel.getLinearBrushOtherExtent) {\n                otherExtent = panel.getLinearBrushOtherExtent(\n                    xyIndex, controller._transform\n                );\n            }\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\n            updateBaseRect(controller, cover, rectRange, brushOption);\n        },\n        updateCommon: updateCommon,\n        contain: mainShapeContain\n    };\n}\n\nexport default BrushController;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {onIrrelevantElement} from './cursorHelper';\nimport * as graphicUtil from '../../util/graphic';\n\nexport function makeRectPanelClipPath(rect) {\n    rect = normalizeRect(rect);\n    return function (localPoints, transform) {\n        return graphicUtil.clipPointsByRect(localPoints, rect);\n    };\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}\n\nexport function makeRectIsTargetByCursor(rect, api, targetModel) {\n    rect = normalizeRect(rect);\n    return function (e, localCursorPoint, transform) {\n        return rect.contain(localCursorPoint[0], localCursorPoint[1])\n            && !onIrrelevantElement(e, api, targetModel);\n    };\n}\n\n// Consider width/height is negative.\nfunction normalizeRect(rect) {\n    return BoundingRect.create(rect);\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport AxisBuilder from './AxisBuilder';\nimport BrushController from '../helper/BrushController';\nimport * as brushHelper from '../helper/brushHelper';\nimport * as graphic from '../../util/graphic';\n\nvar elementList = ['axisLine', 'axisTickLabel', 'axisName'];\n\nvar AxisView = echarts.extendComponentView({\n\n    type: 'parallelAxis',\n\n    /**\n     * @override\n     */\n    init: function (ecModel, api) {\n        AxisView.superApply(this, 'init', arguments);\n\n        /**\n         * @type {module:echarts/component/helper/BrushController}\n         */\n        (this._brushController = new BrushController(api.getZr()))\n            .on('brush', zrUtil.bind(this._onBrush, this));\n    },\n\n    /**\n     * @override\n     */\n    render: function (axisModel, ecModel, api, payload) {\n        if (fromAxisAreaSelect(axisModel, ecModel, payload)) {\n            return;\n        }\n\n        this.axisModel = axisModel;\n        this.api = api;\n\n        this.group.removeAll();\n\n        var oldAxisGroup = this._axisGroup;\n        this._axisGroup = new graphic.Group();\n        this.group.add(this._axisGroup);\n\n        if (!axisModel.get('show')) {\n            return;\n        }\n\n        var coordSysModel = getCoordSysModel(axisModel, ecModel);\n        var coordSys = coordSysModel.coordinateSystem;\n\n        var areaSelectStyle = axisModel.getAreaSelectStyle();\n        var areaWidth = areaSelectStyle.width;\n\n        var dim = axisModel.axis.dim;\n        var axisLayout = coordSys.getAxisLayout(dim);\n\n        var builderOpt = zrUtil.extend(\n            {strokeContainThreshold: areaWidth},\n            axisLayout\n        );\n\n        var axisBuilder = new AxisBuilder(axisModel, builderOpt);\n\n        zrUtil.each(elementList, axisBuilder.add, axisBuilder);\n\n        this._axisGroup.add(axisBuilder.getGroup());\n\n        this._refreshBrushController(\n            builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api\n        );\n\n        var animationModel = (payload && payload.animation === false) ? null : axisModel;\n        graphic.groupTransition(oldAxisGroup, this._axisGroup, animationModel);\n    },\n\n    // /**\n    //  * @override\n    //  */\n    // updateVisual: function (axisModel, ecModel, api, payload) {\n    //     this._brushController && this._brushController\n    //         .updateCovers(getCoverInfoList(axisModel));\n    // },\n\n    _refreshBrushController: function (\n        builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api\n    ) {\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\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\n        this._brushController\n            .mount({\n                enableGlobalPan: true,\n                rotation: builderOpt.rotation,\n                position: builderOpt.position\n            })\n            .setPanels([{\n                panelId: 'pl',\n                clipPath: brushHelper.makeRectPanelClipPath(rect),\n                isTargetByCursor: brushHelper.makeRectIsTargetByCursor(rect, api, coordSysModel),\n                getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect, 0)\n            }])\n            .enableBrush({\n                brushType: 'lineX',\n                brushStyle: areaSelectStyle,\n                removeOnClick: true\n            })\n            .updateCovers(getCoverInfoList(axisModel));\n    },\n\n    _onBrush: function (coverInfoList, opt) {\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 [\n                axis.coordToData(coverInfo.range[0], true),\n                axis.coordToData(coverInfo.range[1], true)\n            ];\n        });\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 === opt.isEnd || opt.removeOnClick) { // jshint ignore:line\n            this.api.dispatchAction({\n                type: 'axisAreaSelect',\n                parallelAxisId: axisModel.id,\n                intervals: intervals\n            });\n        }\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        this._brushController.dispose();\n    }\n});\n\nfunction fromAxisAreaSelect(axisModel, ecModel, payload) {\n    return payload\n        && payload.type === 'axisAreaSelect'\n        && ecModel.findComponents(\n            {mainType: 'parallelAxis', query: payload}\n        )[0] === axisModel;\n}\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: [\n                axis.dataToCoord(interval[0], true),\n                axis.dataToCoord(interval[1], true)\n            ]\n        };\n    });\n}\n\nfunction getCoordSysModel(axisModel, ecModel) {\n    return ecModel.getComponent(\n        'parallel', axisModel.get('parallelIndex')\n    );\n}\n\nexport default AxisView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/parallel/parallelCreator';\nimport './axis/parallelAxisAction';\nimport './axis/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\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as throttleUtil from '../util/throttle';\nimport parallelPreprocessor from '../coord/parallel/parallelPreprocessor';\n\nimport '../coord/parallel/parallelCreator';\nimport '../coord/parallel/ParallelModel';\nimport './parallelAxis';\n\nvar CLICK_THRESHOLD = 5; // > 4\n\n// Parallel view\necharts.extendComponentView({\n    type: 'parallel',\n\n    render: function (parallelModel, ecModel, api) {\n        this._model = parallelModel;\n        this._api = api;\n\n        if (!this._handlers) {\n            this._handlers = {};\n            zrUtil.each(handlers, function (handler, eventName) {\n                api.getZr().on(eventName, this._handlers[eventName] = zrUtil.bind(handler, this));\n            }, this);\n        }\n\n        throttleUtil.createOrUpdate(\n            this,\n            '_throttledDispatchExpand',\n            parallelModel.get('axisExpandRate'),\n            'fixRate'\n        );\n    },\n\n    dispose: function (ecModel, api) {\n        zrUtil.each(this._handlers, function (handler, eventName) {\n            api.getZr().off(eventName, handler);\n        });\n        this._handlers = null;\n    },\n\n    /**\n     * @param {Object} [opt] If null, cancle the last action triggering for debounce.\n     */\n    _throttledDispatchExpand: function (opt) {\n        this._dispatchExpand(opt);\n    },\n\n    _dispatchExpand: function (opt) {\n        opt && this._api.dispatchAction(\n            zrUtil.extend({type: 'parallelAxisExpand'}, opt)\n        );\n    }\n\n});\n\nvar handlers = {\n\n    mousedown: function (e) {\n        if (checkTrigger(this, 'click')) {\n            this._mouseDownPoint = [e.offsetX, e.offsetY];\n        }\n    },\n\n    mouseup: function (e) {\n        var mouseDownPoint = this._mouseDownPoint;\n\n        if (checkTrigger(this, 'click') && mouseDownPoint) {\n            var point = [e.offsetX, e.offsetY];\n            var dist = Math.pow(mouseDownPoint[0] - point[0], 2)\n                + Math.pow(mouseDownPoint[1] - point[1], 2);\n\n            if (dist > CLICK_THRESHOLD) {\n                return;\n            }\n\n            var result = this._model.coordinateSystem.getSlidedAxisExpandWindow(\n                [e.offsetX, e.offsetY]\n            );\n\n            result.behavior !== 'none' && this._dispatchExpand({\n                axisExpandWindow: result.axisExpandWindow\n            });\n        }\n\n        this._mouseDownPoint = null;\n    },\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(\n            [e.offsetX, e.offsetY]\n        );\n\n        var behavior = result.behavior;\n        behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce'));\n        this._throttledDispatchExpand(\n            behavior === 'none'\n                ? null // Cancle 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 : false\n                }\n        );\n    }\n};\n\nfunction checkTrigger(view, triggerOn) {\n    var model = view._model;\n    return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn;\n}\n\necharts.registerPreprocessor(parallelPreprocessor);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {each, createHashMap} from 'zrender/src/core/util';\nimport SeriesModel from '../../model/Series';\nimport createListFromArray from '../helper/createListFromArray';\n\nexport default SeriesModel.extend({\n\n    type: 'series.parallel',\n\n    dependencies: ['parallel'],\n\n    visualColorAccessPath: 'lineStyle.color',\n\n    getInitialData: function (option, ecModel) {\n        var source = this.getSource();\n\n        setEncodeAndDimensions(source, this);\n\n        return createListFromArray(source, this);\n    },\n\n    /**\n     * User can get data raw indices on 'axisAreaSelected' event received.\n     *\n     * @public\n     * @param {string} activeState 'active' or 'inactive' or 'normal'\n     * @return {Array.<number>} Raw indices\n     */\n    getRawIndicesByActiveState: function (activeState) {\n        var coordSys = this.coordinateSystem;\n        var data = this.getData();\n        var indices = [];\n\n        coordSys.eachActiveState(data, function (theActiveState, dataIndex) {\n            if (activeState === theActiveState) {\n                indices.push(data.getRawIndex(dataIndex));\n            }\n        });\n\n        return indices;\n    },\n\n    defaultOption: {\n        zlevel: 0,                  // 一级层叠\n        z: 2,                       // 二级层叠\n\n        coordinateSystem: 'parallel',\n        parallelIndex: 0,\n\n        label: {\n            show: false\n        },\n\n        inactiveOpacity: 0.05,\n        activeOpacity: 1,\n\n        lineStyle: {\n            width: 1,\n            opacity: 0.45,\n            type: 'solid'\n        },\n        emphasis: {\n            label: {\n                show: false\n            }\n        },\n\n        progressive: 500,\n        smooth: false, // true | false | number\n\n        animationEasing: 'linear'\n    }\n});\n\nfunction setEncodeAndDimensions(source, 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\n    if (source.encodeDefine) {\n        return;\n    }\n\n    var parallelModel = seriesModel.ecModel.getComponent(\n        'parallel', seriesModel.get('parallelIndex')\n    );\n    if (!parallelModel) {\n        return;\n    }\n\n    var encodeDefine = source.encodeDefine = createHashMap();\n    each(parallelModel.dimensions, function (axisDim) {\n        var dataDimIndex = convertDimNameToNumber(axisDim);\n        encodeDefine.set(axisDim, dataDimIndex);\n    });\n}\n\nfunction convertDimNameToNumber(dimName) {\n    return +dimName.replace('dim', '');\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as graphic from '../../util/graphic';\nimport ChartView from '../../view/Chart';\n\nvar DEFAULT_SMOOTH = 0.3;\n\nvar ParallelView = ChartView.extend({\n\n    type: 'parallel',\n\n    init: function () {\n\n        /**\n         * @type {module:zrender/container/Group}\n         * @private\n         */\n        this._dataGroup = new graphic.Group();\n\n        this.group.add(this._dataGroup);\n\n        /**\n         * @type {module:echarts/data/List}\n         */\n        this._data;\n\n        /**\n         * @type {boolean}\n         */\n        this._initialized;\n    },\n\n    /**\n     * @override\n     */\n    render: function (seriesModel, ecModel, api, payload) {\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\n        data.diff(oldData)\n            .add(add)\n            .update(update)\n            .remove(remove)\n            .execute();\n\n        function add(newDataIndex) {\n            var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);\n            updateElCommon(line, data, newDataIndex, seriesScope);\n        }\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            var animationModel = (payload && payload.animation === false) ? null : seriesModel;\n            graphic.updateProps(line, {shape: {points: points}}, animationModel, newDataIndex);\n\n            updateElCommon(line, data, newDataIndex, seriesScope);\n        }\n\n        function remove(oldDataIndex) {\n            var line = oldData.getItemGraphicEl(oldDataIndex);\n            dataGroup.remove(line);\n        }\n\n        // First create\n        if (!this._initialized) {\n            this._initialized = true;\n            var clipPath = createGridClipShape(\n                coordSys, seriesModel, function () {\n                    // Callback will be invoked immediately if there is no animation\n                    setTimeout(function () {\n                        dataGroup.removeClipPath();\n                    });\n                }\n            );\n            dataGroup.setClipPath(clipPath);\n        }\n\n        this._data = data;\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        this._initialized = true;\n        this._data = null;\n        this._dataGroup.removeAll();\n    },\n\n    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\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        }\n    },\n\n    dispose: function () {},\n\n    // _renderForProgressive: function (seriesModel) {\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 option = seriesModel.option;\n    //     var progressive = option.progressive;\n    //     var smooth = option.smooth ? SMOOTH : null;\n\n    //     // In progressive animation is disabled, so use simple data diff,\n    //     // which effects performance less.\n    //     // (Typically performance for data with length 7000+ like:\n    //     // simpleDiff: 60ms, addEl: 184ms,\n    //     // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit))\n    //     if (simpleDiff(oldData, data, dimensions)) {\n    //         dataGroup.removeAll();\n    //         data.each(function (dataIndex) {\n    //             addEl(data, dataGroup, dataIndex, dimensions, coordSys);\n    //         });\n    //     }\n\n    //     updateElCommon(data, progressive, smooth);\n\n    //     // Consider switch between progressive and not.\n    //     data.__plProgressive = true;\n    //     this._data = data;\n    // },\n\n    /**\n     * @override\n     */\n    remove: function () {\n        this._dataGroup && this._dataGroup.removeAll();\n        this._data = null;\n    }\n});\n\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\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}\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}\n\nfunction addEl(data, dataGroup, dataIndex, dimensions, coordSys) {\n    var points = createLinePoints(data, dataIndex, dimensions, coordSys);\n    var line = new graphic.Polyline({\n        shape: {points: points},\n        silent: true,\n        z2: 10\n    });\n    dataGroup.add(line);\n    data.setItemGraphicEl(dataIndex, line);\n    return line;\n}\n\nfunction makeSeriesScope(seriesModel) {\n    var smooth = seriesModel.get('smooth', true);\n    smooth === true && (smooth = DEFAULT_SMOOTH);\n    return {\n        lineStyle: seriesModel.getModel('lineStyle').getLineStyle(),\n        smooth: smooth != null ? smooth : DEFAULT_SMOOTH\n    };\n}\n\nfunction updateElCommon(el, data, dataIndex, seriesScope) {\n    var lineStyle = seriesScope.lineStyle;\n\n    if (data.hasItemOption) {\n        var lineStyleModel = data.getItemModel(dataIndex).getModel('lineStyle');\n        lineStyle = lineStyleModel.getLineStyle();\n    }\n\n    el.useStyle(lineStyle);\n\n    var elStyle = el.style;\n    elStyle.fill = null;\n    // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor.\n    elStyle.stroke = data.getItemVisual(dataIndex, 'color');\n    // lineStyle.opacity have been set to itemVisual in parallelVisual.\n    elStyle.opacity = data.getItemVisual(dataIndex, 'opacity');\n\n    seriesScope.smooth && (el.shape.smooth = seriesScope.smooth);\n}\n\n// function simpleDiff(oldData, newData, dimensions) {\n//     var oldLen;\n//     if (!oldData\n//         || !oldData.__plProgressive\n//         || (oldLen = oldData.count()) !== newData.count()\n//     ) {\n//         return true;\n//     }\n\n//     var dimLen = dimensions.length;\n//     for (var i = 0; i < oldLen; i++) {\n//         for (var j = 0; j < dimLen; j++) {\n//             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {\n//                 return true;\n//             }\n//         }\n//     }\n\n//     return false;\n// }\n\n// FIXME\n// 公用方法?\nfunction isEmptyValue(val, axisType) {\n    return axisType === 'category'\n        ? val == null\n        : (val == null || isNaN(val)); // axisType === 'value'\n}\n\nexport default ParallelView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nvar opacityAccessPath = ['lineStyle', 'normal', 'opacity'];\n\nexport default {\n\n    seriesType: 'parallel',\n\n    reset: function (seriesModel, ecModel, api) {\n\n        var itemStyleModel = seriesModel.getModel('itemStyle');\n        var lineStyleModel = seriesModel.getModel('lineStyle');\n        var globalColors = ecModel.get('color');\n\n        var color = lineStyleModel.get('color')\n            || itemStyleModel.get('color')\n            || globalColors[seriesModel.seriesIndex % globalColors.length];\n        var inactiveOpacity = seriesModel.get('inactiveOpacity');\n        var activeOpacity = seriesModel.get('activeOpacity');\n        var lineStyle = seriesModel.getModel('lineStyle').getLineStyle();\n\n        var coordSys = seriesModel.coordinateSystem;\n        var data = seriesModel.getData();\n\n        var opacityMap = {\n            normal: lineStyle.opacity,\n            active: activeOpacity,\n            inactive: inactiveOpacity\n        };\n\n        data.setVisual('color', color);\n\n        function progress(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                data.setItemVisual(dataIndex, 'opacity', opacity);\n            }, params.start, params.end);\n        }\n\n        return {progress: progress};\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\nimport * as echarts from '../echarts';\nimport '../component/parallel';\nimport './parallel/ParallelSeries';\nimport './parallel/ParallelView';\nimport parallelVisual from './parallel/parallelVisual';\n\necharts.registerVisual(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\nimport SeriesModel from '../../model/Series';\nimport createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge';\nimport {encodeHTML} from '../../util/format';\nimport Model from '../../model/Model';\nimport { __DEV__ } from '../../config';\n\nvar SankeySeries = SeriesModel.extend({\n\n    type: 'series.sankey',\n\n    layoutInfo: null,\n\n    levelModels: null,\n\n    /**\n     * Init a graph data structure from data in option series\n     *\n     * @param  {Object} option  the object used to config echarts view\n     * @return {module:echarts/data/List} storage initial data\n     */\n    getInitialData: function (option, ecModel) {\n        var links = option.edges || option.links;\n        var nodes = option.data || option.nodes;\n        var levels = option.levels;\n        var levelModels = this.levelModels = {};\n\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            }\n            else {\n                if (__DEV__) {\n                    throw new Error('levels[i].depth is mandatory and should be natural number');\n                }\n            }\n        }\n        if (nodes && links) {\n            var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);\n            return graph.data;\n        }\n        function beforeLink(nodeData, edgeData) {\n            nodeData.wrapMethod('getItemModel', function (model, idx) {\n                model.customizeGetParent(function (path) {\n                    var parentModel = this.parentModel;\n                    var nodeDepth = parentModel.getData().getItemLayout(idx).depth;\n                    var levelModel = parentModel.levelModels[nodeDepth];\n                    return levelModel || this.parentModel;\n                });\n                return model;\n            });\n\n            edgeData.wrapMethod('getItemModel', function (model, idx) {\n                model.customizeGetParent(function (path) {\n                    var parentModel = this.parentModel;\n                    var edge = parentModel.getGraph().getEdgeByIndex(idx);\n                    var depth = edge.node1.getLayout().depth;\n                    var levelModel = parentModel.levelModels[depth];\n                    return levelModel || this.parentModel;\n                });\n                return model;\n            });\n        }\n    },\n\n    setNodePosition: function (dataIndex, localPosition) {\n        var dataItem = this.option.data[dataIndex];\n        dataItem.localX = localPosition[0];\n        dataItem.localY = localPosition[1];\n    },\n\n    /**\n     * Return the graphic data structure\n     *\n     * @return {module:echarts/data/Graph} graphic data structure\n     */\n    getGraph: function () {\n        return this.getData().graph;\n    },\n\n    /**\n     * Get edge data of graphic data structure\n     *\n     * @return {module:echarts/data/List} data structure of list\n     */\n    getEdgeData: function () {\n        return this.getGraph().edgeData;\n    },\n\n    /**\n     * @override\n     */\n    formatTooltip: function (dataIndex, multipleSeries, dataType) {\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 html = rawDataOpt.source + ' -- ' + rawDataOpt.target;\n            if (params.value) {\n                html += ' : ' + params.value;\n            }\n            return encodeHTML(html);\n        }\n        else if (dataType === 'node') {\n            var node = this.getGraph().getNodeByIndex(dataIndex);\n            var value = node.getLayout().value;\n            var name = this.getDataParams(dataIndex, dataType).data.name;\n            if (value) {\n                var html = name + ' : ' + value;\n            }\n            return encodeHTML(html);\n        }\n        return SankeySeries.superCall(this, 'formatTooltip', dataIndex, multipleSeries);\n    },\n\n    optionUpdated: function () {\n        var option = this.option;\n        if (option.focusNodeAdjacency === true) {\n            option.focusNodeAdjacency = 'allEdges';\n        }\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n\n        coordinateSystem: 'view',\n\n        layout: null,\n\n        // The position of the whole view\n        left: '5%',\n        top: '5%',\n        right: '20%',\n        bottom: '5%',\n\n        // Value can be 'vertical'\n        orient: 'horizontal',\n\n        // The dx of the node\n        nodeWidth: 20,\n\n        // The vertical distance between two nodes\n        nodeGap: 8,\n\n        // Control if the node can move or not\n        draggable: true,\n\n        // Value can be 'inEdges', 'outEdges', 'allEdges', true (the same as 'allEdges').\n        focusNodeAdjacency: false,\n\n        // The number of iterations to change the position of the node\n        layoutIterations: 32,\n\n        label: {\n            show: true,\n            position: 'right',\n            color: '#000',\n            fontSize: 12\n        },\n\n        levels: [],\n\n        // Value can be 'left' or 'right'\n        nodeAlign: 'justify',\n\n        itemStyle: {\n            borderWidth: 1,\n            borderColor: '#333'\n        },\n\n        lineStyle: {\n            color: '#314656',\n            opacity: 0.2,\n            curveness: 0.5\n        },\n\n        emphasis: {\n            label: {\n                show: true\n            },\n            lineStyle: {\n                opacity: 0.6\n            }\n        },\n\n        animationEasing: 'linear',\n\n        animationDuration: 1000\n    }\n\n});\n\nexport default SankeySeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as graphic from '../../util/graphic';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar nodeOpacityPath = ['itemStyle', 'opacity'];\nvar lineOpacityPath = ['lineStyle', 'opacity'];\n\nfunction getItemOpacity(item, opacityPath) {\n    return item.getVisual('opacity') || item.getModel().get(opacityPath);\n}\n\nfunction fadeOutItem(item, opacityPath, opacityRatio) {\n    var el = item.getGraphicEl();\n\n    var opacity = getItemOpacity(item, opacityPath);\n    if (opacityRatio != null) {\n        opacity == null && (opacity = 1);\n        opacity *= opacityRatio;\n    }\n\n    el.downplay && el.downplay();\n    el.traverse(function (child) {\n        if (child.type !== 'group') {\n            child.setStyle('opacity', opacity);\n        }\n    });\n}\n\nfunction fadeInItem(item, opacityPath) {\n    var opacity = getItemOpacity(item, opacityPath);\n    var el = item.getGraphicEl();\n\n    el.highlight && el.highlight();\n    el.traverse(function (child) {\n        if (child.type !== 'group') {\n            child.setStyle('opacity', opacity);\n        }\n    });\n}\n\nvar SankeyShape = graphic.extendShape({\n    shape: {\n        x1: 0, y1: 0,\n        x2: 0, y2: 0,\n        cpx1: 0, cpy1: 0,\n        cpx2: 0, cpy2: 0,\n        extent: 0,\n        orient: ''\n    },\n\n    buildPath: function (ctx, shape) {\n        var extent = shape.extent;\n        ctx.moveTo(shape.x1, shape.y1);\n        ctx.bezierCurveTo(\n            shape.cpx1, shape.cpy1,\n            shape.cpx2, shape.cpy2,\n            shape.x2, shape.y2\n        );\n        if (shape.orient === 'vertical') {\n            ctx.lineTo(shape.x2 + extent, shape.y2);\n            ctx.bezierCurveTo(\n                shape.cpx2 + extent, shape.cpy2,\n                shape.cpx1 + extent, shape.cpy1,\n                shape.x1 + extent, shape.y1\n            );\n        }\n        else {\n            ctx.lineTo(shape.x2, shape.y2 + extent);\n            ctx.bezierCurveTo(\n                shape.cpx2, shape.cpy2 + extent,\n                shape.cpx1, shape.cpy1 + extent,\n                shape.x1, shape.y1 + extent\n            );\n        }\n        ctx.closePath();\n    }\n});\n\nexport default echarts.extendChartView({\n\n    type: 'sankey',\n\n    /**\n     * @private\n     * @type {module:echarts/chart/sankey/SankeySeries}\n     */\n    _model: null,\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    _focusAdjacencyDisabled: false,\n\n    render: function (seriesModel, ecModel, api) {\n        var sankeyView = this;\n        var graph = seriesModel.getGraph();\n        var group = this.group;\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\n        this._model = seriesModel;\n\n        group.removeAll();\n\n        group.attr('position', [layoutInfo.x, layoutInfo.y]);\n\n        // generate a bezire Curve for each edge\n        graph.eachEdge(function (edge) {\n            var curve = new SankeyShape();\n            curve.dataIndex = edge.dataIndex;\n            curve.seriesIndex = seriesModel.seriesIndex;\n            curve.dataType = 'edge';\n            var lineStyleModel = edge.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\n            curve.shape.extent = Math.max(1, edgeLayout.dy);\n            curve.shape.orient = orient;\n\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            }\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\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\n            curve.setStyle(lineStyleModel.getItemStyle());\n            // Special color, use source node color or target node color\n            switch (curve.style.fill) {\n                case 'source':\n                    curve.style.fill = edge.node1.getVisual('color');\n                    break;\n                case 'target':\n                    curve.style.fill = edge.node2.getVisual('color');\n                    break;\n            }\n\n            graphic.setHoverStyle(curve, edge.getModel('emphasis.lineStyle').getItemStyle());\n\n            group.add(curve);\n\n            edgeData.setItemGraphicEl(edge.dataIndex, curve);\n        });\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 labelModel = itemModel.getModel('label');\n            var labelHoverModel = itemModel.getModel('emphasis.label');\n\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                },\n                style: itemModel.getModel('itemStyle').getItemStyle()\n            });\n\n            var hoverStyle = node.getModel('emphasis.itemStyle').getItemStyle();\n\n            graphic.setLabelStyle(\n                rect.style, hoverStyle, labelModel, labelHoverModel,\n                {\n                    labelFetcher: seriesModel,\n                    labelDataIndex: node.dataIndex,\n                    defaultText: node.id,\n                    isRectText: true\n                }\n            );\n\n            rect.setStyle('fill', node.getVisual('color'));\n\n            graphic.setHoverStyle(rect, hoverStyle);\n\n            group.add(rect);\n\n            nodeData.setItemGraphicEl(node.dataIndex, rect);\n\n            rect.dataType = 'node';\n        });\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 (itemModel.get('focusNodeAdjacency')) {\n                el.off('mouseover').on('mouseover', function () {\n                    if (!sankeyView._focusAdjacencyDisabled) {\n                        api.dispatchAction({\n                            type: 'focusNodeAdjacency',\n                            seriesId: seriesModel.id,\n                            dataIndex: el.dataIndex\n                        });\n                    }\n                });\n                el.off('mouseout').on('mouseout', function () {\n                    if (!sankeyView._focusAdjacencyDisabled) {\n                        api.dispatchAction({\n                            type: 'unfocusNodeAdjacency',\n                            seriesId: seriesModel.id\n                        });\n                    }\n                });\n            }\n        });\n\n        edgeData.eachItemGraphicEl(function (el, dataIndex) {\n            var edgeModel = edgeData.getItemModel(dataIndex);\n            if (edgeModel.get('focusNodeAdjacency')) {\n                el.off('mouseover').on('mouseover', function () {\n                    if (!sankeyView._focusAdjacencyDisabled) {\n                        api.dispatchAction({\n                            type: 'focusNodeAdjacency',\n                            seriesId: seriesModel.id,\n                            edgeDataIndex: el.dataIndex\n                        });\n                    }\n                });\n                el.off('mouseout').on('mouseout', function () {\n                    if (!sankeyView._focusAdjacencyDisabled) {\n                        api.dispatchAction({\n                            type: 'unfocusNodeAdjacency',\n                            seriesId: seriesModel.id\n                        });\n                    }\n                });\n            }\n        });\n\n        if (!this._data && seriesModel.get('animation')) {\n            group.setClipPath(createGridClipShape(group.getBoundingRect(), seriesModel, function () {\n                group.removeClipPath();\n            }));\n        }\n\n        this._data = seriesModel.getData();\n    },\n\n    dispose: function () {},\n\n    focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {\n        var data = this._model.getData();\n        var graph = data.graph;\n        var dataIndex = payload.dataIndex;\n        var itemModel = data.getItemModel(dataIndex);\n        var edgeDataIndex = payload.edgeDataIndex;\n\n        if (dataIndex == null && edgeDataIndex == null) {\n            return;\n        }\n        var node = graph.getNodeByIndex(dataIndex);\n        var edge = graph.getEdgeByIndex(edgeDataIndex);\n\n        graph.eachNode(function (node) {\n            fadeOutItem(node, nodeOpacityPath, 0.1);\n        });\n        graph.eachEdge(function (edge) {\n            fadeOutItem(edge, lineOpacityPath, 0.1);\n        });\n\n        if (node) {\n            fadeInItem(node, nodeOpacityPath);\n            var focusNodeAdj = itemModel.get('focusNodeAdjacency');\n            if (focusNodeAdj === 'outEdges') {\n                zrUtil.each(node.outEdges, function (edge) {\n                    if (edge.dataIndex < 0) {\n                        return;\n                    }\n                    fadeInItem(edge, lineOpacityPath);\n                    fadeInItem(edge.node2, nodeOpacityPath);\n                });\n            }\n            else if (focusNodeAdj === 'inEdges') {\n                zrUtil.each(node.inEdges, function (edge) {\n                    if (edge.dataIndex < 0) {\n                        return;\n                    }\n                    fadeInItem(edge, lineOpacityPath);\n                    fadeInItem(edge.node1, nodeOpacityPath);\n                });\n            }\n            else if (focusNodeAdj === 'allEdges') {\n                zrUtil.each(node.edges, function (edge) {\n                    if (edge.dataIndex < 0) {\n                        return;\n                    }\n                    fadeInItem(edge, lineOpacityPath);\n                    fadeInItem(edge.node1, nodeOpacityPath);\n                    fadeInItem(edge.node2, nodeOpacityPath);\n                });\n            }\n        }\n        if (edge) {\n            fadeInItem(edge, lineOpacityPath);\n            fadeInItem(edge.node1, nodeOpacityPath);\n            fadeInItem(edge.node2, nodeOpacityPath);\n        }\n    },\n\n    unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {\n        var graph = this._model.getGraph();\n\n        graph.eachNode(function (node) {\n            fadeOutItem(node, nodeOpacityPath);\n        });\n        graph.eachEdge(function (edge) {\n            fadeOutItem(edge, lineOpacityPath);\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            height: rect.height + 20\n        }\n    }, seriesModel, cb);\n\n    return rectEl;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport '../helper/focusNodeAdjacencyAction';\n\necharts.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({mainType: 'series', subType: 'sankey', query: payload}, function (seriesModel) {\n        seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]);\n    });\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as layout from '../../util/layout';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {groupData} from '../../util/model';\n\nexport default function (ecModel, api, payload) {\n\n    ecModel.eachSeriesByType('sankey', function (seriesModel) {\n\n        var nodeWidth = seriesModel.get('nodeWidth');\n        var nodeGap = seriesModel.get('nodeGap');\n\n        var layoutInfo = getViewRect(seriesModel, api);\n\n        seriesModel.layoutInfo = layoutInfo;\n\n        var width = layoutInfo.width;\n        var height = layoutInfo.height;\n\n        var graph = seriesModel.getGraph();\n\n        var nodes = graph.nodes;\n        var edges = graph.edges;\n\n        computeNodeValues(nodes);\n\n        var filteredNodes = zrUtil.filter(nodes, function (node) {\n            return node.getLayout().value === 0;\n        });\n\n        var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');\n\n        var orient = seriesModel.get('orient');\n\n        var nodeAlign = seriesModel.get('nodeAlign');\n\n        layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);\n    });\n}\n\n/**\n * Get the layout position of the whole view\n *\n * @param {module:echarts/model/Series} seriesModel  the model object of sankey series\n * @param {module:echarts/ExtensionAPI} api  provide the API list that the developer can call\n * @return {module:zrender/core/BoundingRect}  size of rect to draw the sankey view\n */\nfunction getViewRect(seriesModel, api) {\n    return layout.getLayoutRect(\n        seriesModel.getBoxLayoutParams(), {\n            width: api.getWidth(),\n            height: api.getHeight()\n        }\n    );\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/**\n * Compute the value of each node by summing the associated edge's value\n *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\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 value = Math.max(value1, value2);\n        node.setLayout({value: value}, true);\n    });\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 *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\n * @param  {number} nodeWidth  the dx of the node\n * @param  {number} width  the whole width of the area to draw the view\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    var kx = 0;\n\n    for (var i = 0; i < edges.length; i++) {\n        remainEdges[i] = 1;\n    }\n    for (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({depth: isItemDepth ? item.depth : x}, true);\n            orient === 'vertical'\n                ? node.setLayout({dy: nodeWidth}, true)\n                : node.setLayout({dx: nodeWidth}, true);\n\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\n    for (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\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'\n                ? (height - nodeWidth) / maxDepth\n                : (width - nodeWidth) / maxDepth;\n\n    scaleNodeBreadths(nodes, kx, orient);\n}\n\nfunction isNodeDepth(node) {\n    var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n    return item.depth != null && item.depth >= 0;\n}\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({skNodeHeight: nodeHeight}, 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\n        zrUtil.each(nodes, function (node) {\n            if (!isNodeDepth(node)) {\n                node.setLayout({depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight)}, true);\n            }\n        });\n    }\n    else if (nodeAlign === 'justify') {\n        moveSinksRight(nodes, maxDepth);\n    }\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 {module:echarts/data/Graph~Node} nodes.  node of sankey view.\n * @param {number} 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({depth: maxDepth}, true);\n        }\n    });\n}\n\n/**\n * Scale node x-position to the width\n *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\n * @param {number} 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'\n            ? node.setLayout({y: nodeDepth}, true)\n            : node.setLayout({x: nodeDepth}, true);\n    });\n}\n\n/**\n * Using Gauss-Seidel iterations method to compute the node depth(y-position)\n *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\n * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view\n * @param {number} height  the whole height of the area to draw the view\n * @param {number} nodeGap  the vertical distance between two nodes\n *     in the same column.\n * @param {number} 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\n    initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);\n    resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n\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}\n\nfunction prepareNodesByBreadth(nodes, orient) {\n    var nodesByBreadth = [];\n    var keyAttr = orient === 'vertical' ? 'y' : 'x';\n\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\n    return nodesByBreadth;\n}\n\n/**\n * Compute the original y-position for each node\n *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\n * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth\n *     group by the array of all sankey nodes based on the nodes x-position.\n * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view\n * @param {number} height  the whole height of the area to draw the view\n * @param {number} nodeGap  the vertical distance between two nodes\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'\n                    ? (width - (n - 1) * nodeGap) / sum\n                    : (height - (n - 1) * nodeGap) / sum;\n\n        if (ky < minKy) {\n            minKy = ky;\n        }\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({x: i}, true);\n                node.setLayout({dx: nodeDy}, true);\n            }\n            else {\n                node.setLayout({y: i}, true);\n                node.setLayout({dy: nodeDy}, true);\n            }\n        });\n    });\n\n    zrUtil.each(edges, function (edge) {\n        var edgeDy = +edge.getValue() * minKy;\n        edge.setLayout({dy: edgeDy}, true);\n    });\n}\n\n/**\n * Resolve the collision of initialized depth (y-position)\n *\n * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth\n *     group by the array of all sankey nodes based on the nodes x-position.\n * @param {number} nodeGap  the vertical distance between two nodes\n * @param {number} height  the whole height of the area to draw the view\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'\n                    ? node.setLayout({x: nodeX}, true)\n                    : node.setLayout({y: nodeX}, 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'\n                ? node.setLayout({x: nodeX}, true)\n                : node.setLayout({y: nodeX}, true);\n\n            y0 = nodeX;\n            for (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'\n                        ? node.setLayout({x: nodeX}, true)\n                        : node.setLayout({y: nodeX}, true);\n                }\n                y0 = node.getLayout()[keyAttr];\n            }\n        }\n    });\n}\n\n/**\n * Change the y-position of the nodes, except most the right side nodes\n *\n * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth\n *     group by the array of all sankey nodes based on the node x-position.\n * @param {number} 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)\n                        / sum(node.outEdges, getEdgeValue, orient);\n                if (orient === 'vertical') {\n                    var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n                    node.setLayout({x: nodeX}, true);\n                }\n                else {\n                    var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n                    node.setLayout({y: nodeY}, true);\n                }\n            }\n        });\n    });\n}\n\nfunction weightedTarget(edge, orient) {\n    return center(edge.node2, orient) * edge.getValue();\n}\n\nfunction weightedSource(edge, orient) {\n    return center(edge.node1, orient) * edge.getValue();\n}\n\nfunction center(node, orient) {\n    return orient === 'vertical'\n            ? node.getLayout().x + node.getLayout().dx / 2\n            : node.getLayout().y + node.getLayout().dy / 2;\n}\n\nfunction getEdgeValue(edge) {\n    return edge.getValue();\n}\n\nfunction sum(array, f, orient) {\n    var sum = 0;\n    var len = array.length;\n    var i = -1;\n    while (++i < len) {\n        var value = +f.call(array, array[i], orient);\n        if (!isNaN(value)) {\n            sum += value;\n        }\n    }\n    return sum;\n}\n\n/**\n * Change the y-position of the nodes, except most the left side nodes\n *\n * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth\n *     group by the array of all sankey nodes based on the node x-position.\n * @param {number} alpha  parameter used to adjust the nodes y-position\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)\n                        / sum(node.inEdges, getEdgeValue, orient);\n                if (orient === 'vertical') {\n                    var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n                    node.setLayout({x: nodeX}, true);\n                }\n                else {\n                    var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n                    node.setLayout({y: nodeY}, true);\n                }\n            }\n        });\n    });\n}\n\n/**\n * Compute the depth(y-position) of each edge\n *\n * @param {module:echarts/data/Graph~Node} nodes  node of sankey view\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({sy: sy}, true);\n            sy += edge.getLayout().dy;\n        });\n        zrUtil.each(node.inEdges, function (edge) {\n            edge.setLayout({ty: ty}, true);\n            ty += edge.getLayout().dy;\n        });\n    });\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport VisualMapping from '../../visual/VisualMapping';\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (ecModel, payload) {\n    ecModel.eachSeriesByType('sankey', function (seriesModel) {\n        var graph = seriesModel.getGraph();\n        var nodes = graph.nodes;\n        if (nodes.length) {\n            var minValue = Infinity;\n            var maxValue = -Infinity;\n            zrUtil.each(nodes, function (node) {\n                var nodeValue = node.getLayout().value;\n                if (nodeValue < minValue) {\n                    minValue = nodeValue;\n                }\n                if (nodeValue > maxValue) {\n                    maxValue = nodeValue;\n                }\n            });\n\n            zrUtil.each(nodes, function (node) {\n                var mapping = new VisualMapping({\n                    type: 'color',\n                    mappingMethod: 'linear',\n                    dataExtent: [minValue, maxValue],\n                    visual: seriesModel.get('color')\n                });\n\n                var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);\n                var customColor = node.getModel().get('itemStyle.color');\n                customColor != null\n                    ? node.setVisual('color', customColor)\n                    : node.setVisual('color', mapValueToColor);\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\nimport * as echarts from '../echarts';\n\nimport './sankey/SankeySeries';\nimport './sankey/SankeyView';\nimport './sankey/sankeyAction';\n\nimport sankeyLayout from './sankey/sankeyLayout';\nimport sankeyVisual from './sankey/sankeyVisual';\n\necharts.registerLayout(sankeyLayout);\necharts.registerVisual(sankeyVisual);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nimport createListSimply from '../helper/createListSimply';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper';\n\nexport var seriesModelMixin = {\n\n    /**\n     * @private\n     * @type {string}\n     */\n    _baseAxisDim: null,\n\n    /**\n     * @override\n     */\n    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\n        var ordinalMeta;\n\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\n        // FIXME\n        // 考虑时间轴\n\n        if (xAxisType === 'category') {\n            option.layout = 'horizontal';\n            ordinalMeta = xAxisModel.getOrdinalMeta();\n            addOrdinal = true;\n        }\n        else if (yAxisType === 'category') {\n            option.layout = 'vertical';\n            ordinalMeta = yAxisModel.getOrdinalMeta();\n            addOrdinal = true;\n        }\n        else {\n            option.layout = option.layout || 'horizontal';\n        }\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\n        // ??? FIXME make a stage to perform data transfrom.\n        // MUST create a new data, consider setOption({}) again.\n        if (data && addOrdinal) {\n            var newOptionData = [];\n            zrUtil.each(data, function (item, index) {\n                var newItem;\n                if (item.value && zrUtil.isArray(item.value)) {\n                    newItem = item.value.slice();\n                    item.value.unshift(index);\n                }\n                else if (zrUtil.isArray(item)) {\n                    newItem = item.slice();\n                    item.unshift(index);\n                }\n                else {\n                    newItem = item;\n                }\n                newOptionData.push(newItem);\n            });\n            option.data = newOptionData;\n        }\n\n        var defaultValueDimensions = this.defaultValueDimensions;\n\n        return createListSimply(\n            this,\n            {\n                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                dimensionsCount: defaultValueDimensions.length + 1\n            }\n        );\n    },\n\n    /**\n     * If horizontal, base axis is x, otherwise y.\n     * @override\n     */\n    getBaseAxis: function () {\n        var dim = this._baseAxisDim;\n        return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport SeriesModel from '../../model/Series';\nimport {seriesModelMixin} from '../helper/whiskerBoxCommon';\n\nvar BoxplotSeries = SeriesModel.extend({\n\n    type: 'series.boxplot',\n\n    dependencies: ['xAxis', 'yAxis', 'grid'],\n\n    // TODO\n    // box width represents group size, so dimension should have 'size'.\n\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    defaultValueDimensions: [\n        {name: 'min', defaultTooltip: true},\n        {name: 'Q1', defaultTooltip: true},\n        {name: 'median', defaultTooltip: true},\n        {name: 'Q3', defaultTooltip: true},\n        {name: 'max', defaultTooltip: true}\n    ],\n\n    /**\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    dimensions: null,\n\n    /**\n     * @override\n     */\n    defaultOption: {\n        zlevel: 0,                  // 一级层叠\n        z: 2,                       // 二级层叠\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        layout: null,               // 'horizontal' or 'vertical'\n        boxWidth: [7, 50],       // [min, max] can be percent of band width.\n\n        itemStyle: {\n            color: '#fff',\n            borderWidth: 1\n        },\n\n        emphasis: {\n            itemStyle: {\n                borderWidth: 2,\n                shadowBlur: 5,\n                shadowOffsetX: 2,\n                shadowOffsetY: 2,\n                shadowColor: 'rgba(0,0,0,0.4)'\n            }\n        },\n\n        animationEasing: 'elasticOut',\n        animationDuration: 800\n    }\n});\n\nzrUtil.mixin(BoxplotSeries, seriesModelMixin, true);\n\nexport default BoxplotSeries;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ChartView from '../../view/Chart';\nimport * as graphic from '../../util/graphic';\nimport Path from 'zrender/src/graphic/Path';\n\n// Update common properties\nvar NORMAL_ITEM_STYLE_PATH = ['itemStyle'];\nvar EMPHASIS_ITEM_STYLE_PATH = ['emphasis', 'itemStyle'];\n\nvar BoxplotView = ChartView.extend({\n\n    type: 'boxplot',\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var group = this.group;\n        var oldData = this._data;\n\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\n        var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;\n\n        data.diff(oldData)\n            .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            })\n            .update(function (newIdx, oldIdx) {\n                var symbolEl = oldData.getItemGraphicEl(oldIdx);\n\n                // Empty data\n                if (!data.hasValue(newIdx)) {\n                    group.remove(symbolEl);\n                    return;\n                }\n\n                var itemLayout = data.getItemLayout(newIdx);\n                if (!symbolEl) {\n                    symbolEl = createNormalBox(itemLayout, data, newIdx, constDim);\n                }\n                else {\n                    updateNormalBoxData(itemLayout, symbolEl, data, newIdx);\n                }\n\n                group.add(symbolEl);\n\n                data.setItemGraphicEl(newIdx, symbolEl);\n            })\n            .remove(function (oldIdx) {\n                var el = oldData.getItemGraphicEl(oldIdx);\n                el && group.remove(el);\n            })\n            .execute();\n\n        this._data = data;\n    },\n\n    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\n    dispose: zrUtil.noop\n\n});\n\n\nvar BoxPath = Path.extend({\n\n    type: 'boxplotBoxPath',\n\n    shape: {},\n\n    buildPath: function (ctx, shape) {\n        var ends = shape.points;\n\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\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});\n\n\nfunction createNormalBox(itemLayout, data, dataIndex, constDim, isInit) {\n    var ends = itemLayout.ends;\n\n    var el = new BoxPath({\n        shape: {\n            points: isInit\n                ? transInit(ends, constDim, itemLayout)\n                : ends\n        }\n    });\n\n    updateNormalBoxData(itemLayout, el, data, dataIndex, isInit);\n\n    return el;\n}\n\nfunction updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) {\n    var seriesModel = data.hostModel;\n    var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];\n\n    updateMethod(\n        el,\n        {shape: {points: itemLayout.ends}},\n        seriesModel,\n        dataIndex\n    );\n\n    var itemModel = data.getItemModel(dataIndex);\n    var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH);\n    var borderColor = data.getItemVisual(dataIndex, 'color');\n\n    // Exclude borderColor.\n    var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']);\n    itemStyle.stroke = borderColor;\n    itemStyle.strokeNoScale = true;\n    el.useStyle(itemStyle);\n\n    el.z2 = 100;\n\n    var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();\n    graphic.setHoverStyle(el, hoverStyle);\n}\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}\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\nvar borderColorQuery = ['itemStyle', 'borderColor'];\n\nexport default function (ecModel, api) {\n\n    var globalColors = ecModel.get('color');\n\n    ecModel.eachRawSeriesByType('boxplot', function (seriesModel) {\n\n        var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];\n        var data = seriesModel.getData();\n\n        data.setVisual({\n            legendSymbol: 'roundRect',\n            // Use name 'color' but not 'borderColor' for legend usage and\n            // visual coding from other component like dataRange.\n            color: seriesModel.get(borderColorQuery) || defaulColor\n        });\n\n        // Only visible series has each data be visual encoded\n        if (!ecModel.isSeriesFiltered(seriesModel)) {\n            data.each(function (idx) {\n                var itemModel = data.getItemModel(idx);\n                data.setItemVisual(\n                    idx,\n                    {color: itemModel.get(borderColorQuery, 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\nimport * as zrUtil from 'zrender/src/core/util';\nimport {parsePercent} from '../../util/number';\n\nvar each = zrUtil.each;\n\nexport default function (ecModel) {\n\n    var groupResult = groupSeriesByAxis(ecModel);\n\n    each(groupResult, function (groupItem) {\n        var seriesModels = groupItem.seriesModels;\n\n        if (!seriesModels.length) {\n            return;\n        }\n\n        calculateBase(groupItem);\n\n        each(seriesModels, function (seriesModel, idx) {\n            layoutSingleSeries(\n                seriesModel,\n                groupItem.boxOffsetList[idx],\n                groupItem.boxWidthList[idx]\n            );\n        });\n    });\n}\n\n/**\n * Group series by axis.\n */\nfunction groupSeriesByAxis(ecModel) {\n    var result = [];\n    var axisList = [];\n\n    ecModel.eachSeriesByType('boxplot', function (seriesModel) {\n        var baseAxis = seriesModel.getBaseAxis();\n        var idx = zrUtil.indexOf(axisList, baseAxis);\n\n        if (idx < 0) {\n            idx = axisList.length;\n            axisList[idx] = baseAxis;\n            result[idx] = {axis: baseAxis, seriesModels: []};\n        }\n\n        result[idx].seriesModels.push(seriesModel);\n    });\n\n    return result;\n}\n\n/**\n * Calculate offset and box width for each series.\n */\nfunction calculateBase(groupItem) {\n    var extent;\n    var baseAxis = groupItem.axis;\n    var seriesModels = groupItem.seriesModels;\n    var seriesCount = seriesModels.length;\n\n    var boxWidthList = groupItem.boxWidthList = [];\n    var boxOffsetList = groupItem.boxOffsetList = [];\n    var boundList = [];\n\n    var bandWidth;\n    if (baseAxis.type === 'category') {\n        bandWidth = baseAxis.getBandWidth();\n    }\n    else {\n        var maxDataCount = 0;\n        each(seriesModels, function (seriesModel) {\n            maxDataCount = Math.max(maxDataCount, seriesModel.getData().count());\n        });\n        extent = baseAxis.getExtent(),\n        Math.abs(extent[1] - extent[0]) / maxDataCount;\n    }\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([\n            parsePercent(boxWidthBound[0], bandWidth) || 0,\n            parsePercent(boxWidthBound[1], bandWidth) || 0\n        ]);\n    });\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\n    each(seriesModels, function (seriesModel, idx) {\n        boxOffsetList.push(base);\n        base += boxGap + boxWidth;\n\n        boxWidthList.push(\n            Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])\n        );\n    });\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.mapDimension(coordDims[vDimIdx], true);\n\n    if (cDim == null || vDims.length < 5) {\n        return;\n    }\n\n    for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {\n        var axisDimVal = data.get(cDim, dataIndex);\n\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\n        var ends = [];\n        addBodyEnd(ends, end2, 0);\n        addBodyEnd(ends, end4, 1);\n\n        ends.push(end1, end2, end5, end4);\n        layEndLine(ends, end1);\n        layEndLine(ends, end5);\n        layEndLine(ends, median);\n\n        data.setItemLayout(dataIndex, {\n            initBaseline: median[vDimIdx],\n            ends: ends\n        });\n    }\n\n    function getPoint(axisDimVal, dimIdx, dataIndex) {\n        var val = data.get(dimIdx, 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        }\n        else {\n            point = coordSys.dataToPoint(p);\n            point[cDimIdx] += offset;\n        }\n        return point;\n    }\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\n            ? ends.push(point1, point2)\n            : ends.push(point2, point1);\n    }\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\nimport * as echarts from '../echarts';\nimport './boxplot/BoxplotSeries';\nimport './boxplot/BoxplotView';\nimport boxplotVisual from './boxplot/boxplotVisual';\nimport boxplotLayout from './boxplot/boxplotLayout';\n\necharts.registerVisual(boxplotVisual);\necharts.registerLayout(boxplotLayout);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport SeriesModel from '../../model/Series';\nimport {seriesModelMixin} from '../helper/whiskerBoxCommon';\n\nvar CandlestickSeries = SeriesModel.extend({\n\n    type: 'series.candlestick',\n\n    dependencies: ['xAxis', 'yAxis', 'grid'],\n\n    /**\n     * @readOnly\n     */\n    defaultValueDimensions: [\n        {name: 'open', defaultTooltip: true},\n        {name: 'close', defaultTooltip: true},\n        {name: 'lowest', defaultTooltip: true},\n        {name: 'highest', defaultTooltip: true}\n    ],\n\n    /**\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    dimensions: null,\n\n    /**\n     * @override\n     */\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        coordinateSystem: 'cartesian2d',\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        layout: null, // 'horizontal' or 'vertical'\n\n        itemStyle: {\n            color: '#c23531', // 阳线 positive\n            color0: '#314656', // 阴线 negative     '#c23531', '#314656'\n            borderWidth: 1,\n            // FIXME\n            // ec2中使用的是lineStyle.color 和 lineStyle.color0\n            borderColor: '#c23531',\n            borderColor0: '#314656'\n        },\n\n        emphasis: {\n            itemStyle: {\n                borderWidth: 2\n            }\n        },\n\n        barMaxWidth: null,\n        barMinWidth: null,\n        barWidth: null,\n\n        large: true,\n        largeThreshold: 600,\n\n        progressive: 3e3,\n        progressiveThreshold: 1e4,\n        progressiveChunkMode: 'mod',\n\n        animationUpdate: false,\n        animationEasing: 'linear',\n        animationDuration: 300\n    },\n\n    /**\n     * Get dimension for shadow in dataZoom\n     * @return {string} dimension name\n     */\n    getShadowDim: function () {\n        return 'open';\n    },\n\n    brushSelector: function (dataIndex, data, selectors) {\n        var itemLayout = data.getItemLayout(dataIndex);\n        return itemLayout && selectors.rect(itemLayout.brushRect);\n    }\n\n});\n\nzrUtil.mixin(CandlestickSeries, seriesModelMixin, true);\n\nexport default CandlestickSeries;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ChartView from '../../view/Chart';\nimport * as graphic from '../../util/graphic';\nimport Path from 'zrender/src/graphic/Path';\n\nvar NORMAL_ITEM_STYLE_PATH = ['itemStyle'];\nvar EMPHASIS_ITEM_STYLE_PATH = ['emphasis', 'itemStyle'];\nvar SKIP_PROPS = ['color', 'color0', 'borderColor', 'borderColor0'];\n\n\nvar CandlestickView = ChartView.extend({\n\n    type: 'candlestick',\n\n    render: function (seriesModel, ecModel, api) {\n        this._updateDrawMode(seriesModel);\n\n        this._isLargeDraw\n            ? this._renderLarge(seriesModel)\n            : this._renderNormal(seriesModel);\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        this._clear();\n        this._updateDrawMode(seriesModel);\n    },\n\n    incrementalRender: function (params, seriesModel, ecModel, api) {\n        this._isLargeDraw\n             ? this._incrementalRenderLarge(params, seriesModel)\n             : this._incrementalRenderNormal(params, seriesModel);\n    },\n\n    _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\n    _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\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\n        data.diff(oldData)\n            .add(function (newIdx) {\n                if (data.hasValue(newIdx)) {\n                    var el;\n\n                    var itemLayout = data.getItemLayout(newIdx);\n                    el = createNormalBox(itemLayout, newIdx, true);\n                    graphic.initProps(el, {shape: {points: itemLayout.ends}}, seriesModel, newIdx);\n\n                    setBoxCommon(el, data, newIdx, isSimpleBox);\n\n                    group.add(el);\n                    data.setItemGraphicEl(newIdx, el);\n                }\n            })\n            .update(function (newIdx, oldIdx) {\n                var el = oldData.getItemGraphicEl(oldIdx);\n\n                // Empty data\n                if (!data.hasValue(newIdx)) {\n                    group.remove(el);\n                    return;\n                }\n\n                var itemLayout = data.getItemLayout(newIdx);\n                if (!el) {\n                    el = createNormalBox(itemLayout, newIdx);\n                }\n                else {\n                    graphic.updateProps(el, {shape: {points: itemLayout.ends}}, seriesModel, newIdx);\n                }\n\n                setBoxCommon(el, data, newIdx, isSimpleBox);\n\n                group.add(el);\n                data.setItemGraphicEl(newIdx, el);\n            })\n            .remove(function (oldIdx) {\n                var el = oldData.getItemGraphicEl(oldIdx);\n                el && group.remove(el);\n            })\n            .execute();\n\n        this._data = data;\n    },\n\n    _renderLarge: function (seriesModel) {\n        this._clear();\n        createLarge(seriesModel, this.group);\n    },\n\n    _incrementalRenderNormal: function (params, seriesModel) {\n        var data = seriesModel.getData();\n        var isSimpleBox = data.getLayout('isSimpleBox');\n\n        var dataIndex;\n        while ((dataIndex = params.next()) != null) {\n            var el;\n\n            var itemLayout = data.getItemLayout(dataIndex);\n            el = createNormalBox(itemLayout, dataIndex);\n            setBoxCommon(el, data, dataIndex, isSimpleBox);\n\n            el.incremental = true;\n            this.group.add(el);\n        }\n    },\n\n    _incrementalRenderLarge: function (params, seriesModel) {\n        createLarge(seriesModel, this.group, true);\n    },\n\n    remove: function (ecModel) {\n        this._clear();\n    },\n\n    _clear: function () {\n        this.group.removeAll();\n        this._data = null;\n    },\n\n    dispose: zrUtil.noop\n\n});\n\n\nvar NormalBoxPath = Path.extend({\n\n    type: 'normalCandlestickBox',\n\n    shape: {},\n\n    buildPath: function (ctx, shape) {\n        var ends = shape.points;\n\n        if (this.__simpleBox) {\n            ctx.moveTo(ends[4][0], ends[4][1]);\n            ctx.lineTo(ends[6][0], ends[6][1]);\n        }\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\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});\n\nfunction createNormalBox(itemLayout, dataIndex, isInit) {\n    var ends = itemLayout.ends;\n    return new NormalBoxPath({\n        shape: {\n            points: isInit\n                ? transInit(ends, itemLayout)\n                : ends\n        },\n        z2: 100\n    });\n}\n\nfunction setBoxCommon(el, data, dataIndex, isSimpleBox) {\n    var itemModel = data.getItemModel(dataIndex);\n    var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH);\n    var color = data.getItemVisual(dataIndex, 'color');\n    var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color;\n\n    // Color must be excluded.\n    // Because symbol provide setColor individually to set fill and stroke\n    var itemStyle = normalItemStyleModel.getItemStyle(SKIP_PROPS);\n\n    el.useStyle(itemStyle);\n    el.style.strokeNoScale = true;\n    el.style.fill = color;\n    el.style.stroke = borderColor;\n\n    el.__simpleBox = isSimpleBox;\n\n    var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();\n    graphic.setHoverStyle(el, hoverStyle);\n}\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}\n\n\n\nvar LargeBoxPath = Path.extend({\n\n    type: 'largeCandlestickBox',\n\n    shape: {},\n\n    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            }\n            else {\n                i += 3;\n            }\n        }\n    }\n});\n\nfunction createLarge(seriesModel, group, incremental) {\n    var data = seriesModel.getData();\n    var largePoints = data.getLayout('largePoints');\n\n    var elP = new LargeBoxPath({\n        shape: {points: largePoints},\n        __sign: 1\n    });\n    group.add(elP);\n    var elN = new LargeBoxPath({\n        shape: {points: largePoints},\n        __sign: -1\n    });\n    group.add(elN);\n\n    setLargeStyle(1, elP, seriesModel, data);\n    setLargeStyle(-1, elN, seriesModel, data);\n\n    if (incremental) {\n        elP.incremental = true;\n        elN.incremental = true;\n    }\n}\n\nfunction setLargeStyle(sign, el, seriesModel, data) {\n    var suffix = sign > 0 ? 'P' : 'N';\n    var borderColor = data.getVisual('borderColor' + suffix)\n        || data.getVisual('color' + suffix);\n\n    // Color must be excluded.\n    // Because symbol provide setColor individually to set fill and stroke\n    var itemStyle = seriesModel.getModel(NORMAL_ITEM_STYLE_PATH).getItemStyle(SKIP_PROPS);\n\n    el.useStyle(itemStyle);\n    el.style.fill = null;\n    el.style.stroke = borderColor;\n    // No different\n    // el.style.lineWidth = .5;\n}\n\n\n\nexport default CandlestickView;\n\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (option) {\n    if (!option || !zrUtil.isArray(option.series)) {\n        return;\n    }\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\nimport createRenderPlanner from '../helper/createRenderPlanner';\n\nvar positiveBorderColorQuery = ['itemStyle', 'borderColor'];\nvar negativeBorderColorQuery = ['itemStyle', 'borderColor0'];\nvar positiveColorQuery = ['itemStyle', 'color'];\nvar negativeColorQuery = ['itemStyle', 'color0'];\n\nexport default {\n\n    seriesType: 'candlestick',\n\n    plan: createRenderPlanner(),\n\n    // For legend.\n    performRawSeries: true,\n\n    reset: function (seriesModel, ecModel) {\n\n        var data = seriesModel.getData();\n        var isLargeRender = seriesModel.pipelineContext.large;\n\n        data.setVisual({\n            legendSymbol: 'roundRect',\n            colorP: getColor(1, seriesModel),\n            colorN: getColor(-1, seriesModel),\n            borderColorP: getBorderColor(1, seriesModel),\n            borderColorN: getBorderColor(-1, seriesModel)\n        });\n\n        // Only visible series has each data be visual encoded\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n            return;\n        }\n\n        return !isLargeRender && {progress: progress};\n\n\n        function progress(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\n                data.setItemVisual(\n                    dataIndex,\n                    {\n                        color: getColor(sign, itemModel),\n                        borderColor: getBorderColor(sign, itemModel)\n                    }\n                );\n            }\n        }\n\n        function getColor(sign, model) {\n            return model.get(\n                sign > 0 ? positiveColorQuery : negativeColorQuery\n            );\n        }\n\n        function getBorderColor(sign, model) {\n            return model.get(\n                sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery\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/* global Float32Array */\n\nimport {subPixelOptimize} from '../../util/graphic';\nimport createRenderPlanner from '../helper/createRenderPlanner';\nimport {parsePercent} from '../../util/number';\nimport {retrieve2} from 'zrender/src/core/util';\n\nvar LargeArr = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nexport default {\n\n    seriesType: 'candlestick',\n\n    plan: createRenderPlanner(),\n\n    reset: function (seriesModel) {\n\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 cDim = data.mapDimension(coordDims[cDimIdx]);\n        var vDims = data.mapDimension(coordDims[vDimIdx], true);\n        var openDim = vDims[0];\n        var closeDim = vDims[1];\n        var lowestDim = vDims[2];\n        var highestDim = vDims[3];\n\n        data.setLayout({\n            candleWidth: candleWidth,\n            // The value is experimented visually.\n            isSimpleBox: candleWidth <= 1.3\n        });\n\n        if (cDim == null || vDims.length < 4) {\n            return;\n        }\n\n        return {\n            progress: seriesModel.pipelineContext.large\n                ? largeProgress : normalProgress\n        };\n\n        function normalProgress(params, data) {\n            var dataIndex;\n            while ((dataIndex = params.next()) != null) {\n\n                var axisDimVal = data.get(cDim, dataIndex);\n                var openVal = data.get(openDim, dataIndex);\n                var closeVal = data.get(closeDim, dataIndex);\n                var lowestVal = data.get(lowestDim, dataIndex);\n                var highestVal = data.get(highestDim, dataIndex);\n\n                var ocLow = Math.min(openVal, closeVal);\n                var ocHigh = Math.max(openVal, closeVal);\n\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\n                var ends = [];\n                addBodyEnd(ends, ocHighPoint, 0);\n                addBodyEnd(ends, ocLowPoint, 1);\n\n                ends.push(\n                    subPixelOptimizePoint(highestPoint),\n                    subPixelOptimizePoint(ocHighPoint),\n                    subPixelOptimizePoint(lowestPoint),\n                    subPixelOptimizePoint(ocLowPoint)\n                );\n\n                data.setItemLayout(dataIndex, {\n                    sign: getSign(data, dataIndex, openVal, closeVal, closeDim),\n                    initBaseline: openVal > closeVal\n                        ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], // open point.\n                    ends: ends,\n                    brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal)\n                });\n            }\n\n            function getPoint(val, axisDimVal) {\n                var p = [];\n                p[cDimIdx] = axisDimVal;\n                p[vDimIdx] = val;\n                return (isNaN(axisDimVal) || isNaN(val))\n                    ? [NaN, NaN]\n                    : coordSys.dataToPoint(p);\n            }\n\n            function addBodyEnd(ends, point, start) {\n                var point1 = point.slice();\n                var point2 = point.slice();\n\n                point1[cDimIdx] = subPixelOptimize(\n                    point1[cDimIdx] + candleWidth / 2, 1, false\n                );\n                point2[cDimIdx] = subPixelOptimize(\n                    point2[cDimIdx] - candleWidth / 2, 1, true\n                );\n\n                start\n                    ? ends.push(point1, point2)\n                    : ends.push(point2, point1);\n            }\n\n            function makeBrushRect(lowestVal, highestVal, axisDimVal) {\n                var pmin = getPoint(lowestVal, axisDimVal);\n                var pmax = getPoint(highestVal, axisDimVal);\n\n                pmin[cDimIdx] -= candleWidth / 2;\n                pmax[cDimIdx] -= candleWidth / 2;\n\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\n            function subPixelOptimizePoint(point) {\n                point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1);\n                return point;\n            }\n        }\n\n        function largeProgress(params, data) {\n            // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...]\n            var points = new LargeArr(params.count * 5);\n            var offset = 0;\n            var point;\n            var tmpIn = [];\n            var tmpOut = [];\n            var dataIndex;\n\n            while ((dataIndex = params.next()) != null) {\n                var axisDimVal = data.get(cDim, dataIndex);\n                var openVal = data.get(openDim, dataIndex);\n                var closeVal = data.get(closeDim, dataIndex);\n                var lowestVal = data.get(lowestDim, dataIndex);\n                var highestVal = data.get(highestDim, dataIndex);\n\n                if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {\n                    points[offset++] = NaN;\n                    offset += 4;\n                    continue;\n                }\n\n                points[offset++] = getSign(data, dataIndex, openVal, closeVal, closeDim);\n\n                tmpIn[cDimIdx] = axisDimVal;\n\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\n            data.setLayout('largePoints', points);\n        }\n    }\n};\n\nfunction getSign(data, dataIndex, openVal, closeVal, closeDim) {\n    var sign;\n    if (openVal > closeVal) {\n        sign = -1;\n    }\n    else if (openVal < closeVal) {\n        sign = 1;\n    }\n    else {\n        sign = dataIndex > 0\n            // If close === open, compare with close of last record\n            ? (data.get(closeDim, dataIndex - 1) <= closeVal ? 1 : -1)\n            // No record of previous, set to be positive\n            : 1;\n    }\n\n    return sign;\n}\n\nfunction calculateCandleWidth(seriesModel, data) {\n    var baseAxis = seriesModel.getBaseAxis();\n    var extent;\n\n    var bandWidth = baseAxis.type === 'category'\n        ? baseAxis.getBandWidth()\n        : (\n            extent = baseAxis.getExtent(),\n            Math.abs(extent[1] - extent[0]) / data.count()\n        );\n\n    var barMaxWidth = parsePercent(\n        retrieve2(seriesModel.get('barMaxWidth'), bandWidth),\n        bandWidth\n    );\n    var barMinWidth = parsePercent(\n        retrieve2(seriesModel.get('barMinWidth'), 1),\n        bandWidth\n    );\n    var barWidth = seriesModel.get('barWidth');\n\n    return barWidth != null\n        ? 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}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './candlestick/CandlestickSeries';\nimport './candlestick/CandlestickView';\nimport preprocessor from './candlestick/preprocessor';\n\nimport candlestickVisual from './candlestick/candlestickVisual';\nimport candlestickLayout from './candlestick/candlestickLayout';\n\necharts.registerPreprocessor(preprocessor);\necharts.registerVisual(candlestickVisual);\necharts.registerLayout(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\nimport createListFromArray from '../helper/createListFromArray';\nimport SeriesModel from '../../model/Series';\n\nexport default SeriesModel.extend({\n\n    type: 'series.effectScatter',\n\n    dependencies: ['grid', 'polar'],\n\n    getInitialData: function (option, ecModel) {\n        return createListFromArray(this.getSource(), this);\n    },\n\n    brushSelector: 'point',\n\n    defaultOption: {\n        coordinateSystem: 'cartesian2d',\n        zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n\n        effectType: 'ripple',\n\n        progressive: 0,\n\n        // When to show the effect, option: 'render'|'emphasis'\n        showEffectOn: 'render',\n\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        },\n\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // Polar coordinate system\n        // polarIndex: 0,\n\n        // Geo coordinate system\n        // geoIndex: 0,\n\n        // symbol: null,        // 图形类型\n        symbolSize: 10          // 图形大小，半宽（半径）参数，当图形为方向或菱形则总宽度为symbolSize * 2\n        // symbolRotate: null,  // 图形旋转控制\n\n        // large: false,\n        // Available when large is true\n        // largeThreshold: 2000,\n\n        // itemStyle: {\n        //     opacity: 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 * Symbol with ripple effect\n * @module echarts/chart/helper/EffectSymbol\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {createSymbol} from '../../util/symbol';\nimport {Group} from '../../util/graphic';\nimport {parsePercent} from '../../util/number';\nimport SymbolClz from './Symbol';\n\nvar EFFECT_RIPPLE_NUMBER = 3;\n\nfunction normalizeSymbolSize(symbolSize) {\n    if (!zrUtil.isArray(symbolSize)) {\n        symbolSize = [+symbolSize, +symbolSize];\n    }\n    return symbolSize;\n}\n\nfunction updateRipplePath(rippleGroup, effectCfg) {\n    rippleGroup.eachChild(function (ripplePath) {\n        ripplePath.attr({\n            z: effectCfg.z,\n            zlevel: effectCfg.zlevel,\n            style: {\n                stroke: effectCfg.brushType === 'stroke' ? effectCfg.color : null,\n                fill: effectCfg.brushType === 'fill' ? effectCfg.color : null\n            }\n        });\n    });\n}\n/**\n * @constructor\n * @param {module:echarts/data/List} data\n * @param {number} idx\n * @extends {module:zrender/graphic/Group}\n */\nfunction EffectSymbol(data, idx) {\n    Group.call(this);\n\n    var symbol = new SymbolClz(data, idx);\n    var rippleGroup = new Group();\n    this.add(symbol);\n    this.add(rippleGroup);\n\n    rippleGroup.beforeUpdate = function () {\n        this.attr(symbol.getScale());\n    };\n    this.updateData(data, idx);\n}\n\nvar effectSymbolProto = EffectSymbol.prototype;\n\neffectSymbolProto.stopEffectAnimation = function () {\n    this.childAt(1).removeAll();\n};\n\neffectSymbolProto.startEffectAnimation = function (effectCfg) {\n    var symbolType = effectCfg.symbolType;\n    var color = effectCfg.color;\n    var rippleGroup = this.childAt(1);\n\n    for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) {\n        // var ripplePath = 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 #4136.\n        var ripplePath = createSymbol(\n            symbolType, -1, -1, 2, 2, color\n        );\n        ripplePath.attr({\n            style: {\n                strokeNoScale: true\n            },\n            z2: 99,\n            silent: true,\n            scale: [0.5, 0.5]\n        });\n\n        var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset;\n        // TODO Configurable effectCfg.period\n        ripplePath.animate('', true)\n            .when(effectCfg.period, {\n                scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2]\n            })\n            .delay(delay)\n            .start();\n        ripplePath.animateStyle(true)\n            .when(effectCfg.period, {\n                opacity: 0\n            })\n            .delay(delay)\n            .start();\n\n        rippleGroup.add(ripplePath);\n    }\n\n    updateRipplePath(rippleGroup, effectCfg);\n};\n\n/**\n * Update effect symbol\n */\neffectSymbolProto.updateEffectAnimation = function (effectCfg) {\n    var oldEffectCfg = this._effectCfg;\n    var rippleGroup = this.childAt(1);\n\n    // Must reinitialize effect if following configuration changed\n    var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'];\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\n    updateRipplePath(rippleGroup, effectCfg);\n};\n\n/**\n * Highlight symbol\n */\neffectSymbolProto.highlight = function () {\n    this.trigger('emphasis');\n};\n\n/**\n * Downplay symbol\n */\neffectSymbolProto.downplay = function () {\n    this.trigger('normal');\n};\n\n/**\n * Update symbol properties\n * @param  {module:echarts/data/List} data\n * @param  {number} idx\n */\neffectSymbolProto.updateData = function (data, idx) {\n    var seriesModel = data.hostModel;\n\n    this.childAt(0).updateData(data, idx);\n\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 color = data.getItemVisual(idx, 'color');\n\n    rippleGroup.attr('scale', symbolSize);\n\n    rippleGroup.traverse(function (ripplePath) {\n        ripplePath.attr({\n            fill: color\n        });\n    });\n\n    var symbolOffset = itemModel.getShallow('symbolOffset');\n    if (symbolOffset) {\n        var pos = rippleGroup.position;\n        pos[0] = parsePercent(symbolOffset[0], symbolSize[0]);\n        pos[1] = parsePercent(symbolOffset[1], symbolSize[1]);\n    }\n    rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0;\n\n    var effectCfg = {};\n\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 = itemModel.getShallow('z') || 0;\n    effectCfg.zlevel = itemModel.getShallow('zlevel') || 0;\n    effectCfg.symbolType = symbolType;\n    effectCfg.color = color;\n\n    this.off('mouseover').off('mouseout').off('emphasis').off('normal');\n\n    if (effectCfg.showEffectOn === 'render') {\n        this._effectCfg\n            ? this.updateEffectAnimation(effectCfg)\n            : this.startEffectAnimation(effectCfg);\n\n        this._effectCfg = effectCfg;\n    }\n    else {\n        // Not keep old effect config\n        this._effectCfg = null;\n\n        this.stopEffectAnimation();\n        var symbol = this.childAt(0);\n        var onEmphasis = function () {\n            symbol.highlight();\n            if (effectCfg.showEffectOn !== 'render') {\n                this.startEffectAnimation(effectCfg);\n            }\n        };\n        var onNormal = function () {\n            symbol.downplay();\n            if (effectCfg.showEffectOn !== 'render') {\n                this.stopEffectAnimation();\n            }\n        };\n        this.on('mouseover', onEmphasis, this)\n            .on('mouseout', onNormal, this)\n            .on('emphasis', onEmphasis, this)\n            .on('normal', onNormal, this);\n    }\n\n    this._effectCfg = effectCfg;\n};\n\neffectSymbolProto.fadeOut = function (cb) {\n    this.off('mouseover').off('mouseout').off('emphasis').off('normal');\n    cb && cb();\n};\n\nzrUtil.inherits(EffectSymbol, Group);\n\nexport default EffectSymbol;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport SymbolDraw from '../helper/SymbolDraw';\nimport EffectSymbol from '../helper/EffectSymbol';\nimport * as matrix from 'zrender/src/core/matrix';\n\nimport pointsLayout from '../../layout/points';\n\nexport default echarts.extendChartView({\n\n    type: 'effectScatter',\n\n    init: function () {\n        this._symbolDraw = new SymbolDraw(EffectSymbol);\n    },\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var effectSymbolDraw = this._symbolDraw;\n        effectSymbolDraw.updateData(data);\n        this.group.add(effectSymbolDraw.group);\n    },\n\n    updateTransform: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n\n        this.group.dirty();\n\n        var res = pointsLayout().reset(seriesModel);\n        if (res.progress) {\n            res.progress({ start: 0, end: data.count() }, data);\n        }\n\n        this._symbolDraw.updateLayout(data);\n    },\n\n    _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\n    remove: function (ecModel, api) {\n        this._symbolDraw && this._symbolDraw.remove(api);\n    },\n\n    dispose: function () {}\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './effectScatter/EffectScatterSeries';\nimport './effectScatter/EffectScatterView';\n\nimport visualSymbol from '../visual/symbol';\nimport layoutPoints from '../layout/points';\n\necharts.registerVisual(visualSymbol('effectScatter', 'circle'));\necharts.registerLayout(layoutPoints('effectScatter'));","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/* global Uint32Array, Float64Array, Float32Array */\n\nimport {__DEV__} from '../../config';\nimport SeriesModel from '../../model/Series';\nimport List from '../../data/List';\nimport { concatArray, mergeAll, map } from 'zrender/src/core/util';\nimport {encodeHTML} from '../../util/format';\nimport CoordinateSystem from '../../CoordinateSystem';\n\nvar Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;\nvar Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;\n\nfunction compatEc2(seriesOpt) {\n    var data = seriesOpt.data;\n    if (data && data[0] && data[0][0] && data[0][0].coord) {\n        if (__DEV__) {\n            console.warn('Lines data configuration has been changed to'\n                + ' { coords:[[1,2],[2,3]] }');\n        }\n        seriesOpt.data = map(data, function (itemOpt) {\n            var coords = [\n                itemOpt[0].coord, itemOpt[1].coord\n            ];\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}\n\nvar LinesSeries = SeriesModel.extend({\n\n    type: 'series.lines',\n\n    dependencies: ['grid', 'polar'],\n\n    visualColorAccessPath: 'lineStyle.color',\n\n    init: function (option) {\n        // The input data may be null/undefined.\n        option.data = option.data || [];\n\n        // Not using preprocessor because mergeOption may not have series.type\n        compatEc2(option);\n\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        LinesSeries.superApply(this, 'init', arguments);\n    },\n\n    mergeOption: function (option) {\n        // The input data may be null/undefined.\n        option.data = option.data || [];\n\n        compatEc2(option);\n\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\n        LinesSeries.superApply(this, 'mergeOption', arguments);\n    },\n\n    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            }\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\n        this.getRawData().appendData(params.data);\n    },\n\n    _getCoordsFromItemModel: function (idx) {\n        var itemModel = this.getData().getItemModel(idx);\n        var coords = (itemModel.option instanceof Array)\n            ? itemModel.option : itemModel.getShallow('coords');\n\n        if (__DEV__) {\n            if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) {\n                throw new Error(\n                    'Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'\n                );\n            }\n        }\n        return coords;\n    },\n\n    getLineCoordsCount: function (idx) {\n        if (this._flatCoordsOffset) {\n            return this._flatCoordsOffset[idx * 2 + 1];\n        }\n        else {\n            return this._getCoordsFromItemModel(idx).length;\n        }\n    },\n\n    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        }\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\n    _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 (typeof data[0] === 'number') {\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\n                    if (i > len) {\n                        if (__DEV__) {\n                            throw new Error('Invalid data format.');\n                        }\n                    }\n                }\n            }\n\n            return {\n                flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor),\n                flatCoords: coordsStorage,\n                count: dataCount\n            };\n        }\n\n        return {\n            flatCoordsOffset: null,\n            flatCoords: null,\n            count: data.length\n        };\n    },\n\n    getInitialData: function (option, ecModel) {\n        if (__DEV__) {\n            var CoordSys = CoordinateSystem.get(option.coordinateSystem);\n            if (!CoordSys) {\n                throw new Error('Unkown coordinate system ' + option.coordinateSystem);\n            }\n        }\n\n        var lineData = new List(['value'], this);\n        lineData.hasItemOption = false;\n\n        lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {\n            // dataItem is simply coords\n            if (dataItem instanceof Array) {\n                return NaN;\n            }\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\n        return lineData;\n    },\n\n    formatTooltip: function (dataIndex) {\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 html = [];\n        fromName != null && html.push(fromName);\n        toName != null && html.push(toName);\n\n        return encodeHTML(html.join(' > '));\n    },\n\n    preventIncremental: function () {\n        return !!this.get('effect.show');\n    },\n\n    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\n    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\n    defaultOption: {\n        coordinateSystem: 'geo',\n        zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n\n        hoverAnimation: true,\n        // Cartesian coordinate system\n        xAxisIndex: 0,\n        yAxisIndex: 0,\n\n        symbol: ['none', 'none'],\n        symbolSize: [10, 10],\n        // Geo coordinate system\n        geoIndex: 0,\n\n        effect: {\n            show: false,\n            period: 4,\n            // Animation delay. support callback\n            // delay: 0,\n            // If move with constant speed px/sec\n            // period will be ignored if this property is > 0,\n            constantSpeed: 0,\n            symbol: 'circle',\n            symbolSize: 3,\n            loop: true,\n            // Length of trail, 0 - 1\n            trailLength: 0.2\n            // Same with lineStyle.color\n            // color\n        },\n\n        large: false,\n        // Available when large is true\n        largeThreshold: 2000,\n\n        // If lines are polyline\n        // polyline not support curveness, label, animation\n        polyline: false,\n\n        label: {\n            show: false,\n            position: 'end'\n            // distance: 5,\n            // formatter: 标签文本格式器，同Tooltip.formatter，不支持异步回调\n        },\n\n        lineStyle: {\n            opacity: 0.5\n        }\n    }\n});\n\nexport default LinesSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Provide effect for line\n * @module echarts/chart/helper/EffectLine\n */\n\nimport * as graphic from '../../util/graphic';\nimport Line from './Line';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {createSymbol} from '../../util/symbol';\nimport * as vec2 from 'zrender/src/core/vector';\nimport * as curveUtil from 'zrender/src/core/curve';\n\n/**\n * @constructor\n * @extends {module:zrender/graphic/Group}\n * @alias {module:echarts/chart/helper/Line}\n */\nfunction EffectLine(lineData, idx, seriesScope) {\n    graphic.Group.call(this);\n\n    this.add(this.createLine(lineData, idx, seriesScope));\n\n    this._updateEffectSymbol(lineData, idx);\n}\n\nvar effectLineProto = EffectLine.prototype;\n\neffectLineProto.createLine = function (lineData, idx, seriesScope) {\n    return new Line(lineData, idx, seriesScope);\n};\n\neffectLineProto._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 color = effectModel.get('color') || lineData.getItemVisual(idx, 'color');\n    var symbol = this.childAt(1);\n\n    if (this._symbolType !== symbolType) {\n        // Remove previous\n        this.remove(symbol);\n\n        symbol = createSymbol(\n            symbolType, -0.5, -0.5, 1, 1, color\n        );\n        symbol.z2 = 100;\n        symbol.culling = true;\n\n        this.add(symbol);\n    }\n\n    // Symbol may be removed if loop is false\n    if (!symbol) {\n        return;\n    }\n\n    // Shadow color is same with color in default\n    symbol.setStyle('shadowColor', color);\n    symbol.setStyle(effectModel.getItemStyle(['color']));\n\n    symbol.attr('scale', size);\n\n    symbol.setColor(color);\n    symbol.attr('scale', size);\n\n    this._symbolType = symbolType;\n\n    this._updateEffectAnimation(lineData, effectModel, idx);\n};\n\neffectLineProto._updateEffectAnimation = function (lineData, effectModel, idx) {\n\n    var symbol = this.childAt(1);\n    if (!symbol) {\n        return;\n    }\n\n    var self = this;\n\n    var points = lineData.getItemLayout(idx);\n\n    var period = effectModel.get('period') * 1000;\n    var loop = effectModel.get('loop');\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    var isDelayFunc = typeof delayExpr === 'function';\n\n    // Ignore when updating\n    symbol.ignore = true;\n\n    this.updateAnimationPoints(symbol, points);\n\n    if (constantSpeed > 0) {\n        period = this.getLineLength(symbol) / constantSpeed * 1000;\n    }\n\n    if (period !== this._period || loop !== this._loop) {\n\n        symbol.stopAnimation();\n\n        var delay = delayExpr;\n        if (isDelayFunc) {\n            delay = delayExpr(idx);\n        }\n        if (symbol.__t > 0) {\n            delay = -period * symbol.__t;\n        }\n        symbol.__t = 0;\n        var animator = symbol.animate('', loop)\n            .when(period, {\n                __t: 1\n            })\n            .delay(delay)\n            .during(function () {\n                self.updateSymbolPosition(symbol);\n            });\n        if (!loop) {\n            animator.done(function () {\n                self.remove(symbol);\n            });\n        }\n        animator.start();\n    }\n\n    this._period = period;\n    this._loop = loop;\n};\n\neffectLineProto.getLineLength = function (symbol) {\n    // Not so accurate\n    return (vec2.dist(symbol.__p1, symbol.__cp1)\n        + vec2.dist(symbol.__cp1, symbol.__p2));\n};\n\neffectLineProto.updateAnimationPoints = function (symbol, points) {\n    symbol.__p1 = points[0];\n    symbol.__p2 = points[1];\n    symbol.__cp1 = points[2] || [\n        (points[0][0] + points[1][0]) / 2,\n        (points[0][1] + points[1][1]) / 2\n    ];\n};\n\neffectLineProto.updateData = function (lineData, idx, seriesScope) {\n    this.childAt(0).updateData(lineData, idx, seriesScope);\n    this._updateEffectSymbol(lineData, idx);\n};\n\neffectLineProto.updateSymbolPosition = function (symbol) {\n    var p1 = symbol.__p1;\n    var p2 = symbol.__p2;\n    var cp1 = symbol.__cp1;\n    var t = symbol.__t;\n    var pos = symbol.position;\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\n    // Tangent\n    var tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t);\n    var ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t);\n\n    symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n\n    symbol.ignore = false;\n};\n\n\neffectLineProto.updateLayout = function (lineData, idx) {\n    this.childAt(0).updateLayout(lineData, idx);\n\n    var effectModel = lineData.getItemModel(idx).getModel('effect');\n    this._updateEffectAnimation(lineData, effectModel, idx);\n};\n\nzrUtil.inherits(EffectLine, graphic.Group);\n\nexport default EffectLine;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/chart/helper/Line\n */\n\nimport * as graphic from '../../util/graphic';\nimport * as zrUtil from 'zrender/src/core/util';\n\n/**\n * @constructor\n * @extends {module:zrender/graphic/Group}\n * @alias {module:echarts/chart/helper/Polyline}\n */\nfunction Polyline(lineData, idx, seriesScope) {\n    graphic.Group.call(this);\n\n    this._createPolyline(lineData, idx, seriesScope);\n}\n\nvar polylineProto = Polyline.prototype;\n\npolylineProto._createPolyline = function (lineData, idx, seriesScope) {\n    // var seriesModel = lineData.hostModel;\n    var points = lineData.getItemLayout(idx);\n\n    var line = new graphic.Polyline({\n        shape: {\n            points: points\n        }\n    });\n\n    this.add(line);\n\n    this._updateCommonStl(lineData, idx, seriesScope);\n};\n\npolylineProto.updateData = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n\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\n    this._updateCommonStl(lineData, idx, seriesScope);\n};\n\npolylineProto._updateCommonStl = function (lineData, idx, seriesScope) {\n    var line = this.childAt(0);\n    var itemModel = lineData.getItemModel(idx);\n\n    var visualColor = lineData.getItemVisual(idx, 'color');\n\n    var lineStyle = seriesScope && seriesScope.lineStyle;\n    var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;\n\n    if (!seriesScope || lineData.hasItemOption) {\n        lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n        hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();\n    }\n    line.useStyle(zrUtil.defaults(\n        {\n            strokeNoScale: true,\n            fill: 'none',\n            stroke: visualColor\n        },\n        lineStyle\n    ));\n    line.hoverStyle = hoverLineStyle;\n\n    graphic.setHoverStyle(this);\n};\n\npolylineProto.updateLayout = function (lineData, idx) {\n    var polyline = this.childAt(0);\n    polyline.setShape('points', lineData.getItemLayout(idx));\n};\n\nzrUtil.inherits(Polyline, graphic.Group);\n\nexport default Polyline;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Provide effect for line\n * @module echarts/chart/helper/EffectLine\n */\n\nimport Polyline from './Polyline';\nimport * as zrUtil from 'zrender/src/core/util';\nimport EffectLine from './EffectLine';\nimport * as vec2 from 'zrender/src/core/vector';\n\n/**\n * @constructor\n * @extends {module:echarts/chart/helper/EffectLine}\n * @alias {module:echarts/chart/helper/Polyline}\n */\nfunction EffectPolyline(lineData, idx, seriesScope) {\n    EffectLine.call(this, lineData, idx, seriesScope);\n    this._lastFrame = 0;\n    this._lastFramePercent = 0;\n}\n\nvar effectPolylineProto = EffectPolyline.prototype;\n\n// Overwrite\neffectPolylineProto.createLine = function (lineData, idx, seriesScope) {\n    return new Polyline(lineData, idx, seriesScope);\n};\n\n// Overwrite\neffectPolylineProto.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        return;\n    }\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// Overwrite\neffectPolylineProto.getLineLength = function (symbol) {\n    return this._length;\n};\n\n// Overwrite\neffectPolylineProto.updateSymbolPosition = function (symbol) {\n    var t = symbol.__t;\n    var points = this._points;\n    var offsets = this._offsets;\n    var len = points.length;\n\n    if (!offsets) {\n        // Has length 0\n        return;\n    }\n\n    var lastFrame = this._lastFrame;\n    var frame;\n\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    }\n    else {\n        for (var frame = lastFrame; frame < len; frame++) {\n            if (offsets[frame] > t) {\n                break;\n            }\n        }\n        frame = Math.min(frame - 1, len - 2);\n    }\n\n    vec2.lerp(\n        symbol.position, points[frame], points[frame + 1],\n        (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame])\n    );\n\n    var tx = points[frame + 1][0] - points[frame][0];\n    var ty = points[frame + 1][1] - points[frame][1];\n    symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n\n    this._lastFrame = frame;\n    this._lastFramePercent = t;\n\n    symbol.ignore = false;\n};\n\nzrUtil.inherits(EffectPolyline, EffectLine);\n\nexport default EffectPolyline;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// TODO Batch by color\n\nimport * as graphic from '../../util/graphic';\nimport IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable';\nimport * as lineContain from 'zrender/src/contain/line';\nimport * as quadraticContain from 'zrender/src/contain/quadratic';\n\nvar LargeLineShape = graphic.extendShape({\n\n    shape: {\n        polyline: false,\n        curveness: 0,\n        segs: []\n    },\n\n    buildPath: function (path, shape) {\n        var segs = shape.segs;\n        var curveness = shape.curveness;\n\n        if (shape.polyline) {\n            for (var i = 0; i < segs.length;) {\n                var count = segs[i++];\n                if (count > 0) {\n                    path.moveTo(segs[i++], segs[i++]);\n                    for (var k = 1; k < count; k++) {\n                        path.lineTo(segs[i++], segs[i++]);\n                    }\n                }\n            }\n        }\n        else {\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                path.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                    path.quadraticCurveTo(x2, y2, x1, y1);\n                }\n                else {\n                    path.lineTo(x1, y1);\n                }\n            }\n        }\n    },\n\n    findDataIndex: function (x, y) {\n\n        var shape = this.shape;\n        var segs = shape.segs;\n        var curveness = shape.curveness;\n\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)) {\n                            return dataIndex;\n                        }\n                    }\n                }\n\n                dataIndex++;\n            }\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\n                    if (quadraticContain.containStroke(x0, y0, x2, y2, x1, y1)) {\n                        return dataIndex;\n                    }\n                }\n                else {\n                    if (lineContain.containStroke(x0, y0, x1, y1)) {\n                        return dataIndex;\n                    }\n                }\n\n                dataIndex++;\n            }\n        }\n\n        return -1;\n    }\n});\n\nfunction LargeLineDraw() {\n    this.group = new graphic.Group();\n}\n\nvar largeLineProto = LargeLineDraw.prototype;\n\nlargeLineProto.isPersistent = function () {\n    return !this._incremental;\n};\n\n/**\n * Update symbols draw by new data\n * @param {module:echarts/data/List} data\n */\nlargeLineProto.updateData = function (data) {\n    this.group.removeAll();\n\n    var lineEl = new LargeLineShape({\n        rectHover: true,\n        cursor: 'default'\n    });\n    lineEl.setShape({\n        segs: data.getLayout('linesPoints')\n    });\n\n    this._setCommon(lineEl, data);\n\n    // Add back\n    this.group.add(lineEl);\n\n    this._incremental = null;\n};\n\n/**\n * @override\n */\nlargeLineProto.incrementalPrepareUpdate = function (data) {\n    this.group.removeAll();\n\n    this._clearIncremental();\n\n    if (data.count() > 5e5) {\n        if (!this._incremental) {\n            this._incremental = new IncrementalDisplayable({\n                silent: true\n            });\n        }\n        this.group.add(this._incremental);\n    }\n    else {\n        this._incremental = null;\n    }\n};\n\n/**\n * @override\n */\nlargeLineProto.incrementalUpdate = function (taskParams, data) {\n    var lineEl = new LargeLineShape();\n    lineEl.setShape({\n        segs: data.getLayout('linesPoints')\n    });\n\n    this._setCommon(lineEl, data, !!this._incremental);\n\n    if (!this._incremental) {\n        lineEl.rectHover = true;\n        lineEl.cursor = 'default';\n        lineEl.__startIndex = taskParams.start;\n        this.group.add(lineEl);\n    }\n    else {\n        this._incremental.addDisplayable(lineEl, true);\n    }\n};\n\n/**\n * @override\n */\nlargeLineProto.remove = function () {\n    this._clearIncremental();\n    this._incremental = null;\n    this.group.removeAll();\n};\n\nlargeLineProto._setCommon = function (lineEl, data, isIncremental) {\n    var hostModel = data.hostModel;\n\n    lineEl.setShape({\n        polyline: hostModel.get('polyline'),\n        curveness: hostModel.get('lineStyle.curveness')\n    });\n\n    lineEl.useStyle(\n        hostModel.getModel('lineStyle').getLineStyle()\n    );\n    lineEl.style.strokeNoScale = true;\n\n    var visualColor = data.getVisual('color');\n    if (visualColor) {\n        lineEl.setStyle('stroke', visualColor);\n    }\n    lineEl.setStyle('fill');\n\n    if (!isIncremental) {\n        // Enable tooltip\n        // PENDING May have performance issue when path is extremely large\n        lineEl.seriesIndex = hostModel.seriesIndex;\n        lineEl.on('mousemove', function (e) {\n            lineEl.dataIndex = null;\n            var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);\n            if (dataIndex > 0) {\n                // Provide dataIndex for tooltip\n                lineEl.dataIndex = dataIndex + lineEl.__startIndex;\n            }\n        });\n    }\n};\n\nlargeLineProto._clearIncremental = function () {\n    var incremental = this._incremental;\n    if (incremental) {\n        incremental.clearDisplaybles();\n    }\n};\n\nexport default LargeLineDraw;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/* global Float32Array */\n\nimport createRenderPlanner from '../helper/createRenderPlanner';\n\nexport default {\n    seriesType: 'lines',\n\n    plan: createRenderPlanner(),\n\n    reset: function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n        var isPolyline = seriesModel.get('polyline');\n        var isLarge = seriesModel.pipelineContext.large;\n\n        function progress(params, lineData) {\n            var lineCoords = [];\n            if (isLarge) {\n                var points;\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                }\n                else {\n                    points = new Float32Array(segCount * 4);\n                }\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\n                lineData.setLayout('linesPoints', points);\n            }\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\n                    var pts = [];\n                    if (isPolyline) {\n                        for (var j = 0; j < len; j++) {\n                            pts.push(coordSys.dataToPoint(lineCoords[j]));\n                        }\n                    }\n                    else {\n                        pts[0] = coordSys.dataToPoint(lineCoords[0]);\n                        pts[1] = coordSys.dataToPoint(lineCoords[1]);\n\n                        var curveness = itemModel.get('lineStyle.curveness');\n                        if (+curveness) {\n                            pts[2] = [\n                                (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness,\n                                (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness\n                            ];\n                        }\n                    }\n                    lineData.setItemLayout(i, pts);\n                }\n            }\n        }\n\n        return { progress: progress };\n    }\n};","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport LineDraw from '../helper/LineDraw';\nimport EffectLine from '../helper/EffectLine';\nimport Line from '../helper/Line';\nimport Polyline from '../helper/Polyline';\nimport EffectPolyline from '../helper/EffectPolyline';\nimport LargeLineDraw from '../helper/LargeLineDraw';\nimport linesLayout from './linesLayout';\n\nexport default echarts.extendChartView({\n\n    type: 'lines',\n\n    init: function () {},\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n\n        var lineDraw = this._updateLineDraw(data, seriesModel);\n\n        var zlevel = seriesModel.get('zlevel');\n        var trailLength = seriesModel.get('effect.trailLength');\n\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) {\n            if (__DEV__) {\n                var notInIndividual = false;\n                ecModel.eachSeries(function (otherSeriesModel) {\n                    if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) {\n                        notInIndividual = true;\n                    }\n                });\n                notInIndividual && console.warn('Lines with trail effect should have an individual zlevel');\n            }\n\n            if (!isSvg) {\n                zr.configLayer(zlevel, {\n                    motionBlur: true,\n                    lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)\n                });\n            }\n        }\n\n        lineDraw.updateData(data);\n\n        this._lastZlevel = zlevel;\n\n        this._finished = true;\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n\n        var lineDraw = this._updateLineDraw(data, seriesModel);\n\n        lineDraw.incrementalPrepareUpdate(data);\n\n        this._clearLayer(api);\n\n        this._finished = false;\n    },\n\n    incrementalRender: function (taskParams, seriesModel, ecModel) {\n        this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData());\n\n        this._finished = taskParams.end === seriesModel.getData().count();\n    },\n\n    updateTransform: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n        var pipelineContext = seriesModel.pipelineContext;\n\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        }\n        else {\n            // TODO Use same logic with ScatterView.\n            // Manually update layout\n            var res = linesLayout.reset(seriesModel);\n            if (res.progress) {\n                res.progress({ start: 0, end: data.count() }, data);\n            }\n            this._lineDraw.updateLayout();\n            this._clearLayer(api);\n        }\n    },\n\n    _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\n        if (__DEV__) {\n            if (hasEffect && isLargeDraw) {\n                console.warn('Large lines not support effect');\n            }\n        }\n        if (!lineDraw\n            || hasEffect !== this._hasEffet\n            || isPolyline !== this._isPolyline\n            || isLargeDraw !== this._isLargeDraw\n        ) {\n            if (lineDraw) {\n                lineDraw.remove();\n            }\n            lineDraw = this._lineDraw = isLargeDraw\n                ? new LargeLineDraw()\n                : new LineDraw(\n                    isPolyline\n                        ? (hasEffect ? EffectPolyline : Polyline)\n                        : (hasEffect ? EffectLine : Line)\n                );\n            this._hasEffet = hasEffect;\n            this._isPolyline = isPolyline;\n            this._isLargeDraw = isLargeDraw;\n            this.group.removeAll();\n        }\n\n        this.group.add(lineDraw.group);\n\n        return lineDraw;\n    },\n\n    _showEffect: function (seriesModel) {\n        return !!seriesModel.get('effect.show');\n    },\n\n    _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\n    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\n    dispose: function () {}\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nfunction normalize(a) {\n    if (!(a instanceof Array)) {\n        a = [a, a];\n    }\n    return a;\n}\n\nvar opacityQuery = 'lineStyle.opacity'.split('.');\n\nexport default {\n    seriesType: 'lines',\n    reset: function (seriesModel, ecModel, api) {\n        var symbolType = normalize(seriesModel.get('symbol'));\n        var symbolSize = normalize(seriesModel.get('symbolSize'));\n        var data = seriesModel.getData();\n\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        data.setVisual('opacity', seriesModel.get(opacityQuery));\n\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            var opacity = itemModel.get(opacityQuery);\n\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            data.setItemVisual(idx, 'opacity', opacity);\n        }\n\n        return {dataEach: data.hasItemOption ? dataEach : 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\nimport * as echarts from '../echarts';\n\nimport './lines/LinesSeries';\nimport './lines/LinesView';\n\nimport linesLayout from './lines/linesLayout';\nimport linesVisual from './lines/linesVisual';\n\necharts.registerLayout(linesLayout);\necharts.registerVisual(linesVisual);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport SeriesModel from '../../model/Series';\nimport createListFromArray from '../helper/createListFromArray';\nimport CoordinateSystem from '../../CoordinateSystem';\n\nexport default SeriesModel.extend({\n    type: 'series.heatmap',\n\n    getInitialData: function (option, ecModel) {\n        return createListFromArray(this.getSource(), this, {\n            generateCoord: 'value'\n        });\n    },\n\n    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\n    defaultOption: {\n\n        // Cartesian2D or geo\n        coordinateSystem: 'cartesian2d',\n\n        zlevel: 0,\n\n        z: 2,\n\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // Geo coordinate system\n        geoIndex: 0,\n\n        blurSize: 30,\n\n        pointSize: 20,\n\n        maxOpacity: 1,\n\n        minOpacity: 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/* global Uint8ClampedArray */\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar GRADIENT_LEVELS = 256;\n\n/**\n * Heatmap Chart\n *\n * @class\n */\nfunction Heatmap() {\n    var canvas = zrUtil.createCanvas();\n    this.canvas = canvas;\n\n    this.blurSize = 30;\n    this.pointSize = 20;\n\n    this.maxOpacity = 1;\n    this.minOpacity = 0;\n\n    this._gradientPixels = {};\n}\n\nHeatmap.prototype = {\n    /**\n     * Renders Heatmap and returns the rendered canvas\n     * @param {Array} data array of data, each has x, y, value\n     * @param {number} width canvas width\n     * @param {number} height canvas height\n     */\n    update: function (data, width, height, normalize, colorFunc, isInRange) {\n        var brush = this._getBrush();\n        var gradientInRange = this._getGradient(data, colorFunc, 'inRange');\n        var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange');\n        var r = this.pointSize + this.blurSize;\n\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\n            // calculate alpha using value\n            var alpha = normalize(value);\n\n            // draw with the circle brush with alpha\n            ctx.globalAlpha = alpha;\n            ctx.drawImage(brush, x - r, y - r);\n        }\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\n        // colorize the canvas using alpha value and set with gradient\n        var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\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\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            }\n            else {\n                offset += 4;\n            }\n        }\n        ctx.putImageData(imageData, 0, 0);\n\n        return canvas;\n    },\n\n    /**\n     * get canvas of a black circle brush used for canvas to draw later\n     * @private\n     * @returns {Object} circle brush canvas\n     */\n    _getBrush: function () {\n        var brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.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\n        var ctx = brushCanvas.getContext('2d');\n        ctx.clearRect(0, 0, d, d);\n\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 = '#000';\n\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    /**\n     * get gradient color map\n     * @private\n     */\n    _getGradient: function (data, 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};\n\nexport default Heatmap;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as graphic from '../../util/graphic';\nimport HeatmapLayer from './HeatmapLayer';\nimport * as zrUtil from 'zrender/src/core/util';\n\nfunction getIsInPiecewiseRange(dataExtent, pieceList, selected) {\n    var dataSpan = dataExtent[1] - dataExtent[0];\n    pieceList = zrUtil.map(pieceList, function (piece) {\n        return {\n            interval: [\n                (piece.interval[0] - dataExtent[0]) / dataSpan,\n                (piece.interval[1] - dataExtent[0]) / dataSpan\n            ]\n        };\n    });\n    var len = pieceList.length;\n    var lastIndex = 0;\n\n    return function (val) {\n        // Try to find in the location of the last found\n        for (var 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) { // Not found, back interation\n            for (var 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}\n\nfunction getIsInContinuousRange(dataExtent, range) {\n    var dataSpan = dataExtent[1] - dataExtent[0];\n    range = [\n        (range[0] - dataExtent[0]) / dataSpan,\n        (range[1] - dataExtent[0]) / dataSpan\n    ];\n    return function (val) {\n        return val >= range[0] && val <= range[1];\n    };\n}\n\nfunction isGeoCoordSys(coordSys) {\n    var dimensions = coordSys.dimensions;\n    // Not use coorSys.type === 'geo' because coordSys maybe extended\n    return dimensions[0] === 'lng' && dimensions[1] === 'lat';\n}\n\nexport default echarts.extendChartView({\n\n    type: 'heatmap',\n\n    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\n        if (__DEV__) {\n            if (!visualMapOfThisSeries) {\n                throw new Error('Heatmap must use with visualMap');\n            }\n        }\n\n        this.group.removeAll();\n\n        this._incrementalDisplayable = null;\n\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') {\n            this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count());\n        }\n        else if (isGeoCoordSys(coordSys)) {\n            this._renderOnGeo(\n                coordSys, seriesModel, visualMapOfThisSeries, api\n            );\n        }\n    },\n\n    incrementalPrepareRender: function (seriesModel, ecModel, api) {\n        this.group.removeAll();\n    },\n\n    incrementalRender: function (params, seriesModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        if (coordSys) {\n            this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true);\n        }\n    },\n\n    _renderOnCartesianAndCalendar: function (seriesModel, api, start, end, incremental) {\n\n        var coordSys = seriesModel.coordinateSystem;\n        var width;\n        var height;\n\n        if (coordSys.type === 'cartesian2d') {\n            var xAxis = coordSys.getAxis('x');\n            var yAxis = coordSys.getAxis('y');\n\n            if (__DEV__) {\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\n            width = xAxis.getBandWidth();\n            height = yAxis.getBandWidth();\n        }\n\n        var group = this.group;\n        var data = seriesModel.getData();\n\n        var itemStyleQuery = 'itemStyle';\n        var hoverItemStyleQuery = 'emphasis.itemStyle';\n        var labelQuery = 'label';\n        var hoverLabelQuery = 'emphasis.label';\n        var style = seriesModel.getModel(itemStyleQuery).getItemStyle(['color']);\n        var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle();\n        var labelModel = seriesModel.getModel(labelQuery);\n        var hoverLabelModel = seriesModel.getModel(hoverLabelQuery);\n        var coordSysType = coordSys.type;\n\n\n        var dataDims = coordSysType === 'cartesian2d'\n            ? [\n                data.mapDimension('x'),\n                data.mapDimension('y'),\n                data.mapDimension('value')\n            ]\n            : [\n                data.mapDimension('time'),\n                data.mapDimension('value')\n            ];\n\n        for (var idx = start; idx < end; idx++) {\n            var rect;\n\n            if (coordSysType === 'cartesian2d') {\n                // Ignore empty data\n                if (isNaN(data.get(dataDims[2], idx))) {\n                    continue;\n                }\n\n                var point = coordSys.dataToPoint([\n                    data.get(dataDims[0], idx),\n                    data.get(dataDims[1], idx)\n                ]);\n\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: {\n                        fill: data.getItemVisual(idx, 'color'),\n                        opacity: data.getItemVisual(idx, 'opacity')\n                    }\n                });\n            }\n            else {\n                // Ignore empty data\n                if (isNaN(data.get(dataDims[1], idx))) {\n                    continue;\n                }\n\n                rect = new graphic.Rect({\n                    z2: 1,\n                    shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape,\n                    style: {\n                        fill: data.getItemVisual(idx, 'color'),\n                        opacity: data.getItemVisual(idx, 'opacity')\n                    }\n                });\n            }\n\n            var itemModel = data.getItemModel(idx);\n\n            // Optimization for large datset\n            if (data.hasItemOption) {\n                style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);\n                hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();\n                labelModel = itemModel.getModel(labelQuery);\n                hoverLabelModel = itemModel.getModel(hoverLabelQuery);\n            }\n\n            var rawValue = seriesModel.getRawValue(idx);\n            var defaultText = '-';\n            if (rawValue && rawValue[2] != null) {\n                defaultText = rawValue[2];\n            }\n\n            graphic.setLabelStyle(\n                style, hoverStl, labelModel, hoverLabelModel,\n                {\n                    labelFetcher: seriesModel,\n                    labelDataIndex: idx,\n                    defaultText: defaultText,\n                    isRectText: true\n                }\n            );\n\n            rect.setStyle(style);\n            graphic.setHoverStyle(rect, data.hasItemOption ? hoverStl : zrUtil.extend({}, hoverStl));\n\n            rect.incremental = incremental;\n            // PENDING\n            if (incremental) {\n                // Rect must use hover layer if it's incremental.\n                rect.useHoverLayer = true;\n            }\n\n            group.add(rect);\n            data.setItemGraphicEl(idx, rect);\n        }\n    },\n\n    _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\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\n        var rect = geo.getViewRect().clone();\n        var roamTransform = geo.getRoamTransform();\n        rect.applyTransform(roamTransform);\n\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\n        var dims = [\n            data.mapDimension('lng'),\n            data.mapDimension('lat'),\n            data.mapDimension('value')\n        ];\n\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\n        var dataExtent = visualMapModel.getExtent();\n        var isInRange = visualMapModel.type === 'visualMap.continuous'\n            ? getIsInContinuousRange(dataExtent, visualMapModel.option.range)\n            : getIsInPiecewiseRange(\n                dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected\n            );\n\n        hmLayer.update(\n            points, width, height,\n            inRangeVisuals.color.getNormalizer(),\n            {\n                inRange: inRangeVisuals.color.getColorMapper(),\n                outOfRange: outOfRangeVisuals.color.getColorMapper()\n            },\n            isInRange\n        );\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\n    dispose: function () {}\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport './heatmap/HeatmapSeries';\nimport './heatmap/HeatmapView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport BaseBarSeries from './BaseBarSeries';\n\nvar PictorialBarSeries = BaseBarSeries.extend({\n\n    type: 'series.pictorialBar',\n\n    dependencies: ['grid'],\n\n    defaultOption: {\n        symbol: 'circle',     // Customized bar shape\n        symbolSize: null,     // Can be ['100%', '100%'], null means auto.\n        symbolRotate: null,\n\n        symbolPosition: null, // 'start' or 'end' or 'center', null means auto.\n        symbolOffset: null,\n        symbolMargin: null,   // start margin and end margin. Can be a number or a percent string.\n                                // Auto margin by defualt.\n        symbolRepeat: false,  // false/null/undefined, means no repeat.\n                                // Can be true, means auto calculate repeat times and cut by data.\n                                // Can be a number, specifies repeat times, and do not cut by data.\n                                // Can be 'fixed', means auto calculate repeat times but do not cut by data.\n        symbolRepeatDirection: 'end', // 'end' means from 'start' to 'end'.\n\n        symbolClip: false,\n        symbolBoundingData: null, // Can be 60 or -40 or [-40, 60]\n        symbolPatternSize: 400, // 400 * 400 px\n\n        barGap: '-100%',      // In most case, overlap is needed.\n\n        // z can be set in data item, which is z2 actually.\n\n        // Disable progressive\n        progressive: 0,\n        hoverAnimation: false // Open only when needed.\n    },\n\n    getInitialData: function (option) {\n        // Disable stack.\n        option.stack = null;\n        return PictorialBarSeries.superApply(this, 'getInitialData', arguments);\n    }\n});\n\nexport default PictorialBarSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport {createSymbol} from '../../util/symbol';\nimport {parsePercent, isNumeric} from '../../util/number';\nimport {setLabel} from './helper';\n\n\nvar BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth'];\n\n// index: +isHorizontal\nvar LAYOUT_ATTRS = [\n    {xy: 'x', wh: 'width', index: 0, posDesc: ['left', 'right']},\n    {xy: 'y', wh: 'height', index: 1, posDesc: ['top', 'bottom']}\n];\n\nvar pathForLineWidth = new graphic.Circle();\n\nvar BarView = echarts.extendChartView({\n\n    type: 'pictorialBar',\n\n    render: function (seriesModel, ecModel, api) {\n        var group = this.group;\n        var data = seriesModel.getData();\n        var oldData = this._data;\n\n        var cartesian = seriesModel.coordinateSystem;\n        var baseAxis = cartesian.getBaseAxis();\n        var isHorizontal = !!baseAxis.isHorizontal();\n        var coordSysRect = cartesian.grid.getRect();\n\n        var opt = {\n            ecSize: {width: api.getWidth(), height: api.getHeight()},\n            seriesModel: seriesModel,\n            coordSys: cartesian,\n            coordSysExtent: [\n                [coordSysRect.x, coordSysRect.x + coordSysRect.width],\n                [coordSysRect.y, coordSysRect.y + coordSysRect.height]\n            ],\n            isHorizontal: isHorizontal,\n            valueDim: LAYOUT_ATTRS[+isHorizontal],\n            categoryDim: LAYOUT_ATTRS[1 - isHorizontal]\n        };\n\n        data.diff(oldData)\n            .add(function (dataIndex) {\n                if (!data.hasValue(dataIndex)) {\n                    return;\n                }\n\n                var itemModel = getItemModel(data, dataIndex);\n                var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);\n\n                var bar = createBar(data, opt, symbolMeta);\n\n                data.setItemGraphicEl(dataIndex, bar);\n                group.add(bar);\n\n                updateCommon(bar, opt, symbolMeta);\n            })\n            .update(function (newIndex, oldIndex) {\n                var bar = oldData.getItemGraphicEl(oldIndex);\n\n                if (!data.hasValue(newIndex)) {\n                    group.remove(bar);\n                    return;\n                }\n\n                var itemModel = getItemModel(data, newIndex);\n                var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);\n\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\n                if (bar) {\n                    updateBar(bar, opt, symbolMeta);\n                }\n                else {\n                    bar = createBar(data, opt, symbolMeta, true);\n                }\n\n                data.setItemGraphicEl(newIndex, bar);\n                bar.__pictorialSymbolMeta = symbolMeta;\n                // Add back\n                group.add(bar);\n\n                updateCommon(bar, opt, symbolMeta);\n            })\n            .remove(function (dataIndex) {\n                var bar = oldData.getItemGraphicEl(dataIndex);\n                bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar);\n            })\n            .execute();\n\n        this._data = data;\n\n        return this.group;\n    },\n\n    dispose: zrUtil.noop,\n\n    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, bar.dataIndex, ecModel, bar);\n                });\n            }\n        }\n        else {\n            group.removeAll();\n        }\n    }\n});\n\n\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\n    var symbolMeta = {\n        dataIndex: dataIndex,\n        layout: layout,\n        itemModel: itemModel,\n        symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle',\n        color: data.getItemVisual(dataIndex, 'color'),\n        symbolClip: symbolClip,\n        symbolRepeat: symbolRepeat,\n        symbolRepeatDirection: itemModel.get('symbolRepeatDirection'),\n        symbolPatternSize: symbolPatternSize,\n        rotation: rotation,\n        animationModel: isAnimationEnabled ? itemModel : null,\n        hoverAnimation: isAnimationEnabled && itemModel.get('hoverAnimation'),\n        z2: itemModel.getShallow('z', true) || 0\n    };\n\n    prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta);\n\n    prepareSymbolSize(\n        data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength,\n        symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta\n    );\n\n    prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);\n\n    var symbolSize = symbolMeta.symbolSize;\n    var symbolOffset = itemModel.get('symbolOffset');\n    if (zrUtil.isArray(symbolOffset)) {\n        symbolOffset = [\n            parsePercent(symbolOffset[0], symbolSize[0]),\n            parsePercent(symbolOffset[1], symbolSize[1])\n        ];\n    }\n\n    prepareLayoutInfo(\n        itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset,\n        symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength,\n        opt, symbolMeta\n    );\n\n    return symbolMeta;\n}\n\n// bar length can be negative.\nfunction prepareBarLength(itemModel, symbolRepeat, layout, opt, output) {\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\n    if (zrUtil.isArray(symbolBoundingData)) {\n        var symbolBoundingExtent = [\n            convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx,\n            convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx\n        ];\n        symbolBoundingExtent[1] < symbolBoundingExtent[0] && (symbolBoundingExtent.reverse());\n        boundingLength = symbolBoundingExtent[pxSignIdx];\n    }\n    else if (symbolBoundingData != null) {\n        boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx;\n    }\n    else if (symbolRepeat) {\n        boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx;\n    }\n    else {\n        boundingLength = layout[valueDim.wh];\n    }\n\n    output.boundingLength = boundingLength;\n\n    if (symbolRepeat) {\n        output.repeatCutLength = layout[valueDim.wh];\n    }\n\n    output.pxSign = boundingLength > 0 ? 1 : boundingLength < 0 ? -1 : 0;\n}\n\nfunction convertToCoordOnAxis(axis, value) {\n    return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value)));\n}\n\n// Support ['100%', '100%']\nfunction prepareSymbolSize(\n    data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength,\n    pxSign, symbolPatternSize, opt, output\n) {\n    var valueDim = opt.valueDim;\n    var categoryDim = opt.categoryDim;\n    var categorySize = Math.abs(layout[categoryDim.wh]);\n\n    var symbolSize = data.getItemVisual(dataIndex, 'symbolSize');\n    if (zrUtil.isArray(symbolSize)) {\n        symbolSize = symbolSize.slice();\n    }\n    else {\n        if (symbolSize == null) {\n            symbolSize = '100%';\n        }\n        symbolSize = [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\n    symbolSize[categoryDim.index] = parsePercent(\n        symbolSize[categoryDim.index],\n        categorySize\n    );\n    symbolSize[valueDim.index] = parsePercent(\n        symbolSize[valueDim.index],\n        symbolRepeat ? categorySize : Math.abs(boundingLength)\n    );\n\n    output.symbolSize = symbolSize;\n\n    // If x or y is less than zero, show reversed shape.\n    var symbolScale = output.symbolScale = [\n        symbolSize[0] / symbolPatternSize,\n        symbolSize[1] / symbolPatternSize\n    ];\n    // Follow convention, 'right' and 'top' is the normal scale.\n    symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign;\n}\n\nfunction prepareLineWidth(itemModel, symbolScale, rotation, opt, output) {\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\n    if (valueLineWidth) {\n        pathForLineWidth.attr({\n            scale: symbolScale.slice(),\n            rotation: rotation\n        });\n        pathForLineWidth.updateTransform();\n        valueLineWidth /= pathForLineWidth.getLineScale();\n        valueLineWidth *= symbolScale[opt.valueDim.index];\n    }\n\n    output.valueLineWidth = valueLineWidth;\n}\n\nfunction prepareLayoutInfo(\n    itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset,\n    symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, output\n) {\n    var categoryDim = opt.categoryDim;\n    var valueDim = opt.valueDim;\n    var pxSign = output.pxSign;\n\n    var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);\n    var pathLen = unitLength;\n\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\n    if (symbolRepeat) {\n        var absBoundingLength = Math.abs(boundingLength);\n\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        symbolMargin = parsePercent(symbolMargin, symbolSize[valueDim.index]);\n\n        var uLenWithMargin = Math.max(unitLength + symbolMargin * 2, 0);\n\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 : symbolMargin * 2;\n\n        // Both final repeatTimes and final symbolMargin area calculated based on\n        // boundingLength.\n        var repeatSpecified = isNumeric(symbolRepeat);\n        var repeatTimes = repeatSpecified\n            ? symbolRepeat\n            : toIntTimes((absBoundingLength + endFix) / uLenWithMargin);\n\n        // Adjust calculate margin, to ensure each symbol is displayed\n        // entirely in the given layout area.\n        var mDiff = absBoundingLength - repeatTimes * unitLength;\n        symbolMargin = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1);\n        uLenWithMargin = unitLength + symbolMargin * 2;\n        endFix = hasEndGap ? 0 : symbolMargin * 2;\n\n        // Update repeatTimes when not all symbol will be shown.\n        if (!repeatSpecified && symbolRepeat !== 'fixed') {\n            repeatTimes = repeatCutLength\n                ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin)\n                : 0;\n        }\n\n        pathLen = repeatTimes * uLenWithMargin - endFix;\n        output.repeatTimes = repeatTimes;\n        output.symbolMargin = symbolMargin;\n    }\n\n    var sizeFix = pxSign * (pathLen / 2);\n    var pathPosition = output.pathPosition = [];\n    pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;\n    pathPosition[valueDim.index] = symbolPosition === 'start'\n        ? sizeFix\n        : symbolPosition === 'end'\n        ? boundingLength - sizeFix\n        : boundingLength / 2; // 'center'\n    if (symbolOffset) {\n        pathPosition[0] += symbolOffset[0];\n        pathPosition[1] += symbolOffset[1];\n    }\n\n    var bundlePosition = output.bundlePosition = [];\n    bundlePosition[categoryDim.index] = layout[categoryDim.xy];\n    bundlePosition[valueDim.index] = layout[valueDim.xy];\n\n    var barRectShape = output.barRectShape = zrUtil.extend({}, layout);\n    barRectShape[valueDim.wh] = pxSign * Math.max(\n        Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)\n    );\n    barRectShape[categoryDim.wh] = layout[categoryDim.wh];\n\n    var clipShape = output.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}\n\nfunction createPath(symbolMeta) {\n    var symbolPatternSize = symbolMeta.symbolPatternSize;\n    var path = createSymbol(\n        // Consider texture img, make a big size.\n        symbolMeta.symbolType,\n        -symbolPatternSize / 2,\n        -symbolPatternSize / 2,\n        symbolPatternSize,\n        symbolPatternSize,\n        symbolMeta.color\n    );\n    path.attr({\n        culling: true\n    });\n    path.type !== 'image' && path.setStyle({\n        strokeNoScale: true\n    });\n\n    return path;\n}\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\n    var index = 0;\n    var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;\n\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        }\n        else {\n            updateAttr(path, null, {scale: [0, 0]}, symbolMeta, isUpdate, function () {\n                bundle.remove(path);\n            });\n        }\n\n        updateHoverAnimation(path, symbolMeta);\n\n        index++;\n    });\n\n    for (; index < repeatTimes; index++) {\n        var path = createPath(symbolMeta);\n        path.__pictorialAnimationIndex = index;\n        path.__pictorialRepeatTimes = repeatTimes;\n        bundle.add(path);\n\n        var target = makeTarget(index);\n\n        updateAttr(\n            path,\n            {\n                position: target.position,\n                scale: [0, 0]\n            },\n            {\n                scale: target.scale,\n                rotation: target.rotation\n            },\n            symbolMeta,\n            isUpdate\n        );\n\n        // FIXME\n        // If all emphasis/normal through action.\n        path\n            .on('mouseover', onMouseOver)\n            .on('mouseout', onMouseOut);\n\n        updateHoverAnimation(path, symbolMeta);\n    }\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\n        return {\n            position: position,\n            scale: symbolMeta.symbolScale.slice(),\n            rotation: symbolMeta.rotation\n        };\n    }\n\n    function onMouseOver() {\n        eachPath(bar, function (path) {\n            path.trigger('emphasis');\n        });\n    }\n\n    function onMouseOut() {\n        eachPath(bar, function (path) {\n            path.trigger('normal');\n        });\n    }\n}\n\nfunction createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) {\n    var bundle = bar.__pictorialBundle;\n    var mainPath = bar.__pictorialMainPath;\n\n    if (!mainPath) {\n        mainPath = bar.__pictorialMainPath = createPath(symbolMeta);\n        bundle.add(mainPath);\n\n        updateAttr(\n            mainPath,\n            {\n                position: symbolMeta.pathPosition.slice(),\n                scale: [0, 0],\n                rotation: symbolMeta.rotation\n            },\n            {\n                scale: symbolMeta.symbolScale.slice()\n            },\n            symbolMeta,\n            isUpdate\n        );\n\n        mainPath\n            .on('mouseover', onMouseOver)\n            .on('mouseout', onMouseOut);\n    }\n    else {\n        updateAttr(\n            mainPath,\n            null,\n            {\n                position: symbolMeta.pathPosition.slice(),\n                scale: symbolMeta.symbolScale.slice(),\n                rotation: symbolMeta.rotation\n            },\n            symbolMeta,\n            isUpdate\n        );\n    }\n\n    updateHoverAnimation(mainPath, symbolMeta);\n\n    function onMouseOver() {\n        this.trigger('emphasis');\n    }\n\n    function onMouseOut() {\n        this.trigger('normal');\n    }\n}\n\n// bar rect is used for label.\nfunction createOrUpdateBarRect(bar, symbolMeta, isUpdate) {\n    var rectShape = zrUtil.extend({}, symbolMeta.barRectShape);\n\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\n        bar.add(barRect);\n    }\n    else {\n        updateAttr(barRect, null, {shape: rectShape}, symbolMeta, isUpdate);\n    }\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\n        if (clipPath) {\n            graphic.updateProps(\n                clipPath, {shape: clipShape}, animationModel, dataIndex\n            );\n        }\n        else {\n            clipShape[valueDim.wh] = 0;\n            clipPath = new graphic.Rect({shape: clipShape});\n            bar.__pictorialBundle.setClipPath(clipPath);\n            bar.__pictorialClipPath = clipPath;\n\n            var target = {};\n            target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];\n\n            graphic[isUpdate ? 'updateProps' : 'initProps'](\n                clipPath, {shape: target}, animationModel, dataIndex\n            );\n        }\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}\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}\n\nfunction isAnimationEnabled() {\n    // `animation` prop can be set on itemModel in pictorial bar chart.\n    return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation');\n}\n\nfunction updateHoverAnimation(path, symbolMeta) {\n    path.off('emphasis').off('normal');\n\n    var scale = symbolMeta.symbolScale.slice();\n\n    symbolMeta.hoverAnimation && path\n        .on('emphasis', function () {\n            this.animateTo({\n                scale: [scale[0] * 1.1, scale[1] * 1.1]\n            }, 400, 'elasticOut');\n        })\n        .on('normal', function () {\n            this.animateTo({\n                scale: scale.slice()\n            }, 400, 'elasticOut');\n        });\n}\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.attr('position', symbolMeta.bundlePosition.slice());\n\n    if (symbolMeta.symbolRepeat) {\n        createOrUpdateRepeatSymbols(bar, opt, symbolMeta);\n    }\n    else {\n        createOrUpdateSingleSymbol(bar, opt, symbolMeta);\n    }\n\n    createOrUpdateBarRect(bar, symbolMeta, isUpdate);\n\n    createOrUpdateClip(bar, opt, symbolMeta, isUpdate);\n\n    bar.__pictorialShapeStr = getShapeStr(data, symbolMeta);\n    bar.__pictorialSymbolMeta = symbolMeta;\n\n    return bar;\n}\n\nfunction updateBar(bar, opt, symbolMeta) {\n    var animationModel = symbolMeta.animationModel;\n    var dataIndex = symbolMeta.dataIndex;\n    var bundle = bar.__pictorialBundle;\n\n    graphic.updateProps(\n        bundle, {position: symbolMeta.bundlePosition.slice()}, animationModel, dataIndex\n    );\n\n    if (symbolMeta.symbolRepeat) {\n        createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true);\n    }\n    else {\n        createOrUpdateSingleSymbol(bar, opt, symbolMeta, true);\n    }\n\n    createOrUpdateBarRect(bar, symbolMeta, true);\n\n    createOrUpdateClip(bar, opt, symbolMeta, true);\n}\n\nfunction removeBar(data, dataIndex, animationModel, bar) {\n    // Not show text when animating\n    var labelRect = bar.__pictorialBarRect;\n    labelRect && (labelRect.style.text = null);\n\n    var pathes = [];\n    eachPath(bar, function (path) {\n        pathes.push(path);\n    });\n    bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath);\n\n    // I do not find proper remove animation for clip yet.\n    bar.__pictorialClipPath && (animationModel = null);\n\n    zrUtil.each(pathes, function (path) {\n        graphic.updateProps(\n            path, {scale: [0, 0]}, animationModel, dataIndex,\n            function () {\n                bar.parent && bar.parent.remove(bar);\n            }\n        );\n    });\n\n    data.setItemGraphicEl(dataIndex, null);\n}\n\nfunction getShapeStr(data, symbolMeta) {\n    return [\n        data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none',\n        !!symbolMeta.symbolRepeat,\n        !!symbolMeta.symbolClip\n    ].join(':');\n}\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}\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    }\n    else {\n        animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](\n            el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb\n        );\n    }\n}\n\nfunction updateCommon(bar, opt, symbolMeta) {\n    var color = symbolMeta.color;\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 normalStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);\n    var hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();\n    var cursorStyle = itemModel.getShallow('cursor');\n\n    eachPath(bar, function (path) {\n        // PENDING setColor should be before setStyle!!!\n        path.setColor(color);\n        path.setStyle(zrUtil.defaults(\n            {\n                fill: color,\n                opacity: symbolMeta.opacity\n            },\n            normalStyle\n        ));\n        graphic.setHoverStyle(path, hoverStyle);\n\n        cursorStyle && (path.cursor = cursorStyle);\n        path.z2 = symbolMeta.z2;\n    });\n\n    var barRectHoverStyle = {};\n    var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];\n    var barRect = bar.__pictorialBarRect;\n\n    setLabel(\n        barRect.style, barRectHoverStyle, itemModel,\n        color, opt.seriesModel, dataIndex, barPositionOutside\n    );\n\n    graphic.setHoverStyle(barRect, barRectHoverStyle);\n}\n\nfunction toIntTimes(times) {\n    var roundedTimes = Math.round(times);\n    // Escapse accurate error\n    return Math.abs(times - roundedTimes) < 1e-4\n        ? roundedTimes\n        : Math.ceil(times);\n}\n\nexport default BarView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nimport '../coord/cartesian/Grid';\nimport './bar/PictorialBarSeries';\nimport './bar/PictorialBarView';\n\nimport { layout } from '../layout/barGrid';\nimport visualSymbol from '../visual/symbol';\n\n// In case developer forget to include grid component\nimport '../component/gridSimple';\n\necharts.registerLayout(zrUtil.curry(\n    layout, 'pictorialBar'\n));\necharts.registerVisual(visualSymbol('pictorialBar', 'roundRect'));\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../Axis';\n\n/**\n * @constructor  module:echarts/coord/single/SingleAxis\n * @extends {module:echarts/coord/Axis}\n * @param {string} dim\n * @param {*} scale\n * @param {Array.<number>} coordExtent\n * @param {string} axisType\n * @param {string} position\n */\nvar SingleAxis = function (dim, scale, coordExtent, axisType, position) {\n\n    Axis.call(this, dim, scale, coordExtent);\n\n    /**\n     * Axis type\n     * - 'category'\n     * - 'value'\n     * - 'time'\n     * - 'log'\n     * @type {string}\n     */\n    this.type = axisType || 'value';\n\n    /**\n     * Axis position\n     *  - 'top'\n     *  - 'bottom'\n     *  - 'left'\n     *  - 'right'\n     *  @type {string}\n     */\n    this.position = position || 'bottom';\n\n    /**\n     * Axis orient\n     *  - 'horizontal'\n     *  - 'vertical'\n     * @type {[type]}\n     */\n    this.orient = null;\n\n};\n\nSingleAxis.prototype = {\n\n    constructor: SingleAxis,\n\n    /**\n     * Axis model\n     * @type {module:echarts/coord/single/AxisModel}\n     */\n    model: null,\n\n    /**\n     * Judge the orient of the axis.\n     * @return {boolean}\n     */\n    isHorizontal: function () {\n        var position = this.position;\n        return position === 'top' || position === 'bottom';\n\n    },\n\n    /**\n     * @override\n     */\n    pointToData: function (point, clamp) {\n        return this.coordinateSystem.pointToData(point, clamp)[0];\n    },\n\n    /**\n     * Convert the local coord(processed by dataToCoord())\n     * to global coord(concrete pixel coord).\n     * designated by module:echarts/coord/single/Single.\n     * @type {Function}\n     */\n    toGlobalCoord: null,\n\n    /**\n     * Convert the global coord to local coord.\n     * designated by module:echarts/coord/single/Single.\n     * @type {Function}\n     */\n    toLocalCoord: null\n\n};\n\nzrUtil.inherits(SingleAxis, Axis);\n\nexport default SingleAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Single coordinates system.\n */\n\nimport SingleAxis from './SingleAxis';\nimport * as axisHelper from '../axisHelper';\nimport {getLayoutRect} from '../../util/layout';\nimport {each} from 'zrender/src/core/util';\n\n/**\n * Create a single coordinates system.\n *\n * @param {module:echarts/coord/single/AxisModel} axisModel\n * @param {module:echarts/model/Global} ecModel\n * @param {module:echarts/ExtensionAPI} api\n */\nfunction Single(axisModel, ecModel, api) {\n\n    /**\n     * @type {string}\n     * @readOnly\n     */\n    this.dimension = 'single';\n\n    /**\n     * Add it just for draw tooltip.\n     *\n     * @type {Array.<string>}\n     * @readOnly\n     */\n    this.dimensions = ['single'];\n\n    /**\n     * @private\n     * @type {module:echarts/coord/single/SingleAxis}.\n     */\n    this._axis = null;\n\n    /**\n     * @private\n     * @type {module:zrender/core/BoundingRect}\n     */\n    this._rect;\n\n    this._init(axisModel, ecModel, api);\n\n    /**\n     * @type {module:echarts/coord/single/AxisModel}\n     */\n    this.model = axisModel;\n}\n\nSingle.prototype = {\n\n    type: 'singleAxis',\n\n    axisPointerEnabled: true,\n\n    constructor: Single,\n\n    /**\n     * Initialize single coordinate system.\n     *\n     * @param  {module:echarts/coord/single/AxisModel} axisModel\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     * @private\n     */\n    _init: function (axisModel, ecModel, api) {\n\n        var dim = this.dimension;\n\n        var axis = new SingleAxis(\n            dim,\n            axisHelper.createScaleByModel(axisModel),\n            [0, 0],\n            axisModel.get('type'),\n            axisModel.get('position')\n        );\n\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\n        axisModel.axis = axis;\n        axis.model = axisModel;\n        axis.coordinateSystem = this;\n        this._axis = axis;\n    },\n\n    /**\n     * Update axis scale after data processed\n     * @param  {module:echarts/model/Global} ecModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    update: function (ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n            if (seriesModel.coordinateSystem === this) {\n                var data = seriesModel.getData();\n                each(data.mapDimension(this.dimension, true), function (dim) {\n                    this._axis.scale.unionExtentFromData(data, dim);\n                }, this);\n                axisHelper.niceScaleExtent(this._axis.scale, this._axis.model);\n            }\n        }, this);\n    },\n\n    /**\n     * Resize the single coordinate system.\n     *\n     * @param  {module:echarts/coord/single/AxisModel} axisModel\n     * @param  {module:echarts/ExtensionAPI} api\n     */\n    resize: function (axisModel, api) {\n        this._rect = getLayoutRect(\n            {\n                left: axisModel.get('left'),\n                top: axisModel.get('top'),\n                right: axisModel.get('right'),\n                bottom: axisModel.get('bottom'),\n                width: axisModel.get('width'),\n                height: axisModel.get('height')\n            },\n            {\n                width: api.getWidth(),\n                height: api.getHeight()\n            }\n        );\n\n        this._adjustAxis();\n    },\n\n    /**\n     * @return {module:zrender/core/BoundingRect}\n     */\n    getRect: function () {\n        return this._rect;\n    },\n\n    /**\n     * @private\n     */\n    _adjustAxis: function () {\n\n        var rect = this._rect;\n        var axis = this._axis;\n\n        var isHorizontal = axis.isHorizontal();\n        var extent = isHorizontal ? [0, rect.width] : [0, rect.height];\n        var idx = axis.reverse ? 1 : 0;\n\n        axis.setExtent(extent[idx], extent[1 - idx]);\n\n        this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y);\n\n    },\n\n    /**\n     * @param  {module:echarts/coord/single/SingleAxis} axis\n     * @param  {number} coordBase\n     */\n    _updateAxisTransform: function (axis, coordBase) {\n\n        var axisExtent = axis.getExtent();\n        var extentSum = axisExtent[0] + axisExtent[1];\n        var isHorizontal = axis.isHorizontal();\n\n        axis.toGlobalCoord = isHorizontal\n            ? function (coord) {\n                return coord + coordBase;\n            }\n            : function (coord) {\n                return extentSum - coord + coordBase;\n            };\n\n        axis.toLocalCoord = isHorizontal\n            ? function (coord) {\n                return coord - coordBase;\n            }\n            : function (coord) {\n                return extentSum - coord + coordBase;\n            };\n    },\n\n    /**\n     * Get axis.\n     *\n     * @return {module:echarts/coord/single/SingleAxis}\n     */\n    getAxis: function () {\n        return this._axis;\n    },\n\n    /**\n     * Get axis, add it just for draw tooltip.\n     *\n     * @return {[type]} [description]\n     */\n    getBaseAxis: function () {\n        return this._axis;\n    },\n\n    /**\n     * @return {Array.<module:echarts/coord/Axis>}\n     */\n    getAxes: function () {\n        return [this._axis];\n    },\n\n    /**\n     * @return {Object} {baseAxes: [], otherAxes: []}\n     */\n    getTooltipAxes: function () {\n        return {baseAxes: [this.getAxis()]};\n    },\n\n    /**\n     * If contain point.\n     *\n     * @param  {Array.<number>} point\n     * @return {boolean}\n     */\n    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]))\n            && (point[1] >= rect.y && point[1] <= (rect.y + rect.height));\n        }\n        else {\n            return axis.contain(axis.toLocalCoord(point[1]))\n            && (point[0] >= rect.y && point[0] <= (rect.y + rect.height));\n        }\n    },\n\n    /**\n     * @param {Array.<number>} point\n     * @return {Array.<number>}\n     */\n    pointToData: function (point) {\n        var axis = this.getAxis();\n        return [axis.coordToData(axis.toLocalCoord(\n            point[axis.orient === 'horizontal' ? 0 : 1]\n        ))];\n    },\n\n    /**\n     * Convert the series data to concrete point.\n     *\n     * @param  {number|Array.<number>} val\n     * @return {Array.<number>}\n     */\n    dataToPoint: function (val) {\n        var axis = this.getAxis();\n        var rect = this.getRect();\n        var pt = [];\n        var idx = axis.orient === 'horizontal' ? 0 : 1;\n\n        if (val instanceof Array) {\n            val = val[0];\n        }\n\n        pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val));\n        pt[1 - idx] = idx === 0 ? (rect.y + rect.height / 2) : (rect.x + rect.width / 2);\n        return pt;\n    }\n\n};\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 * Single coordinate system creator.\n */\n\nimport Single from './Single';\nimport CoordinateSystem from '../../CoordinateSystem';\n\n/**\n * Create single coordinate system and inject it into seriesModel.\n *\n * @param {module:echarts/model/Global} ecModel\n * @param {module:echarts/ExtensionAPI} api\n * @return {Array.<module:echarts/coord/single/Single>}\n */\nfunction create(ecModel, api) {\n    var singles = [];\n\n    ecModel.eachComponent('singleAxis', function (axisModel, idx) {\n\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    });\n\n    ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.get('coordinateSystem') === 'singleAxis') {\n            var singleAxisModel = ecModel.queryComponents({\n                mainType: 'singleAxis',\n                index: seriesModel.get('singleAxisIndex'),\n                id: seriesModel.get('singleAxisId')\n            })[0];\n            seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem;\n        }\n    });\n\n    return singles;\n}\n\nCoordinateSystem.register('single', {\n    create: create,\n    dimensions: Single.prototype.dimensions\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\n/**\n * @param {Object} opt {labelInside}\n * @return {Object} {\n *  position, rotation, labelDirection, labelOffset,\n *  tickDirection, labelRotate, z2\n * }\n */\nexport function layout(axisModel, opt) {\n    opt = opt || {};\n    var single = axisModel.coordinateSystem;\n    var axis = axisModel.axis;\n    var layout = {};\n\n    var axisPosition = axis.position;\n    var orient = axis.orient;\n\n    var rect = single.getRect();\n    var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n\n    var positionMap = {\n        horizontal: {top: rectBound[2], bottom: rectBound[3]},\n        vertical: {left: rectBound[0], right: rectBound[1]}\n    };\n\n    layout.position = [\n        orient === 'vertical'\n            ? positionMap.vertical[axisPosition]\n            : rectBound[0],\n        orient === 'horizontal'\n            ? positionMap.horizontal[axisPosition]\n            : rectBound[3]\n    ];\n\n    var r = {horizontal: 0, vertical: 1};\n    layout.rotation = Math.PI / 2 * r[orient];\n\n    var directionMap = {top: -1, bottom: 1, right: 1, left: -1};\n\n    layout.labelDirection = layout.tickDirection\n        = layout.nameDirection\n        = directionMap[axisPosition];\n\n    if (axisModel.get('axisTick.inside')) {\n        layout.tickDirection = -layout.tickDirection;\n    }\n\n    if (zrUtil.retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) {\n        layout.labelDirection = -layout.labelDirection;\n    }\n\n    var labelRotation = opt.rotate;\n    labelRotation == null && (labelRotation = axisModel.get('axisLabel.rotate'));\n    layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;\n\n    layout.z2 = 1;\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport AxisBuilder from './AxisBuilder';\nimport * as graphic from '../../util/graphic';\nimport * as singleAxisHelper from '../../coord/single/singleAxisHelper';\nimport AxisView from './AxisView';\n\nvar axisBuilderAttrs = [\n    'axisLine', 'axisTickLabel', 'axisName'\n];\n\nvar selfBuilderAttr = 'splitLine';\n\nvar SingleAxisView = AxisView.extend({\n\n    type: 'singleAxis',\n\n    axisPointerClass: 'SingleAxisPointer',\n\n    render: function (axisModel, ecModel, api, payload) {\n\n        var group = this.group;\n\n        group.removeAll();\n\n        var layout = singleAxisHelper.layout(axisModel);\n\n        var axisBuilder = new AxisBuilder(axisModel, layout);\n\n        zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\n        group.add(axisBuilder.getGroup());\n\n        if (axisModel.get(selfBuilderAttr + '.show')) {\n            this['_' + selfBuilderAttr](axisModel);\n        }\n\n        SingleAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);\n    },\n\n    _splitLine: function (axisModel) {\n        var axis = axisModel.axis;\n\n        if (axis.scale.isBlank()) {\n            return;\n        }\n\n        var splitLineModel = axisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineWidth = lineStyleModel.get('width');\n        var lineColors = lineStyleModel.get('color');\n\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\n        var gridRect = axisModel.coordinateSystem.getRect();\n        var isHorizontal = axis.isHorizontal();\n\n        var splitLines = [];\n        var lineCount = 0;\n\n        var ticksCoords = axis.getTicksCoords({\n            tickModel: splitLineModel\n        });\n\n        var p1 = [];\n        var p2 = [];\n\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            }\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            splitLines[colorIndex] = splitLines[colorIndex] || [];\n            splitLines[colorIndex].push(new graphic.Line({\n                subPixelOptimize: true,\n                shape: {\n                    x1: p1[0],\n                    y1: p1[1],\n                    x2: p2[0],\n                    y2: p2[1]\n                },\n                style: {\n                    lineWidth: lineWidth\n                },\n                silent: true\n            }));\n        }\n\n        for (var i = 0; i < splitLines.length; ++i) {\n            this.group.add(graphic.mergePath(splitLines[i], {\n                style: {\n                    stroke: lineColors[i % lineColors.length],\n                    lineDash: lineStyleModel.getLineDash(lineWidth),\n                    lineWidth: lineWidth\n                },\n                silent: true\n            }));\n        }\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport axisModelCreator from '../axisModelCreator';\nimport axisModelCommonMixin from '../axisModelCommonMixin';\n\nvar AxisModel = ComponentModel.extend({\n\n    type: 'singleAxis',\n\n    layoutMode: 'box',\n\n    /**\n     * @type {module:echarts/coord/single/SingleAxis}\n     */\n    axis: null,\n\n    /**\n     * @type {module:echarts/coord/single/Single}\n     */\n    coordinateSystem: null,\n\n    /**\n     * @override\n     */\n    getCoordSysModel: function () {\n        return this;\n    }\n\n});\n\nvar defaultOption = {\n\n    left: '5%',\n    top: '5%',\n    right: '5%',\n    bottom: '5%',\n\n    type: 'value',\n\n    position: 'bottom',\n\n    orient: 'horizontal',\n\n    axisLine: {\n        show: true,\n        lineStyle: {\n            width: 1,\n            type: 'solid'\n        }\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\n    axisTick: {\n        show: true,\n        length: 6,\n        lineStyle: {\n            width: 1\n        }\n    },\n\n    axisLabel: {\n        show: true,\n        interval: 'auto'\n    },\n\n    splitLine: {\n        show: true,\n        lineStyle: {\n            type: 'dashed',\n            opacity: 0.2\n        }\n    }\n};\n\nfunction getAxisType(axisName, option) {\n    return option.type || (option.data ? 'category' : 'value');\n}\n\nzrUtil.merge(AxisModel.prototype, axisModelCommonMixin);\n\naxisModelCreator('single', AxisModel, getAxisType, defaultOption);\n\nexport default AxisModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../../util/model';\n\n/**\n * @param {Object} finder contains {seriesIndex, dataIndex, dataIndexInside}\n * @param {module:echarts/model/Global} ecModel\n * @return {Object} {point: [x, y], el: ...} point Will not be null.\n */\nexport default function (finder, ecModel) {\n    var point = [];\n    var seriesIndex = finder.seriesIndex;\n    var seriesModel;\n    if (seriesIndex == null || !(\n        seriesModel = ecModel.getSeriesByIndex(seriesIndex)\n    )) {\n        return {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 {point: []};\n    }\n\n    var el = data.getItemGraphicEl(dataIndex);\n    var coordSys = seriesModel.coordinateSystem;\n\n    if (seriesModel.getTooltipPosition) {\n        point = seriesModel.getTooltipPosition(dataIndex) || [];\n    }\n    else if (coordSys && coordSys.dataToPoint) {\n        point = coordSys.dataToPoint(\n            data.getValues(\n                zrUtil.map(coordSys.dimensions, function (dim) {\n                    return data.mapDimension(dim);\n                }), dataIndex, true\n            )\n        ) || [];\n    }\n    else if (el) {\n        // Use graphic bounding rect\n        var rect = el.getBoundingRect().clone();\n        rect.applyTransform(el.transform);\n        point = [\n            rect.x + rect.width / 2,\n            rect.y + rect.height / 2\n        ];\n    }\n\n    return {point: point, el: el};\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {makeInner} from '../../util/model';\nimport * as modelHelper from './modelHelper';\nimport findPointFromSeries from './findPointFromSeries';\n\nvar each = zrUtil.each;\nvar curry = zrUtil.curry;\nvar inner = makeInner();\n\n/**\n * Basic logic: check all axis, if they do not demand show/highlight,\n * then hide/downplay them.\n *\n * @param {Object} coordSysAxesInfo\n * @param {Object} payload\n * @param {string} [payload.currTrigger] 'click' | 'mousemove' | 'leave'\n * @param {Array.<number>} [payload.x] x and y, which are mandatory, specify a point to\n *              trigger axisPointer and tooltip.\n * @param {Array.<number>} [payload.y] x and y, which are mandatory, specify a point to\n *              trigger axisPointer and tooltip.\n * @param {Object} [payload.seriesIndex] finder, optional, restrict target axes.\n * @param {Object} [payload.dataIndex] finder, restrict target axes.\n * @param {Object} [payload.axesInfo] finder, restrict target axes.\n *        [{\n *          axisDim: 'x'|'y'|'angle'|...,\n *          axisIndex: ...,\n *          value: ...\n *        }, ...]\n * @param {Function} [payload.dispatchAction]\n * @param {Object} [payload.tooltipOption]\n * @param {Object|Array.<number>|Function} [payload.position] Tooltip position,\n *        which can be specified in dispatchAction\n * @param {module:echarts/model/Global} ecModel\n * @param {module:echarts/ExtensionAPI} api\n * @return {Object} content of event obj for echarts.connect.\n */\nexport default function (payload, ecModel, api) {\n    var currTrigger = payload.currTrigger;\n    var point = [payload.x, payload.y];\n    var finder = payload;\n    var dispatchAction = payload.dispatchAction || zrUtil.bind(api.dispatchAction, api);\n    var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n\n    // Pending\n    // See #6121. But we are not able to reproduce it yet.\n    if (!coordSysAxesInfo) {\n        return;\n    }\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\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\n    var axesInfo = coordSysAxesInfo.axesInfo;\n    var shouldHide = currTrigger === 'leave' || illegalPoint(point);\n    var outputFinder = {};\n\n    var showValueMap = {};\n    var dataByCoordSys = {list: [], map: {}};\n    var updaters = {\n        showPointer: curry(showPointer, showValueMap),\n        showTooltip: curry(showTooltip, dataByCoordSys)\n    };\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\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, outputFinder);\n            }\n        });\n    });\n\n    // Process for linked axes.\n    var linkTriggers = {};\n    each(axesInfo, function (tarAxisInfo, tarKey) {\n        var linkGroup = tarAxisInfo.linkGroup;\n\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(\n                        val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)\n                    )));\n                    linkTriggers[tarAxisInfo.key] = val;\n                }\n            });\n        }\n    });\n    each(linkTriggers, function (val, tarKey) {\n        processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder);\n    });\n\n    updateModelActually(showValueMap, axesInfo, outputFinder);\n    dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction);\n    dispatchHighDownActually(axesInfo, dispatchAction, api);\n\n    return outputFinder;\n}\n\nfunction processOnAxis(axisInfo, newValue, updaters, dontSnap, outputFinder) {\n    var axis = axisInfo.axis;\n\n    if (axis.scale.isBlank() || !axis.containData(newValue)) {\n        return;\n    }\n\n    if (!axisInfo.involveSeries) {\n        updaters.showPointer(axisInfo, newValue);\n        return;\n    }\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\n    // Fill content of event obj for echarts.connect.\n    // By defualt use the first involved series data as a sample to connect.\n    if (payloadBatch[0] && outputFinder.seriesIndex == null) {\n        zrUtil.extend(outputFinder, payloadBatch[0]);\n    }\n\n    // If no linkSource input, this process is for collecting link\n    // target, where snap should not be accepted.\n    if (!dontSnap && axisInfo.snap) {\n        if (axis.containData(snapToValue) && snapToValue != null) {\n            newValue = snapToValue;\n        }\n    }\n\n    updaters.showPointer(axisInfo, newValue, payloadBatch, outputFinder);\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}\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\n    each(axisInfo.seriesModels, function (series, idx) {\n        var dataDim = series.getData().mapDimension(dim, true);\n        var seriesNestestValue;\n        var dataIndices;\n\n        if (series.getAxisTooltipData) {\n            var result = series.getAxisTooltipData(dataDim, value, axis);\n            dataIndices = result.dataIndices;\n            seriesNestestValue = result.nestestValue;\n        }\n        else {\n            dataIndices = series.getData().indicesOfNearest(\n                dataDim[0],\n                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            );\n            if (!dataIndices.length) {\n                return;\n            }\n            seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]);\n        }\n\n        if (seriesNestestValue == null || !isFinite(seriesNestestValue)) {\n            return;\n        }\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\n    return {\n        payloadBatch: payloadBatch,\n        snapToValue: snapToValue\n    };\n}\n\nfunction showPointer(showValueMap, axisInfo, value, payloadBatch) {\n    showValueMap[axisInfo.key] = {value: value, 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\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\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\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}\n\nfunction updateModelActually(showValueMap, axesInfo, outputFinder) {\n    var outputAxesInfo = outputFinder.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\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\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}\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({type: 'hideTip'});\n        return;\n    }\n\n    // In most case only one axis (or event one series is used). It is\n    // convinient to fetch payload.seriesIndex and payload.dataIndex\n    // dirtectly. 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\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}\n\nfunction dispatchHighDownActually(axesInfo, dispatchAction, api) {\n    // FIXME\n    // highlight status modification shoule be a stage of main process?\n    // (Consider confilct (e.g., legend and axisPointer) and setOption)\n\n    var zr = api.getZr();\n    var highDownKey = 'axisPointerLastHighlights';\n    var lastHighlights = inner(zr)[highDownKey] || {};\n    var newHighlights = inner(zr)[highDownKey] = {};\n\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' && each(option.seriesDataIndices, function (batchItem) {\n            var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;\n            newHighlights[key] = batchItem;\n        });\n    });\n\n    // Diff.\n    var toHighlight = [];\n    var toDownplay = [];\n    zrUtil.each(lastHighlights, function (batchItem, key) {\n        !newHighlights[key] && toDownplay.push(batchItem);\n    });\n    zrUtil.each(newHighlights, function (batchItem, key) {\n        !lastHighlights[key] && toHighlight.push(batchItem);\n    });\n\n    toDownplay.length && api.dispatchAction({\n        type: 'downplay', escapeConnect: true, batch: toDownplay\n    });\n    toHighlight.length && api.dispatchAction({\n        type: 'highlight', escapeConnect: true, batch: toHighlight\n    });\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\n            && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex\n        ) {\n            return inputAxisInfo;\n        }\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}\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\nimport * as echarts from '../../echarts';\n\nvar AxisPointerModel = echarts.extendComponentModel({\n\n    type: 'axisPointer',\n\n    coordSysAxesInfo: null,\n\n    defaultOption: {\n        // 'auto' means that show when triggered by tooltip or handle.\n        show: 'auto',\n        // 'click' | 'mousemove' | 'none'\n        triggerOn: null, // set default in AxisPonterView.js\n\n        zlevel: 0,\n        z: 50,\n\n        type: 'line', // 'line' 'shadow' 'cross' 'none'.\n        // axispointer triggered by tootip determine snap automatically,\n        // see `modelHelper`.\n        snap: false,\n        triggerTooltip: true,\n\n        value: null,\n        status: null, // Init value depends on whether handle is used.\n\n        // [group0, group1, ...]\n        // Each group can be: {\n        //      mapper: function () {},\n        //      singleTooltip: 'multiple',  // 'multiple' or 'single'\n        //      xAxisId: ...,\n        //      yAxisName: ...,\n        //      angleAxisIndex: ...\n        // }\n        // mapper: can be ignored.\n        //      input: {axisInfo, value}\n        //      output: {axisInfo, value}\n        link: [],\n\n        // Do not set 'auto' here, otherwise global animation: false\n        // will not effect at this axispointer.\n        animation: null,\n        animationDurationUpdate: 200,\n\n        lineStyle: {\n            color: '#aaa',\n            width: 1,\n            type: 'solid'\n        },\n\n        shadowStyle: {\n            color: 'rgba(150,150,150,0.3)'\n        },\n\n        label: {\n            show: true,\n            formatter: null, // string | Function\n            precision: 'auto', // Or a number like 0, 1, 2 ...\n            margin: 3,\n            color: '#fff',\n            padding: [5, 7, 5, 7],\n            backgroundColor: 'auto', // default: axis line color\n            borderColor: null,\n            borderWidth: 0,\n            shadowBlur: 3,\n            shadowColor: '#aaa'\n            // Considering applicability, common style should\n            // better not have shadowOffset.\n            // shadowOffsetX: 0,\n            // shadowOffsetY: 2\n        },\n\n        handle: {\n            show: false,\n            /* eslint-disable */\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', // jshint ignore:line\n            /* eslint-enable */\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: '#333',\n            shadowBlur: 3,\n            shadowColor: '#aaa',\n            shadowOffsetX: 0,\n            shadowOffsetY: 2,\n\n            // For mobile performance\n            throttle: 40\n        }\n    }\n\n});\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport {makeInner} from '../../util/model';\n\nvar inner = makeInner();\nvar each = zrUtil.each;\n\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\n    var zr = api.getZr();\n    inner(zr).records || (inner(zr).records = {});\n\n    initGlobalListeners(zr, api);\n\n    var record = inner(zr).records[key] || (inner(zr).records[key] = {});\n    record.handler = handler;\n}\n\nfunction initGlobalListeners(zr, api) {\n    if (inner(zr).initialized) {\n        return;\n    }\n\n    inner(zr).initialized = true;\n\n    useHandler('click', zrUtil.curry(doEnter, 'click'));\n    useHandler('mousemove', zrUtil.curry(doEnter, 'mousemove'));\n    // useHandler('mouseout', onLeave);\n    useHandler('globalout', onLeave);\n\n    function useHandler(eventType, cb) {\n        zr.on(eventType, function (e) {\n            var dis = makeDispatchAction(api);\n\n            each(inner(zr).records, function (record) {\n                record && cb(record, e, dis.dispatchAction);\n            });\n\n            dispatchTooltipFinally(dis.pendings, api);\n        });\n    }\n}\n\nfunction dispatchTooltipFinally(pendings, api) {\n    var showLen = pendings.showTip.length;\n    var hideLen = pendings.hideTip.length;\n\n    var actuallyPayload;\n    if (showLen) {\n        actuallyPayload = pendings.showTip[showLen - 1];\n    }\n    else if (hideLen) {\n        actuallyPayload = pendings.hideTip[hideLen - 1];\n    }\n    if (actuallyPayload) {\n        actuallyPayload.dispatchAction = null;\n        api.dispatchAction(actuallyPayload);\n    }\n}\n\nfunction onLeave(record, e, dispatchAction) {\n    record.handler('leave', null, dispatchAction);\n}\n\nfunction doEnter(currTrigger, record, e, dispatchAction) {\n    record.handler(currTrigger, e, dispatchAction);\n}\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        }\n        else {\n            payload.dispatchAction = dispatchAction;\n            api.dispatchAction(payload);\n        }\n    };\n\n    return {\n        dispatchAction: dispatchAction,\n        pendings: pendings\n    };\n}\n\n/**\n * @param {string} key\n * @param {module:echarts/ExtensionAPI} api\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\nimport * as echarts from '../../echarts';\nimport * as globalListener from './globalListener';\n\nvar AxisPointerView = echarts.extendComponentView({\n\n    type: 'axisPointer',\n\n    render: function (globalAxisPointerModel, ecModel, api) {\n        var globalTooltipModel = ecModel.getComponent('tooltip');\n        var triggerOn = globalAxisPointerModel.get('triggerOn')\n            || (globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click');\n\n        // Register global listener in AxisPointerView to enable\n        // AxisPointerView to be independent to Tooltip.\n        globalListener.register(\n            'axisPointer',\n            api,\n            function (currTrigger, e, dispatchAction) {\n                // If 'none', it is not controlled by mouse totally.\n                if (triggerOn !== 'none'\n                    && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)\n                ) {\n                    dispatchAction({\n                        type: 'updateAxisPointer',\n                        currTrigger: currTrigger,\n                        x: e && e.offsetX,\n                        y: e && e.offsetY\n                    });\n                }\n            }\n        );\n    },\n\n    /**\n     * @override\n     */\n    remove: function (ecModel, api) {\n        globalListener.unregister(api.getZr(), 'axisPointer');\n        AxisPointerView.superApply(this._model, 'remove', arguments);\n    },\n\n    /**\n     * @override\n     */\n    dispose: function (ecModel, api) {\n        globalListener.unregister('axisPointer', api);\n        AxisPointerView.superApply(this._model, 'dispose', arguments);\n    }\n\n});\n\nexport default AxisPointerView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as clazzUtil from '../../util/clazz';\nimport * as graphic from '../../util/graphic';\nimport * as axisPointerModelHelper from './modelHelper';\nimport * as eventTool from 'zrender/src/core/event';\nimport * as throttleUtil from '../../util/throttle';\nimport {makeInner} from '../../util/model';\n\nvar inner = makeInner();\nvar clone = zrUtil.clone;\nvar bind = zrUtil.bind;\n\n/**\n * Base axis pointer class in 2D.\n * Implemenents {module:echarts/component/axis/IAxisPointer}.\n */\nfunction BaseAxisPointer() {\n}\n\nBaseAxisPointer.prototype = {\n\n    /**\n     * @private\n     */\n    _group: null,\n\n    /**\n     * @private\n     */\n    _lastGraphicKey: null,\n\n    /**\n     * @private\n     */\n    _handle: null,\n\n    /**\n     * @private\n     */\n    _dragging: false,\n\n    /**\n     * @private\n     */\n    _lastValue: null,\n\n    /**\n     * @private\n     */\n    _lastStatus: null,\n\n    /**\n     * @private\n     */\n    _payloadInfo: null,\n\n    /**\n     * In px, arbitrary value. Do not set too small,\n     * no animation is ok for most cases.\n     * @protected\n     */\n    animationThreshold: 15,\n\n    /**\n     * @implement\n     */\n    render: function (axisModel, axisPointerModel, api, forceRender) {\n        var value = axisPointerModel.get('value');\n        var status = axisPointerModel.get('status');\n\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\n        // Optimize: `render` will be called repeatly during mouse move.\n        // So it is power consuming if performing `render` each time,\n        // especially on mobile device.\n        if (!forceRender\n            && this._lastValue === value\n            && this._lastStatus === status\n        ) {\n            return;\n        }\n        this._lastValue = value;\n        this._lastStatus = status;\n\n        var group = this._group;\n        var handle = this._handle;\n\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\n        // Otherwise status is 'show'\n        var elOption = {};\n        this.makeElOption(elOption, value, axisModel, axisPointerModel, api);\n\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\n        var moveAnimation = this._moveAnimation\n            = this.determineAnimation(axisModel, axisPointerModel);\n\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        }\n        else {\n            var doUpdateProps = zrUtil.curry(updateProps, axisPointerModel, moveAnimation);\n            this.updatePointerEl(group, elOption, doUpdateProps, axisPointerModel);\n            this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel);\n        }\n\n        updateMandatoryProps(group, axisPointerModel, true);\n\n        this._renderHandle(value);\n    },\n\n    /**\n     * @implement\n     */\n    remove: function (api) {\n        this.clear(api);\n    },\n\n    /**\n     * @implement\n     */\n    dispose: function (api) {\n        this.clear(api);\n    },\n\n    /**\n     * @protected\n     */\n    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\n        // Value axis without snap always do not snap.\n        if (!useSnap && !isCategoryAxis) {\n            return false;\n        }\n\n        if (animation === 'auto' || animation == null) {\n            var animationThreshold = this.animationThreshold;\n            if (isCategoryAxis && axis.getBandWidth() > animationThreshold) {\n                return true;\n            }\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\n            return false;\n        }\n\n        return animation === true;\n    },\n\n    /**\n     * add {pointer, label, graphicKey} to elOption\n     * @protected\n     */\n    makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {\n        // Shoule be implemenented by sub-class.\n    },\n\n    /**\n     * @protected\n     */\n    createPointerEl: function (group, elOption, axisModel, axisPointerModel) {\n        var pointerOption = elOption.pointer;\n        if (pointerOption) {\n            var pointerEl = inner(group).pointerEl = new graphic[pointerOption.type](\n                clone(elOption.pointer)\n            );\n            group.add(pointerEl);\n        }\n    },\n\n    /**\n     * @protected\n     */\n    createLabelEl: function (group, elOption, axisModel, axisPointerModel) {\n        if (elOption.label) {\n            var labelEl = inner(group).labelEl = new graphic.Rect(\n                clone(elOption.label)\n            );\n\n            group.add(labelEl);\n            updateLabelShowHide(labelEl, axisPointerModel);\n        }\n    },\n\n    /**\n     * @protected\n     */\n    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, {shape: elOption.pointer.shape});\n        }\n    },\n\n    /**\n     * @protected\n     */\n    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                shape: elOption.label.shape,\n                position: elOption.label.position\n            });\n\n            updateLabelShowHide(labelEl, axisPointerModel);\n        }\n    },\n\n    /**\n     * @private\n     */\n    _renderHandle: function (value) {\n        if (this._dragging || !this.updateHandleTransform) {\n            return;\n        }\n\n        var axisPointerModel = this._axisPointerModel;\n        var zr = this._api.getZr();\n        var handle = this._handle;\n        var handleModel = axisPointerModel.getModel('handle');\n\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\n        var isInit;\n        if (!this._handle) {\n            isInit = true;\n            handle = this._handle = graphic.createIcon(\n                handleModel.get('icon'),\n                {\n                    cursor: 'move',\n                    draggable: true,\n                    onmousemove: function (e) {\n                        // Fot mobile devicem, 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            );\n            zr.add(handle);\n        }\n\n        updateMandatoryProps(handle, axisPointerModel, false);\n\n        // update style\n        var includeStyles = [\n            'color', 'borderColor', 'borderWidth', 'opacity',\n            'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'\n        ];\n        handle.setStyle(handleModel.getItemStyle(null, includeStyles));\n\n        // update position\n        var handleSize = handleModel.get('size');\n        if (!zrUtil.isArray(handleSize)) {\n            handleSize = [handleSize, handleSize];\n        }\n        handle.attr('scale', [handleSize[0] / 2, handleSize[1] / 2]);\n\n        throttleUtil.createOrUpdate(\n            this,\n            '_doDispatchAxisPointer',\n            handleModel.get('throttle') || 0,\n            'fixRate'\n        );\n\n        this._moveHandleToValue(value, isInit);\n    },\n\n    /**\n     * @private\n     */\n    _moveHandleToValue: function (value, isInit) {\n        updateProps(\n            this._axisPointerModel,\n            !isInit && this._moveAnimation,\n            this._handle,\n            getHandleTransProps(this.getHandleTransform(\n                value, this._axisModel, this._axisPointerModel\n            ))\n        );\n    },\n\n    /**\n     * @private\n     */\n    _onHandleDragMove: function (dx, dy) {\n        var handle = this._handle;\n        if (!handle) {\n            return;\n        }\n\n        this._dragging = true;\n\n        // Persistent for throttle.\n        var trans = this.updateHandleTransform(\n            getHandleTransProps(handle),\n            [dx, dy],\n            this._axisModel,\n            this._axisPointerModel\n        );\n        this._payloadInfo = trans;\n\n        handle.stopAnimation();\n        handle.attr(getHandleTransProps(trans));\n        inner(handle).lastProp = null;\n\n        this._doDispatchAxisPointer();\n    },\n\n    /**\n     * Throttled method.\n     * @private\n     */\n    _doDispatchAxisPointer: function () {\n        var handle = this._handle;\n        if (!handle) {\n            return;\n        }\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\n    /**\n     * @private\n     */\n    _onHandleDragEnd: function (moveAnimation) {\n        this._dragging = false;\n        var handle = this._handle;\n        if (!handle) {\n            return;\n        }\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\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    /**\n     * Should be implemenented by sub-class if support `handle`.\n     * @protected\n     * @param {number} value\n     * @param {module:echarts/model/Model} axisModel\n     * @param {module:echarts/model/Model} axisPointerModel\n     * @return {Object} {position: [x, y], rotation: 0}\n     */\n    getHandleTransform: null,\n\n    /**\n     * * Should be implemenented by sub-class if support `handle`.\n     * @protected\n     * @param {Object} transform {position, rotation}\n     * @param {Array.<number>} delta [dx, dy]\n     * @param {module:echarts/model/Model} axisModel\n     * @param {module:echarts/model/Model} axisPointerModel\n     * @return {Object} {position: [x, y], rotation: 0, cursorPoint: [x, y]}\n     */\n    updateHandleTransform: null,\n\n    /**\n     * @private\n     */\n    clear: function (api) {\n        this._lastValue = null;\n        this._lastStatus = null;\n\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    },\n\n    /**\n     * @protected\n     */\n    doClear: function () {\n        // Implemented by sub-class if necessary.\n    },\n\n    /**\n     * @protected\n     * @param {Array.<number>} xy\n     * @param {Array.<number>} wh\n     * @param {number} [xDimIndex=0] or 1\n     */\n    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};\n\nBaseAxisPointer.prototype.constructor = BaseAxisPointer;\n\n\nfunction updateProps(animationModel, moveAnimation, el, props) {\n    // Animation optimize.\n    if (!propsEqual(inner(el).lastProp, props)) {\n        inner(el).lastProp = props;\n        moveAnimation\n            ? graphic.updateProps(el, props, animationModel)\n            : (el.stopAnimation(), el.attr(props));\n    }\n}\n\nfunction propsEqual(lastProps, newProps) {\n    if (zrUtil.isObject(lastProps) && zrUtil.isObject(newProps)) {\n        var equals = true;\n        zrUtil.each(newProps, function (item, key) {\n            equals = equals && propsEqual(lastProps[key], item);\n        });\n        return !!equals;\n    }\n    else {\n        return lastProps === newProps;\n    }\n}\n\nfunction updateLabelShowHide(labelEl, axisPointerModel) {\n    labelEl[axisPointerModel.get('label.show') ? 'show' : 'hide']();\n}\n\nfunction getHandleTransProps(trans) {\n    return {\n        position: trans.position.slice(),\n        rotation: trans.rotation || 0\n    };\n}\n\nfunction updateMandatoryProps(group, axisPointerModel, silent) {\n    var z = axisPointerModel.get('z');\n    var zlevel = axisPointerModel.get('zlevel');\n\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}\n\nclazzUtil.enableClassExtend(BaseAxisPointer);\n\nexport default BaseAxisPointer;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport * as textContain from 'zrender/src/contain/text';\nimport * as formatUtil from '../../util/format';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as axisHelper from '../../coord/axisHelper';\nimport AxisBuilder from '../axis/AxisBuilder';\n\n/**\n * @param {module:echarts/model/Model} axisPointerModel\n */\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    }\n    else if (axisPointerType === 'shadow') {\n        style = styleModel.getAreaStyle();\n        style.stroke = null;\n    }\n    return style;\n}\n\n/**\n * @param {Function} labelPos {align, verticalAlign, position}\n */\nexport function buildLabelElOption(\n    elOption, axisModel, axisPointerModel, api, labelPos\n) {\n    var value = axisPointerModel.get('value');\n    var text = getValueLabel(\n        value, axisModel.axis, axisModel.ecModel,\n        axisPointerModel.get('seriesDataIndices'),\n        {\n            precision: axisPointerModel.get('label.precision'),\n            formatter: axisPointerModel.get('label.formatter')\n        }\n    );\n    var labelModel = axisPointerModel.getModel('label');\n    var paddings = formatUtil.normalizeCssArray(labelModel.get('padding') || 0);\n\n    var font = labelModel.getFont();\n    var textRect = textContain.getBoundingRect(text, font);\n\n    var position = labelPos.position;\n    var width = textRect.width + paddings[1] + paddings[3];\n    var height = textRect.height + paddings[0] + paddings[2];\n\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\n    // Not overflow ec container\n    confineInContainer(position, width, height, api);\n\n    var bgColor = labelModel.get('backgroundColor');\n    if (!bgColor || bgColor === 'auto') {\n        bgColor = axisModel.get('axisLine.lineStyle.color');\n    }\n\n    elOption.label = {\n        shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')},\n        position: position.slice(),\n        // TODO: rich\n        style: {\n            text: text,\n            textFont: font,\n            textFill: labelModel.getTextColor(),\n            textPosition: 'inside',\n            textPadding: paddings,\n            fill: bgColor,\n            stroke: labelModel.get('borderColor') || 'transparent',\n            lineWidth: labelModel.get('borderWidth') || 0,\n            shadowBlur: labelModel.get('shadowBlur'),\n            shadowColor: labelModel.get('shadowColor'),\n            shadowOffsetX: labelModel.get('shadowOffsetX'),\n            shadowOffsetY: labelModel.get('shadowOffsetY')\n        },\n        // Lable should be over axisPointer.\n        z2: 10\n    };\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}\n\n/**\n * @param {number} value\n * @param {module:echarts/coord/Axis} axis\n * @param {module:echarts/model/Global} ecModel\n * @param {Object} opt\n * @param {Array.<Object>} seriesDataIndices\n * @param {number|string} opt.precision 'auto' or a number\n * @param {string|Function} opt.formatter label formatter\n */\nexport function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) {\n    value = axis.scale.parse(value);\n    var text = axis.scale.getLabel(\n        // If `precision` is set, width can be fixed (like '12.00500'), which\n        // helps to debounce when when moving label.\n        value, {precision: opt.precision}\n    );\n    var formatter = opt.formatter;\n\n    if (formatter) {\n        var params = {\n            value: axisHelper.getAxisRawValue(axis, value),\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.seriesData.push(dataParams);\n        });\n\n        if (zrUtil.isString(formatter)) {\n            text = formatter.replace('{value}', text);\n        }\n        else if (zrUtil.isFunction(formatter)) {\n            text = formatter(params);\n        }\n    }\n\n    return text;\n}\n\n/**\n * @param {module:echarts/coord/Axis} axis\n * @param {number} value\n * @param {Object} layoutInfo {\n *  rotation, position, labelOffset, labelDirection, labelMargin\n * }\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\n    return graphic.applyTransform([\n        axis.dataToCoord(value),\n        (layoutInfo.labelOffset || 0)\n            + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)\n    ], transform);\n}\n\nexport function buildCartesianSingleLabelElOption(\n    value, elOption, layoutInfo, axisModel, axisPointerModel, api\n) {\n    var textLayout = AxisBuilder.innerTextLayout(\n        layoutInfo.rotation, 0, layoutInfo.labelDirection\n    );\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}\n\n/**\n * @param {Array.<number>} p1\n * @param {Array.<number>} p2\n * @param {number} [xDimIndex=0] or 1\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}\n\n/**\n * @param {Array.<number>} xy\n * @param {Array.<number>} wh\n * @param {number} [xDimIndex=0] or 1\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}\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\nimport BaseAxisPointer from './BaseAxisPointer';\nimport * as viewHelper from './viewHelper';\nimport * as cartesianAxisHelper from '../../coord/cartesian/cartesianAxisHelper';\nimport AxisView from '../axis/AxisView';\n\nvar CartesianAxisPointer = BaseAxisPointer.extend({\n\n    /**\n     * @override\n     */\n    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\n        if (axisPointerType && axisPointerType !== 'none') {\n            var elStyle = viewHelper.buildElStyle(axisPointerModel);\n            var pointerOption = pointerShapeBuilder[axisPointerType](\n                axis, pixelValue, otherExtent\n            );\n            pointerOption.style = elStyle;\n            elOption.graphicKey = pointerOption.type;\n            elOption.pointer = pointerOption;\n        }\n\n        var layoutInfo = cartesianAxisHelper.layout(grid.model, axisModel);\n        viewHelper.buildCartesianSingleLabelElOption(\n            value, elOption, layoutInfo, axisModel, axisPointerModel, api\n        );\n    },\n\n    /**\n     * @override\n     */\n    getHandleTransform: function (value, axisModel, axisPointerModel) {\n        var layoutInfo = cartesianAxisHelper.layout(axisModel.axis.grid.model, axisModel, {\n            labelInside: false\n        });\n        layoutInfo.labelMargin = axisPointerModel.get('handle.margin');\n        return {\n            position: viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo),\n            rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n        };\n    },\n\n    /**\n     * @override\n     */\n    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\n        var currPosition = transform.position;\n        currPosition[dimIndex] += delta[dimIndex];\n        currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);\n        currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);\n\n        var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;\n        var cursorPoint = [cursorOtherValue, cursorOtherValue];\n        cursorPoint[dimIndex] = currPosition[dimIndex];\n\n        // Make tooltip do not overlap axisPointer and in the middle of the grid.\n        var tooltipOptions = [{verticalAlign: 'middle'}, {align: 'center'}];\n\n        return {\n            position: currPosition,\n            rotation: transform.rotation,\n            cursorPoint: cursorPoint,\n            tooltipOption: tooltipOptions[dimIndex]\n        };\n    }\n\n});\n\nfunction getCartesian(grid, axis) {\n    var opt = {};\n    opt[axis.dim + 'AxisIndex'] = axis.index;\n    return grid.getCartesian(opt);\n}\n\nvar pointerShapeBuilder = {\n\n    line: function (axis, pixelValue, otherExtent) {\n        var targetShape = viewHelper.makeLineShape(\n            [pixelValue, otherExtent[0]],\n            [pixelValue, otherExtent[1]],\n            getAxisDimIndex(axis)\n        );\n        return {\n            type: 'Line',\n            subPixelOptimize: true,\n            shape: targetShape\n        };\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(\n                [pixelValue - bandWidth / 2, otherExtent[0]],\n                [bandWidth, span],\n                getAxisDimIndex(axis)\n            )\n        };\n    }\n};\n\nfunction getAxisDimIndex(axis) {\n    return axis.dim === 'x' ? 0 : 1;\n}\n\nAxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer);\n\nexport default CartesianAxisPointer;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as axisPointerModelHelper from './axisPointer/modelHelper';\nimport axisTrigger from './axisPointer/axisTrigger';\n\nimport './axisPointer/AxisPointerModel';\nimport './axisPointer/AxisPointerView';\n\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.\nimport './axisPointer/CartesianAxisPointer';\n\necharts.registerPreprocessor(function (option) {\n    // Always has a global axisPointerModel for default setting.\n    if (option) {\n        (!option.axisPointer || option.axisPointer.length === 0)\n            && (option.axisPointer = {});\n\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 && !zrUtil.isArray(link)) {\n            option.axisPointer.link = [link];\n        }\n    }\n});\n\n// This process should proformed after coordinate systems created\n// and series data processed. So put it on statistic processing stage.\necharts.registerProcessor(echarts.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\n        = axisPointerModelHelper.collect(ecModel, api);\n});\n\n// Broadcast to all views.\necharts.registerAction({\n    type: 'updateAxisPointer',\n    event: 'updateAxisPointer',\n    update: ':updateAxisPointer'\n}, axisTrigger);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport BaseAxisPointer from './BaseAxisPointer';\nimport * as viewHelper from './viewHelper';\nimport * as singleAxisHelper from '../../coord/single/singleAxisHelper';\nimport AxisView from '../axis/AxisView';\n\nvar XY = ['x', 'y'];\nvar WH = ['width', 'height'];\n\nvar SingleAxisPointer = BaseAxisPointer.extend({\n\n    /**\n     * @override\n     */\n    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\n        var axisPointerType = axisPointerModel.get('type');\n        if (axisPointerType && axisPointerType !== 'none') {\n            var elStyle = viewHelper.buildElStyle(axisPointerModel);\n            var pointerOption = pointerShapeBuilder[axisPointerType](\n                axis, pixelValue, otherExtent\n            );\n            pointerOption.style = elStyle;\n\n            elOption.graphicKey = pointerOption.type;\n            elOption.pointer = pointerOption;\n        }\n\n        var layoutInfo = singleAxisHelper.layout(axisModel);\n        viewHelper.buildCartesianSingleLabelElOption(\n            value, elOption, layoutInfo, axisModel, axisPointerModel, api\n        );\n    },\n\n    /**\n     * @override\n     */\n    getHandleTransform: function (value, axisModel, axisPointerModel) {\n        var layoutInfo = singleAxisHelper.layout(axisModel, {labelInside: false});\n        layoutInfo.labelMargin = axisPointerModel.get('handle.margin');\n        return {\n            position: viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo),\n            rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n        };\n    },\n\n    /**\n     * @override\n     */\n    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.position;\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\n        return {\n            position: currPosition,\n            rotation: transform.rotation,\n            cursorPoint: cursorPoint,\n            tooltipOption: {\n                verticalAlign: 'middle'\n            }\n        };\n    }\n});\n\nvar pointerShapeBuilder = {\n\n    line: function (axis, pixelValue, otherExtent) {\n        var targetShape = viewHelper.makeLineShape(\n            [pixelValue, otherExtent[0]],\n            [pixelValue, otherExtent[1]],\n            getPointDimIndex(axis)\n        );\n        return {\n            type: 'Line',\n            subPixelOptimize: true,\n            shape: targetShape\n        };\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(\n                [pixelValue - bandWidth / 2, otherExtent[0]],\n                [bandWidth, span],\n                getPointDimIndex(axis)\n            )\n        };\n    }\n};\n\nfunction getPointDimIndex(axis) {\n    return axis.isHorizontal() ? 0 : 1;\n}\n\nfunction getGlobalExtent(coordSys, dimIndex) {\n    var rect = coordSys.getRect();\n    return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]];\n}\n\nAxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer);\n\nexport default SingleAxisPointer;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport '../coord/single/singleCreator';\nimport './axis/SingleAxisView';\nimport '../coord/single/AxisModel';\nimport './axisPointer';\nimport './axisPointer/SingleAxisPointer';\n\necharts.extendComponentView({\n    type: 'single'\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport SeriesModel from '../../model/Series';\nimport createDimensions from '../../data/helper/createDimensions';\nimport {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper';\nimport List from '../../data/List';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {groupData} from '../../util/model';\nimport {encodeHTML} from '../../util/format';\n\nvar DATA_NAME_INDEX = 2;\n\nvar ThemeRiverSeries = SeriesModel.extend({\n\n    type: 'series.themeRiver',\n\n    dependencies: ['singleAxis'],\n\n    /**\n     * @readOnly\n     * @type {module:zrender/core/util#HashMap}\n     */\n    nameMap: null,\n\n    /**\n     * @override\n     */\n    init: function (option) {\n        // eslint-disable-next-line\n        ThemeRiverSeries.superApply(this, 'init', arguments);\n\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.legendDataProvider = function () {\n            return this.getRawData();\n        };\n    },\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    fixData: function (data) {\n        var rawDataLength = data.length;\n\n        // grouped data by name\n        var groupResult = groupData(data, function (item) {\n            return item[2];\n        });\n        var layData = [];\n        groupResult.buckets.each(function (items, key) {\n            layData.push({name: key, dataList: items});\n        });\n\n        var layerNum = layData.length;\n        var largestLayer = -1;\n        var index = -1;\n        for (var i = 0; i < layerNum; ++i) {\n            var len = layData[i].dataList.length;\n            if (len > largestLayer) {\n                largestLayer = len;\n                index = i;\n            }\n        }\n\n        for (var k = 0; k < layerNum; ++k) {\n            if (k === index) {\n                continue;\n            }\n            var name = layData[k].name;\n            for (var j = 0; j < largestLayer; ++j) {\n                var timeValue = layData[index].dataList[j][0];\n                var length = layData[k].dataList.length;\n                var keyIndex = -1;\n                for (var l = 0; l < length; ++l) {\n                    var value = layData[k].dataList[l][0];\n                    if (value === timeValue) {\n                        keyIndex = l;\n                        break;\n                    }\n                }\n                if (keyIndex === -1) {\n                    data[rawDataLength] = [];\n                    data[rawDataLength][0] = timeValue;\n                    data[rawDataLength][1] = 0;\n                    data[rawDataLength][2] = name;\n                    rawDataLength++;\n\n                }\n            }\n        }\n        return data;\n    },\n\n    /**\n     * @override\n     * @param  {Object} option  the initial option that user gived\n     * @param  {module:echarts/model/Model} ecModel  the model object for themeRiver option\n     * @return {module:echarts/data/List}\n     */\n    getInitialData: function (option, ecModel) {\n\n        var singleAxisModel = ecModel.queryComponents({\n            mainType: 'singleAxis',\n            index: this.get('singleAxisIndex'),\n            id: this.get('singleAxisId')\n        })[0];\n\n        var axisType = singleAxisModel.get('type');\n\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\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\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\n        var dimensionsInfo = createDimensions(data, {\n            coordDimensions: ['single'],\n            dimensionsDefine: [\n                {\n                    name: 'time',\n                    type: getDimensionTypeByAxis(axisType)\n                },\n                {\n                    name: 'value',\n                    type: 'float'\n                },\n                {\n                    name: 'name',\n                    type: 'ordinal'\n                }\n            ],\n            encodeDefine: {\n                single: 0,\n                value: 1,\n                itemName: 2\n            }\n        });\n\n        var list = new List(dimensionsInfo, this);\n        list.initData(data);\n\n        return list;\n    },\n\n    /**\n     * The raw data is divided into multiple layers and each layer\n     *     has same name.\n     *\n     * @return {Array.<Array.<number>>}\n     */\n    getLayerSeries: function () {\n        var data = this.getData();\n        var lenCount = data.count();\n        var indexArr = [];\n\n        for (var i = 0; i < lenCount; ++i) {\n            indexArr[i] = i;\n        }\n\n        var timeDim = data.mapDimension('single');\n\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({name: key, indices: items});\n        });\n\n        return layerSeries;\n    },\n\n    /**\n     * Get data indices for show tooltip content\n\n     * @param {Array.<string>|string} dim  single coordinate dimension\n     * @param {number} value axis value\n     * @param {module:echarts/coord/single/SingleAxis} baseAxis  single Axis used\n     *     the themeRiver.\n     * @return {Object} {dataIndices, nestestValue}\n     */\n    getAxisTooltipData: function (dim, value, baseAxis) {\n        if (!zrUtil.isArray(dim)) {\n            dim = dim ? [dim] : [];\n        }\n\n        var data = this.getData();\n        var layerSeries = this.getLayerSeries();\n        var indices = [];\n        var layerNum = layerSeries.length;\n        var nestestValue;\n\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\n        return {dataIndices: indices, nestestValue: nestestValue};\n    },\n\n    /**\n     * @override\n     * @param {number} dataIndex  index of data\n     */\n    formatTooltip: function (dataIndex) {\n        var data = this.getData();\n        var htmlName = data.getName(dataIndex);\n        var htmlValue = data.get(data.mapDimension('value'), dataIndex);\n        if (isNaN(htmlValue) || htmlValue == null) {\n            htmlValue = '-';\n        }\n        return encodeHTML(htmlName + ' : ' + htmlValue);\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n\n        coordinateSystem: 'singleAxis',\n\n        // gap in axis's orthogonal orientation\n        boundaryGap: ['10%', '10%'],\n\n        // legendHoverLink: true,\n\n        singleAxisIndex: 0,\n\n        animationEasing: 'linear',\n\n        label: {\n            margin: 4,\n            show: true,\n            position: 'left',\n            color: '#000',\n            fontSize: 11\n        },\n\n        emphasis: {\n            label: {\n                show: true\n            }\n        }\n    }\n});\n\nexport default ThemeRiverSeries;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport {Polygon} from '../line/poly';\nimport * as graphic from '../../util/graphic';\nimport {bind, extend} from 'zrender/src/core/util';\nimport DataDiffer from '../../data/DataDiffer';\n\nexport default echarts.extendChartView({\n\n    type: 'themeRiver',\n\n    init: function () {\n        this._layers = [];\n    },\n\n    render: function (seriesModel, ecModel, api) {\n        var data = seriesModel.getData();\n\n        var group = this.group;\n\n        var layerSeries = seriesModel.getLayerSeries();\n\n        var layoutInfo = data.getLayout('layoutInfo');\n        var rect = layoutInfo.rect;\n        var boundaryGap = layoutInfo.boundaryGap;\n\n        group.attr('position', [0, rect.y + boundaryGap[0]]);\n\n        function keyGetter(item) {\n            return item.name;\n        }\n        var dataDiffer = new DataDiffer(\n            this._layersSeries || [], layerSeries,\n            keyGetter, keyGetter\n        );\n\n        var newLayersGroups = {};\n\n        dataDiffer\n            .add(bind(process, this, 'add'))\n            .update(bind(process, this, 'update'))\n            .remove(bind(process, this, 'remove'))\n            .execute();\n\n        function process(status, idx, oldIdx) {\n            var oldLayersGroups = this._layers;\n            if (status === 'remove') {\n                group.remove(oldLayersGroups[idx]);\n                return;\n            }\n            var points0 = [];\n            var points1 = [];\n            var color;\n            var indices = layerSeries[idx].indices;\n            for (var j = 0; 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\n                points0.push([x, y0]);\n                points1.push([x, y0 + y]);\n\n                color = data.getItemVisual(indices[j], 'color');\n            }\n\n            var polygon;\n            var text;\n            var textLayout = data.getItemLayout(indices[0]);\n            var itemModel = data.getItemModel(indices[j - 1]);\n            var labelModel = itemModel.getModel('label');\n            var margin = labelModel.get('margin');\n            if (status === 'add') {\n                var layerGroup = newLayersGroups[idx] = new graphic.Group();\n                polygon = new Polygon({\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                text = new graphic.Text({\n                    style: {\n                        x: textLayout.x - margin,\n                        y: textLayout.y0 + textLayout.y / 2\n                    }\n                });\n                layerGroup.add(polygon);\n                layerGroup.add(text);\n                group.add(layerGroup);\n\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                text = layerGroup.childAt(1);\n                group.add(layerGroup);\n\n                newLayersGroups[idx] = layerGroup;\n\n                graphic.updateProps(polygon, {\n                    shape: {\n                        points: points0,\n                        stackedOnPoints: points1\n                    }\n                }, seriesModel);\n\n                graphic.updateProps(text, {\n                    style: {\n                        x: textLayout.x - margin,\n                        y: textLayout.y0 + textLayout.y / 2\n                    }\n                }, seriesModel);\n            }\n\n            var hoverItemStyleModel = itemModel.getModel('emphasis.itemStyle');\n            var itemStyleModel = itemModel.getModel('itemStyle');\n\n            graphic.setTextStyle(text.style, labelModel, {\n                text: labelModel.get('show')\n                    ? seriesModel.getFormattedLabel(indices[j - 1], 'normal')\n                        || data.getName(indices[j - 1])\n                    : null,\n                textVerticalAlign: 'middle'\n            });\n\n            polygon.setStyle(extend({\n                fill: color\n            }, itemStyleModel.getItemStyle(['color'])));\n\n            graphic.setHoverStyle(polygon, hoverItemStyleModel.getItemStyle());\n        }\n\n        this._layersSeries = layerSeries;\n        this._layers = newLayersGroups;\n    },\n\n    dispose: function () {}\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            height: rect.height + 20\n        }\n    }, seriesModel, cb);\n\n    return rectEl;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as numberUtil from '../../util/number';\n\nexport default function (ecModel, api) {\n\n    ecModel.eachSeriesByType('themeRiver', function (seriesModel) {\n\n        var data = seriesModel.getData();\n\n        var single = seriesModel.coordinateSystem;\n\n        var layoutInfo = {};\n\n        // use the axis boundingRect for view\n        var rect = single.getRect();\n\n        layoutInfo.rect = rect;\n\n        var boundaryGap = seriesModel.get('boundaryGap');\n\n        var axis = single.getAxis();\n\n        layoutInfo.boundaryGap = boundaryGap;\n\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            themeRiverLayout(data, seriesModel, height);\n        }\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            themeRiverLayout(data, seriesModel, width);\n        }\n\n        data.setLayout('layoutInfo', layoutInfo);\n    });\n}\n\n/**\n * The layout information about themeriver\n *\n * @param {module:echarts/data/List} data  data in the series\n * @param {module:echarts/model/Series} seriesModel  the model object of themeRiver series\n * @param {number} height  value used to compute every series height\n */\nfunction themeRiverLayout(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\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\n    var base = computeBaseline(layerPoints);\n    var baseLine = base.y0;\n    var ky = height / base.max;\n\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/**\n * Compute the baseLine of the rawdata\n * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics\n *\n * @param  {Array.<Array>} data  the points in each layer\n * @return {Object}\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    var temp;\n    var base = {};\n\n    for (var i = 0; i < pointNum; ++i) {\n        for (var j = 0, temp = 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\n    for (var k = 0; k < pointNum; ++k) {\n        y0[k] = (max - sums[k]) / 2;\n    }\n    max = 0;\n\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    base.y0 = y0;\n    base.max = max;\n\n    return base;\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {createHashMap} from 'zrender/src/core/util';\n\nexport default function (ecModel) {\n    ecModel.eachSeriesByType('themeRiver', function (seriesModel) {\n        var data = seriesModel.getData();\n        var rawData = seriesModel.getRawData();\n        var colorList = seriesModel.get('color');\n        var idxMap = createHashMap();\n\n        data.each(function (idx) {\n            idxMap.set(data.getRawIndex(idx), idx);\n        });\n\n        rawData.each(function (rawIndex) {\n            var name = rawData.getName(rawIndex);\n            var color = colorList[(seriesModel.nameMap.get(name) - 1) % colorList.length];\n\n            rawData.setItemVisual(rawIndex, 'color', color);\n\n            var idx = idxMap.get(rawIndex);\n\n            if (idx != null) {\n                data.setItemVisual(idx, 'color', color);\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\nimport * as echarts from '../echarts';\n\nimport '../component/singleAxis';\nimport './themeRiver/ThemeRiverSeries';\nimport './themeRiver/ThemeRiverView';\n\nimport themeRiverLayout from './themeRiver/themeRiverLayout';\nimport themeRiverVisual from './themeRiver/themeRiverVisual';\nimport dataFilter from '../processor/dataFilter';\n\necharts.registerLayout(themeRiverLayout);\necharts.registerVisual(themeRiverVisual);\necharts.registerProcessor(dataFilter('themeRiver'));","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport SeriesModel from '../../model/Series';\nimport Tree from '../../data/Tree';\nimport {wrapTreePathInfo} from '../helper/treeHelper';\n\nexport default SeriesModel.extend({\n\n    type: 'series.sunburst',\n\n    /**\n     * @type {module:echarts/data/Tree~Node}\n     */\n    _viewRoot: null,\n\n    getInitialData: function (option, ecModel) {\n        // Create a virtual root.\n        var root = { name: option.name, children: option.data };\n\n        completeTreeValue(root);\n\n        var levels = option.levels || [];\n\n        // levels = option.levels = setDefault(levels, ecModel);\n\n        var treeOption = {};\n\n        treeOption.levels = levels;\n\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        return Tree.createTree(root, this, treeOption).data;\n    },\n\n    optionUpdated: function () {\n        this.resetViewRoot();\n    },\n\n    /*\n     * @override\n     */\n    getDataParams: function (dataIndex) {\n        var params = SeriesModel.prototype.getDataParams.apply(this, arguments);\n\n        var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n        params.treePathInfo = wrapTreePathInfo(node, this);\n\n        return params;\n    },\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n\n        // 默认全局居中\n        center: ['50%', '50%'],\n        radius: [0, '75%'],\n        // 默认顺时针\n        clockwise: true,\n        startAngle: 90,\n        // 最小角度改为0\n        minAngle: 0,\n\n        percentPrecision: 2,\n\n        // If still show when all data zero.\n        stillShowZeroSum: true,\n\n        // Policy of highlighting pieces when hover on one\n        // Valid values: 'none' (for not downplay others), 'descendant',\n        // 'ancestor', 'self'\n        highlightPolicy: 'descendant',\n\n        // 'rootToNode', 'link', or false\n        nodeClick: 'rootToNode',\n\n        renderLabelForZeroData: false,\n\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 outter\n            // side for inside\n            align: 'center',\n            position: 'inside',\n            distance: 5,\n            silent: true,\n            emphasis: {}\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            emphasis: {},\n            highlight: {\n                opacity: 1\n            },\n            downplay: {\n                opacity: 0.9\n            }\n        },\n\n        // Animation type canbe expansion, scale\n        animationType: 'expansion',\n        animationDuration: 1000,\n        animationDurationUpdate: 500,\n        animationEasing: 'cubicOut',\n\n        data: [],\n\n        levels: [],\n\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\n    getViewRoot: function () {\n        return this._viewRoot;\n    },\n\n    /**\n     * @param {module:echarts/data/Tree~Node} [viewRoot]\n     */\n    resetViewRoot: function (viewRoot) {\n        viewRoot\n            ? (this._viewRoot = viewRoot)\n            : (viewRoot = this._viewRoot);\n\n        var root = this.getRawData().tree.root;\n\n        if (!viewRoot\n            || (viewRoot !== root && !root.contains(viewRoot))\n        ) {\n            this._viewRoot = root;\n        }\n    }\n});\n\n\n\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\n    zrUtil.each(dataNode.children, function (child) {\n\n        completeTreeValue(child);\n\n        var childValue = child.value;\n        zrUtil.isArray(childValue) && (childValue = childValue[0]);\n\n        sum += childValue;\n    });\n\n    var thisValue = dataNode.value;\n    if (zrUtil.isArray(thisValue)) {\n        thisValue = thisValue[0];\n    }\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\n    zrUtil.isArray(dataNode.value)\n        ? (dataNode.value[0] = thisValue)\n        : (dataNode.value = thisValue);\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\n\nvar NodeHighlightPolicy = {\n    NONE: 'none', // not downplay others\n    DESCENDANT: 'descendant',\n    ANCESTOR: 'ancestor',\n    SELF: 'self'\n};\n\nvar DEFAULT_SECTOR_Z = 2;\nvar DEFAULT_TEXT_Z = 4;\n\n/**\n * Sunburstce of Sunburst including Sector, Label, LabelLine\n * @constructor\n * @extends {module:zrender/graphic/Group}\n */\nfunction SunburstPiece(node, seriesModel, ecModel) {\n\n    graphic.Group.call(this);\n\n    var sector = new graphic.Sector({\n        z2: DEFAULT_SECTOR_Z\n    });\n    sector.seriesIndex = seriesModel.seriesIndex;\n\n    var text = new graphic.Text({\n        z2: DEFAULT_TEXT_Z,\n        silent: node.getModel('label').get('silent')\n    });\n    this.add(sector);\n    this.add(text);\n\n    this.updateData(true, node, 'normal', seriesModel, ecModel);\n\n    // Hover to change label and labelLine\n    function onEmphasis() {\n        text.ignore = text.hoverIgnore;\n    }\n    function onNormal() {\n        text.ignore = text.normalIgnore;\n    }\n    this.on('emphasis', onEmphasis)\n        .on('normal', onNormal)\n        .on('mouseover', onEmphasis)\n        .on('mouseout', onNormal);\n}\n\nvar SunburstPieceProto = SunburstPiece.prototype;\n\nSunburstPieceProto.updateData = function (\n    firstCreate,\n    node,\n    state,\n    seriesModel,\n    ecModel\n) {\n    this.node = node;\n    node.piece = this;\n\n    seriesModel = seriesModel || this._seriesModel;\n    ecModel = ecModel || this._ecModel;\n\n    var sector = this.childAt(0);\n    sector.dataIndex = node.dataIndex;\n\n    var itemModel = node.getModel();\n    var layout = node.getLayout();\n    // if (!layout) {\n    //     console.log(node.getLayout());\n    // }\n    var sectorShape = zrUtil.extend({}, layout);\n    sectorShape.label = null;\n\n    var visualColor = getNodeColor(node, seriesModel, ecModel);\n\n    fillDefaultColor(node, seriesModel, visualColor);\n\n    var normalStyle = itemModel.getModel('itemStyle').getItemStyle();\n    var style;\n    if (state === 'normal') {\n        style = normalStyle;\n    }\n    else {\n        var stateStyle = itemModel.getModel(state + '.itemStyle')\n            .getItemStyle();\n        style = zrUtil.merge(stateStyle, normalStyle);\n    }\n    style = zrUtil.defaults(\n        {\n            lineJoin: 'bevel',\n            fill: style.fill || visualColor\n        },\n        style\n    );\n\n    if (firstCreate) {\n        sector.setShape(sectorShape);\n        sector.shape.r = layout.r0;\n        graphic.updateProps(\n            sector,\n            {\n                shape: {\n                    r: layout.r\n                }\n            },\n            seriesModel,\n            node.dataIndex\n        );\n        sector.useStyle(style);\n    }\n    else if (typeof style.fill === 'object' && style.fill.type\n        || typeof sector.style.fill === 'object' && sector.style.fill.type\n    ) {\n        // Disable animation for gradient since no interpolation method\n        // is supported for gradient\n        graphic.updateProps(sector, {\n            shape: sectorShape\n        }, seriesModel);\n        sector.useStyle(style);\n    }\n    else {\n        graphic.updateProps(sector, {\n            shape: sectorShape,\n            style: style\n        }, seriesModel);\n    }\n\n    this._updateLabel(seriesModel, visualColor, state);\n\n    var cursorStyle = itemModel.getShallow('cursor');\n    cursorStyle && sector.attr('cursor', cursorStyle);\n\n    if (firstCreate) {\n        var highlightPolicy = seriesModel.getShallow('highlightPolicy');\n        this._initEvents(sector, node, seriesModel, highlightPolicy);\n    }\n\n    this._seriesModel = seriesModel || this._seriesModel;\n    this._ecModel = ecModel || this._ecModel;\n};\n\nSunburstPieceProto.onEmphasis = function (highlightPolicy) {\n    var that = this;\n    this.node.hostTree.root.eachNode(function (n) {\n        if (n.piece) {\n            if (that.node === n) {\n                n.piece.updateData(false, n, 'emphasis');\n            }\n            else if (isNodeHighlighted(n, that.node, highlightPolicy)) {\n                n.piece.childAt(0).trigger('highlight');\n            }\n            else if (highlightPolicy !== NodeHighlightPolicy.NONE) {\n                n.piece.childAt(0).trigger('downplay');\n            }\n        }\n    });\n};\n\nSunburstPieceProto.onNormal = function () {\n    this.node.hostTree.root.eachNode(function (n) {\n        if (n.piece) {\n            n.piece.updateData(false, n, 'normal');\n        }\n    });\n};\n\nSunburstPieceProto.onHighlight = function () {\n    this.updateData(false, this.node, 'highlight');\n};\n\nSunburstPieceProto.onDownplay = function () {\n    this.updateData(false, this.node, 'downplay');\n};\n\nSunburstPieceProto._updateLabel = function (seriesModel, visualColor, state) {\n    var itemModel = this.node.getModel();\n    var normalModel = itemModel.getModel('label');\n    var labelModel = state === 'normal' || state === 'emphasis'\n        ? normalModel\n        : itemModel.getModel(state + '.label');\n    var labelHoverModel = itemModel.getModel('emphasis.label');\n\n    var text = zrUtil.retrieve(\n        seriesModel.getFormattedLabel(\n            this.node.dataIndex, state, null, null, 'label'\n        ),\n        this.node.name\n    );\n    if (getLabelAttr('show') === false) {\n        text = '';\n    }\n\n    var layout = this.node.getLayout();\n    var labelMinAngle = labelModel.get('minAngle');\n    if (labelMinAngle == null) {\n        labelMinAngle = normalModel.get('minAngle');\n    }\n    labelMinAngle = labelMinAngle / 180 * Math.PI;\n    var angle = layout.endAngle - layout.startAngle;\n    if (labelMinAngle != null && Math.abs(angle) < labelMinAngle) {\n        // Not displaying text when angle is too small\n        text = '';\n    }\n\n    var label = this.childAt(1);\n\n    graphic.setLabelStyle(\n        label.style, label.hoverStyle || {}, normalModel, labelHoverModel,\n        {\n            defaultText: labelModel.getShallow('show') ? text : null,\n            autoColor: visualColor,\n            useInsideStyle: true\n        }\n    );\n\n    var midAngle = (layout.startAngle + layout.endAngle) / 2;\n    var dx = Math.cos(midAngle);\n    var dy = Math.sin(midAngle);\n\n    var r;\n    var labelPosition = getLabelAttr('position');\n    var labelPadding = getLabelAttr('distance') || 0;\n    var textAlign = getLabelAttr('align');\n    if (labelPosition === 'outside') {\n        r = layout.r + labelPadding;\n        textAlign = midAngle > Math.PI / 2 ? 'right' : 'left';\n    }\n    else {\n        if (!textAlign || textAlign === 'center') {\n            r = (layout.r + layout.r0) / 2;\n            textAlign = 'center';\n        }\n        else if (textAlign === 'left') {\n            r = layout.r0 + labelPadding;\n            if (midAngle > Math.PI / 2) {\n                textAlign = 'right';\n            }\n        }\n        else if (textAlign === 'right') {\n            r = layout.r - labelPadding;\n            if (midAngle > Math.PI / 2) {\n                textAlign = 'left';\n            }\n        }\n    }\n\n    label.attr('style', {\n        text: text,\n        textAlign: textAlign,\n        textVerticalAlign: getLabelAttr('verticalAlign') || 'middle',\n        opacity: getLabelAttr('opacity')\n    });\n\n    var textX = r * dx + layout.cx;\n    var textY = r * dy + layout.cy;\n    label.attr('position', [textX, textY]);\n\n    var rotateType = getLabelAttr('rotate');\n    var rotate = 0;\n    if (rotateType === 'radial') {\n        rotate = -midAngle;\n        if (rotate < -Math.PI / 2) {\n            rotate += Math.PI;\n        }\n    }\n    else if (rotateType === 'tangential') {\n        rotate = Math.PI / 2 - midAngle;\n        if (rotate > Math.PI / 2) {\n            rotate -= Math.PI;\n        }\n        else if (rotate < -Math.PI / 2) {\n            rotate += Math.PI;\n        }\n    } else if (typeof rotateType === 'number') {\n        rotate = rotateType * Math.PI / 180;\n    }\n    label.attr('rotation', rotate);\n\n    function getLabelAttr(name) {\n        var stateAttr = labelModel.get(name);\n        if (stateAttr == null) {\n            return normalModel.get(name);\n        }\n        else {\n            return stateAttr;\n        }\n    }\n};\n\nSunburstPieceProto._initEvents = function (\n    sector,\n    node,\n    seriesModel,\n    highlightPolicy\n) {\n    sector.off('mouseover').off('mouseout').off('emphasis').off('normal');\n\n    var that = this;\n    var onEmphasis = function () {\n        that.onEmphasis(highlightPolicy);\n    };\n    var onNormal = function () {\n        that.onNormal();\n    };\n    var onDownplay = function () {\n        that.onDownplay();\n    };\n    var onHighlight = function () {\n        that.onHighlight();\n    };\n\n    if (seriesModel.isAnimationEnabled()) {\n        sector\n            .on('mouseover', onEmphasis)\n            .on('mouseout', onNormal)\n            .on('emphasis', onEmphasis)\n            .on('normal', onNormal)\n            .on('downplay', onDownplay)\n            .on('highlight', onHighlight);\n    }\n};\n\nzrUtil.inherits(SunburstPiece, graphic.Group);\n\nexport default SunburstPiece;\n\n\n/**\n * Get node color\n *\n * @param {TreeNode} node the node to get color\n * @param {module:echarts/model/Series} seriesModel series\n * @param {module:echarts/model/Global} ecModel echarts defaults\n */\nfunction getNodeColor(node, seriesModel, ecModel) {\n    // Color from visualMap\n    var visualColor = node.getVisual('color');\n    var visualMetaList = node.getVisual('visualMeta');\n    if (!visualMetaList || visualMetaList.length === 0) {\n        // Use first-generation color if has no visualMap\n        visualColor = null;\n    }\n\n    // Self color or level color\n    var color = node.getModel('itemStyle').get('color');\n    if (color) {\n        return color;\n    }\n    else if (visualColor) {\n        // Color mapping\n        return visualColor;\n    }\n    else if (node.depth === 0) {\n        // Virtual root node\n        return ecModel.option.color[0];\n    }\n    else {\n        // First-generation color\n        var length = ecModel.option.color.length;\n        color = ecModel.option.color[getRootId(node) % length];\n    }\n    return color;\n}\n\n/**\n * Get index of root in sorted order\n *\n * @param {TreeNode} node current node\n * @return {number} index in root\n */\nfunction getRootId(node) {\n    var ancestor = node;\n    while (ancestor.depth > 1) {\n        ancestor = ancestor.parentNode;\n    }\n\n    var virtualRoot = node.getAncestors()[0];\n    return zrUtil.indexOf(virtualRoot.children, ancestor);\n}\n\nfunction isNodeHighlighted(node, activeNode, policy) {\n    if (policy === NodeHighlightPolicy.NONE) {\n        return false;\n    }\n    else if (policy === NodeHighlightPolicy.SELF) {\n        return node === activeNode;\n    }\n    else if (policy === NodeHighlightPolicy.ANCESTOR) {\n        return node === activeNode || node.isAncestorOf(activeNode);\n    }\n    else {\n        return node === activeNode || node.isDescendantOf(activeNode);\n    }\n}\n\n// Fix tooltip callback function params.color incorrect when pick a default color\nfunction fillDefaultColor(node, seriesModel, color) {\n    var data = seriesModel.getData();\n    data.setItemVisual(node.dataIndex, 'color', color);\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ChartView from '../../view/Chart';\nimport SunburstPiece from './SunburstPiece';\nimport DataDiffer from '../../data/DataDiffer';\n\nvar ROOT_TO_NODE_ACTION = 'sunburstRootToNode';\n\nvar SunburstView = ChartView.extend({\n\n    type: 'sunburst',\n\n    init: function () {\n    },\n\n    render: function (seriesModel, ecModel, api, payload) {\n        var that = this;\n\n        this.seriesModel = seriesModel;\n        this.api = api;\n        this.ecModel = ecModel;\n\n        var data = seriesModel.getData();\n        var virtualRoot = data.tree.root;\n\n        var newRoot = seriesModel.getViewRoot();\n\n        var group = this.group;\n\n        var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');\n\n        var newChildren = [];\n        newRoot.eachNode(function (node) {\n            newChildren.push(node);\n        });\n        var oldChildren = this._oldChildren || [];\n\n        dualTravel(newChildren, oldChildren);\n\n        renderRollUp(virtualRoot, newRoot);\n\n        if (payload && payload.highlight && payload.highlight.piece) {\n            var highlightPolicy = seriesModel.getShallow('highlightPolicy');\n            payload.highlight.piece.onEmphasis(highlightPolicy);\n        }\n        else if (payload && payload.unhighlight) {\n            var piece = this.virtualPiece;\n            if (!piece && virtualRoot.children.length) {\n                piece = virtualRoot.children[0].piece;\n            }\n            if (piece) {\n                piece.onNormal();\n            }\n        }\n\n        this._initEvents();\n\n        this._oldChildren = newChildren;\n\n        function dualTravel(newChildren, oldChildren) {\n            if (newChildren.length === 0 && oldChildren.length === 0) {\n                return;\n            }\n\n            new DataDiffer(oldChildren, newChildren, getKey, getKey)\n                .add(processNode)\n                .update(processNode)\n                .remove(zrUtil.curry(processNode, null))\n                .execute();\n\n            function getKey(node) {\n                return node.getId();\n            }\n\n            function processNode(newId, oldId) {\n                var newNode = newId == null ? null : newChildren[newId];\n                var oldNode = oldId == null ? null : oldChildren[oldId];\n\n                doRenderNode(newNode, oldNode);\n            }\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\n            if (newNode !== virtualRoot && oldNode !== virtualRoot) {\n                if (oldNode && oldNode.piece) {\n                    if (newNode) {\n                        // Update\n                        oldNode.piece.updateData(\n                            false, newNode, 'normal', seriesModel, ecModel);\n\n                        // For tooltip\n                        data.setItemGraphicEl(newNode.dataIndex, oldNode.piece);\n                    }\n                    else {\n                        // Remove\n                        removeNode(oldNode);\n                    }\n                }\n                else if (newNode) {\n                    // Add\n                    var piece = new SunburstPiece(\n                        newNode,\n                        seriesModel,\n                        ecModel\n                    );\n                    group.add(piece);\n\n                    // For tooltip\n                    data.setItemGraphicEl(newNode.dataIndex, piece);\n                }\n            }\n        }\n\n        function removeNode(node) {\n            if (!node) {\n                return;\n            }\n\n            if (node.piece) {\n                group.remove(node.piece);\n                node.piece = null;\n            }\n        }\n\n        function renderRollUp(virtualRoot, viewRoot) {\n            if (viewRoot.depth > 0) {\n                // Render\n                if (that.virtualPiece) {\n                    // Update\n                    that.virtualPiece.updateData(\n                        false, virtualRoot, 'normal', seriesModel, ecModel);\n                }\n                else {\n                    // Add\n                    that.virtualPiece = new SunburstPiece(\n                        virtualRoot,\n                        seriesModel,\n                        ecModel\n                    );\n                    group.add(that.virtualPiece);\n                }\n\n                if (viewRoot.piece._onclickEvent) {\n                    viewRoot.piece.off('click', viewRoot.piece._onclickEvent);\n                }\n                var event = function (e) {\n                    that._rootToNode(viewRoot.parentNode);\n                };\n                viewRoot.piece._onclickEvent = event;\n                that.virtualPiece.on('click', event);\n            }\n            else if (that.virtualPiece) {\n                // Remove\n                group.remove(that.virtualPiece);\n                that.virtualPiece = null;\n            }\n        }\n    },\n\n    dispose: function () {\n    },\n\n    /**\n     * @private\n     */\n    _initEvents: function () {\n        var that = this;\n\n        var event = function (e) {\n            var targetFound = false;\n            var viewRoot = that.seriesModel.getViewRoot();\n            viewRoot.eachNode(function (node) {\n                if (!targetFound\n                    && node.piece && node.piece.childAt(0) === e.target\n                ) {\n                    var nodeClick = node.getModel().get('nodeClick');\n                    if (nodeClick === 'rootToNode') {\n                        that._rootToNode(node);\n                    }\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)\n                                || '_blank';\n                            window.open(link, linkTarget);\n                        }\n                    }\n                    targetFound = true;\n                }\n            });\n        };\n\n        if (this.group._onclickEvent) {\n            this.group.off('click', this.group._onclickEvent);\n        }\n        this.group.on('click', event);\n        this.group._onclickEvent = event;\n    },\n\n    /**\n     * @private\n     */\n    _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    /**\n     * @implement\n     */\n    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\n});\n\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 * @file Sunburst action\n */\n\nimport * as echarts from '../../echarts';\nimport * as helper from '../helper/treeHelper';\n\nvar ROOT_TO_NODE_ACTION = 'sunburstRootToNode';\n\necharts.registerAction(\n    {type: ROOT_TO_NODE_ACTION, update: 'updateView'},\n    function (payload, ecModel) {\n\n        ecModel.eachComponent(\n            {mainType: 'series', subType: 'sunburst', query: payload},\n            handleRootToNode\n        );\n\n        function handleRootToNode(model, index) {\n            var targetInfo = helper\n                .retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model);\n\n            if (targetInfo) {\n                var originViewRoot = model.getViewRoot();\n                if (originViewRoot) {\n                    payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node)\n                        ? 'rollUp' : 'drillDown';\n                }\n                model.resetViewRoot(targetInfo.node);\n            }\n        }\n    }\n);\n\n\nvar HIGHLIGHT_ACTION = 'sunburstHighlight';\n\necharts.registerAction(\n    {type: HIGHLIGHT_ACTION, update: 'updateView'},\n    function (payload, ecModel) {\n\n        ecModel.eachComponent(\n            {mainType: 'series', subType: 'sunburst', query: payload},\n            handleHighlight\n        );\n\n        function handleHighlight(model, index) {\n            var targetInfo = helper\n                .retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model);\n\n            if (targetInfo) {\n                payload.highlight = targetInfo.node;\n            }\n        }\n    }\n);\n\n\nvar UNHIGHLIGHT_ACTION = 'sunburstUnhighlight';\n\necharts.registerAction(\n    {type: UNHIGHLIGHT_ACTION, update: 'updateView'},\n    function (payload, ecModel) {\n\n        ecModel.eachComponent(\n            {mainType: 'series', subType: 'sunburst', query: payload},\n            handleUnhighlight\n        );\n\n        function handleUnhighlight(model, index) {\n            payload.unhighlight = 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\nimport { parsePercent } from '../../util/number';\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar PI2 = Math.PI * 2;\nvar RADIAN = Math.PI / 180;\n\nexport default function (seriesType, ecModel, api, payload) {\n    ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n        var center = seriesModel.get('center');\n        var radius = seriesModel.get('radius');\n\n        if (!zrUtil.isArray(radius)) {\n            radius = [0, radius];\n        }\n        if (!zrUtil.isArray(center)) {\n            center = [center, center];\n        }\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\n        var startAngle = -seriesModel.get('startAngle') * RADIAN;\n        var minAngle = seriesModel.get('minAngle') * RADIAN;\n\n        var virtualRoot = seriesModel.getData().tree.root;\n        var treeRoot = seriesModel.getViewRoot();\n        var rootDepth = treeRoot.depth;\n\n        var sort = seriesModel.get('sort');\n        if (sort != null) {\n            initChildren(treeRoot, sort);\n        }\n\n        var validDataCount = 0;\n        zrUtil.each(treeRoot.children, function (child) {\n            !isNaN(child.getValue()) && validDataCount++;\n        });\n\n        var sum = treeRoot.getValue();\n        // Sum may be 0\n        var unitRadian = Math.PI / (sum || validDataCount) * 2;\n\n        var renderRollupNode = treeRoot.depth > 0;\n        var levels = treeRoot.height - (renderRollupNode ? -1 : 1);\n        var rPerLevel = (r - r0) / (levels || 1);\n\n        var clockwise = seriesModel.get('clockwise');\n\n        var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n\n        // In the case some sector angle is smaller than minAngle\n        var restAngle = PI2;\n        var valueSumLargerThanMinAngle = 0;\n\n        var dir = clockwise ? 1 : -1;\n\n        /**\n         * Render a tree\n         * @return increased angle\n         */\n        var renderNode = function (node, startAngle) {\n            if (!node) {\n                return;\n            }\n\n            var endAngle = startAngle;\n\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\n                var angle = (sum === 0 && stillShowZeroSum)\n                    ? unitRadian : (value * unitRadian);\n                if (angle < minAngle) {\n                    angle = minAngle;\n                    restAngle -= minAngle;\n                }\n                else {\n                    valueSumLargerThanMinAngle += value;\n                }\n\n                endAngle = startAngle + dir * angle;\n\n                var depth = node.depth - rootDepth\n                    - (renderRollupNode ? -1 : 1);\n                var rStart = r0 + rPerLevel * depth;\n                var rEnd = r0 + rPerLevel * (depth + 1);\n\n                var itemModel = node.getModel();\n                if (itemModel.get('r0') != null) {\n                    rStart = parsePercent(itemModel.get('r0'), size / 2);\n                }\n                if (itemModel.get('r') != null) {\n                    rEnd = parsePercent(itemModel.get('r'), size / 2);\n                }\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\n            // Render children\n            if (node.children && node.children.length) {\n                // currentAngle = startAngle;\n                var siblingAngle = 0;\n                zrUtil.each(node.children, function (node) {\n                    siblingAngle += renderNode(node, startAngle + siblingAngle);\n                });\n            }\n\n            return endAngle - startAngle;\n        };\n\n        // Virtual root node for roll up\n        if (renderRollupNode) {\n            var rStart = r0;\n            var rEnd = r0 + rPerLevel;\n\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\n        renderNode(treeRoot, startAngle);\n    });\n}\n\n/**\n * Init node children by order and update visual\n *\n * @param {TreeNode} node  root node\n * @param {boolean}  isAsc if is in ascendant order\n */\nfunction initChildren(node, isAsc) {\n    var children = node.children || [];\n\n    node.children = sort(children, isAsc);\n\n    // Init children recursively\n    if (children.length) {\n        zrUtil.each(node.children, function (child) {\n            initChildren(child, isAsc);\n        });\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 (typeof sortOrder === 'function') {\n        return children.sort(sortOrder);\n    }\n    else {\n        var isAsc = sortOrder === 'asc';\n        return children.sort(function (a, b) {\n            var diff = (a.getValue() - b.getValue()) * (isAsc ? 1 : -1);\n            return diff === 0\n                ? (a.dataIndex - b.dataIndex) * (isAsc ? -1 : 1)\n                : 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\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nimport './sunburst/SunburstSeries';\nimport './sunburst/SunburstView';\nimport './sunburst/sunburstAction';\n\nimport dataColor from '../visual/dataColor';\nimport sunburstLayout from './sunburst/sunburstLayout';\nimport dataFilter from '../processor/dataFilter';\n\necharts.registerVisual(zrUtil.curry(dataColor, 'sunburst'));\necharts.registerLayout(zrUtil.curry(sunburstLayout, 'sunburst'));\necharts.registerProcessor(zrUtil.curry(dataFilter, 'sunburst'));\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\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'\n            ? axis.getBandWidth()\n            : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n    }, this);\n}\n\nexport default function (coordSys) {\n    var rect = coordSys.grid.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\nimport * as zrUtil from 'zrender/src/core/util';\n\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}\n\nexport default function (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\nimport * as zrUtil from 'zrender/src/core/util';\n\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'\n        ? axis.getBandWidth()\n        : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n}\n\nexport default function (coordSys) {\n    var rect = coordSys.getRect();\n\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: 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\nimport * as zrUtil from 'zrender/src/core/util';\n\nfunction dataToCoordSize(dataSize, dataItem) {\n    // dataItem is necessary in log axis.\n    return zrUtil.map(['Radius', 'Angle'], function (dim, dimIdx) {\n        var axis = this['get' + dim + 'Axis']();\n        var val = dataItem[dimIdx];\n        var halfSize = dataSize[dimIdx] / 2;\n        var method = 'dataTo' + dim;\n\n        var result = axis.type === 'category'\n            ? axis.getBandWidth()\n            : Math.abs(axis[method](val - halfSize) - axis[method](val + halfSize));\n\n        if (dim === 'Angle') {\n            result = result * Math.PI / 180;\n        }\n\n        return result;\n\n    }, this);\n}\n\nexport default function (coordSys) {\n    var radiusAxis = coordSys.getRadiusAxis();\n    var angleAxis = coordSys.getAngleAxis();\n    var radius = radiusAxis.getExtent();\n    radius[0] > radius[1] && radius.reverse();\n\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: zrUtil.bind(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\nexport default function (coordSys) {\n    var rect = coordSys.getRect();\n    var rangeInfo = coordSys.getRangeInfo();\n\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        }\n    };\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphicUtil from '../util/graphic';\nimport {getDefaultLabel} from './helper/labelHelper';\nimport createListFromArray from './helper/createListFromArray';\nimport {getLayoutOnAxis} from '../layout/barGrid';\nimport DataDiffer from '../data/DataDiffer';\nimport SeriesModel from '../model/Series';\nimport Model from '../model/Model';\nimport ChartView from '../view/Chart';\n\nimport prepareCartesian2d from '../coord/cartesian/prepareCustom';\nimport prepareGeo from '../coord/geo/prepareCustom';\nimport prepareSingleAxis from '../coord/single/prepareCustom';\nimport preparePolar from '../coord/polar/prepareCustom';\nimport prepareCalendar from '../coord/calendar/prepareCustom';\n\nvar CACHED_LABEL_STYLE_PROPERTIES = graphicUtil.CACHED_LABEL_STYLE_PROPERTIES;\nvar ITEM_STYLE_NORMAL_PATH = ['itemStyle'];\nvar ITEM_STYLE_EMPHASIS_PATH = ['emphasis', 'itemStyle'];\nvar LABEL_NORMAL = ['label'];\nvar LABEL_EMPHASIS = ['emphasis', 'label'];\n// Use prefix to avoid index to be the same as el.name,\n// which will cause weird udpate animation.\nvar GROUP_DIFF_PREFIX = 'e\\0\\0';\n\n\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    singleAxis: prepareSingleAxis,\n    polar: preparePolar,\n    calendar: prepareCalendar\n};\n\n\n// ------\n// Model\n// ------\n\nSeriesModel.extend({\n\n    type: 'series.custom',\n\n    dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],\n\n    defaultOption: {\n        coordinateSystem: 'cartesian2d', // Can be set as 'none'\n        zlevel: 0,\n        z: 2,\n        legendHoverLink: true,\n\n        useTransform: true\n\n        // Cartesian coordinate system\n        // xAxisIndex: 0,\n        // yAxisIndex: 0,\n\n        // Polar coordinate system\n        // polarIndex: 0,\n\n        // Geo coordinate system\n        // geoIndex: 0,\n\n        // label: {}\n        // itemStyle: {}\n    },\n\n    /**\n     * @override\n     */\n    getInitialData: function (option, ecModel) {\n        return createListFromArray(this.getSource(), this);\n    },\n\n    /**\n     * @override\n     */\n    getDataParams: function (dataIndex, dataType, el) {\n        var params = SeriesModel.prototype.getDataParams.apply(this, arguments);\n        el && (params.info = el.info);\n        return params;\n    }\n});\n\n// -----\n// View\n// -----\n\nChartView.extend({\n\n    type: 'custom',\n\n    /**\n     * @private\n     * @type {module:echarts/data/List}\n     */\n    _data: null,\n\n    /**\n     * @override\n     */\n    render: function (customSeries, ecModel, api, payload) {\n        var oldData = this._data;\n        var data = customSeries.getData();\n        var group = this.group;\n        var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n\n        // By default, merge mode is applied. In most cases, custom series is\n        // used in the scenario that data amount is not large but graphic elements\n        // is complicated, where merge mode is probably necessary for optimization.\n        // For example, reuse graphic elements and only update the transform when\n        // roam or data zoom according to `actionType`.\n        data.diff(oldData)\n            .add(function (newIdx) {\n                createOrUpdate(\n                    null, newIdx, renderItem(newIdx, payload), customSeries, group, data\n                );\n            })\n            .update(function (newIdx, oldIdx) {\n                var el = oldData.getItemGraphicEl(oldIdx);\n                createOrUpdate(\n                    el, newIdx, renderItem(newIdx, payload), customSeries, group, data\n                );\n            })\n            .remove(function (oldIdx) {\n                var el = oldData.getItemGraphicEl(oldIdx);\n                el && group.remove(el);\n            })\n            .execute();\n\n        this._data = data;\n    },\n\n    incrementalPrepareRender: function (customSeries, ecModel, api) {\n        this.group.removeAll();\n        this._data = null;\n    },\n\n    incrementalRender: function (params, customSeries, ecModel, api, payload) {\n        var data = customSeries.getData();\n        var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n        function setIncrementalAndHoverLayer(el) {\n            if (!el.isGroup) {\n                el.incremental = true;\n                el.useHoverLayer = true;\n            }\n        }\n        for (var idx = params.start; idx < params.end; idx++) {\n            var el = createOrUpdate(null, idx, renderItem(idx, payload), customSeries, this.group, data);\n            el.traverse(setIncrementalAndHoverLayer);\n        }\n    },\n\n    /**\n     * @override\n     */\n    dispose: zrUtil.noop,\n\n    /**\n     * @override\n     */\n    filterForExposedEvent: function (eventType, query, targetEl, packedEvent) {\n        var elementName = query.element;\n        if (elementName == null || targetEl.name === elementName) {\n            return true;\n        }\n\n        // Enable to give a name on a group made by `renderItem`, and listen\n        // events that triggerd by its descendents.\n        while ((targetEl = targetEl.parent) && targetEl !== this.group) {\n            if (targetEl.name === elementName) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n});\n\n\nfunction createEl(elOption) {\n    var graphicType = elOption.type;\n    var el;\n\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            ? {\n                x: shape.x || 0,\n                y: shape.y || 0,\n                width: shape.width,\n                height: shape.height\n            }\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        el.__customPathData = pathData;\n    }\n    else if (graphicType === 'image') {\n        el = new graphicUtil.Image({});\n        el.__customImagePath = elOption.style.image;\n    }\n    else if (graphicType === 'text') {\n        el = new graphicUtil.Text({});\n        el.__customText = elOption.style.text;\n    }\n    else {\n        var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];\n\n        if (__DEV__) {\n            zrUtil.assert(Clz, 'graphic type \"' + graphicType + '\" can not be found.');\n        }\n\n        el = new Clz();\n    }\n\n    el.__customGraphicType = graphicType;\n    el.name = elOption.name;\n\n    return el;\n}\n\nfunction updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot) {\n    var transitionProps = {};\n    var elOptionStyle = elOption.style || {};\n\n    elOption.shape && (transitionProps.shape = zrUtil.clone(elOption.shape));\n    elOption.position && (transitionProps.position = elOption.position.slice());\n    elOption.scale && (transitionProps.scale = elOption.scale.slice());\n    elOption.origin && (transitionProps.origin = elOption.origin.slice());\n    elOption.rotation && (transitionProps.rotation = elOption.rotation);\n\n    if (el.type === 'image' && elOption.style) {\n        var targetStyle = transitionProps.style = {};\n        zrUtil.each(['x', 'y', 'width', 'height'], function (prop) {\n            prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);\n        });\n    }\n\n    if (el.type === 'text' && elOption.style) {\n        var targetStyle = transitionProps.style = {};\n        zrUtil.each(['x', 'y'], function (prop) {\n            prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);\n        });\n        // Compatible with previous: both support\n        // textFill and fill, textStroke and stroke in 'text' element.\n        !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && (\n            elOptionStyle.textFill = elOptionStyle.fill\n        );\n        !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && (\n            elOptionStyle.textStroke = elOptionStyle.stroke\n        );\n    }\n\n    if (el.type !== 'group') {\n        el.useStyle(elOptionStyle);\n\n        // Init animation.\n        if (isInit) {\n            el.style.opacity = 0;\n            var targetOpacity = elOptionStyle.opacity;\n            targetOpacity == null && (targetOpacity = 1);\n            graphicUtil.initProps(el, {style: {opacity: targetOpacity}}, animatableModel, dataIndex);\n        }\n    }\n\n    if (isInit) {\n        el.attr(transitionProps);\n    }\n    else {\n        graphicUtil.updateProps(el, transitionProps, animatableModel, dataIndex);\n    }\n\n    // Merge by default.\n    // z2 must not be null/undefined, otherwise sort error may occur.\n    elOption.hasOwnProperty('z2') && el.attr('z2', elOption.z2 || 0);\n    elOption.hasOwnProperty('silent') && el.attr('silent', elOption.silent);\n    elOption.hasOwnProperty('invisible') && el.attr('invisible', elOption.invisible);\n    elOption.hasOwnProperty('ignore') && el.attr('ignore', elOption.ignore);\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    elOption.hasOwnProperty('info') && el.attr('info', elOption.info);\n\n    // If `elOption.styleEmphasis` is `false`, remove hover style. The\n    // logic is ensured by `graphicUtil.setElementHoverStyle`.\n    var styleEmphasis = elOption.styleEmphasis;\n    var disableStyleEmphasis = styleEmphasis === false;\n    if (!(\n        // Try to escapse setting hover style for performance.\n        (el.__cusHasEmphStl && styleEmphasis == null)\n        || (!el.__cusHasEmphStl && disableStyleEmphasis)\n    )) {\n        // Should not use graphicUtil.setHoverStyle, since the styleEmphasis\n        // should not be share by group and its descendants.\n        graphicUtil.setElementHoverStyle(el, styleEmphasis);\n        el.__cusHasEmphStl = !disableStyleEmphasis;\n    }\n    if (isRoot) {\n        graphicUtil.setAsHighDownDispatcher(el, !disableStyleEmphasis);\n    }\n}\n\nfunction prepareStyleTransition(prop, targetStyle, elOptionStyle, oldElStyle, isInit) {\n    if (elOptionStyle[prop] != null && !isInit) {\n        targetStyle[prop] = elOptionStyle[prop];\n        elOptionStyle[prop] = oldElStyle[prop];\n    }\n}\n\nfunction makeRenderItem(customSeries, data, ecModel, api) {\n    var renderItem = customSeries.get('renderItem');\n    var coordSys = customSeries.coordinateSystem;\n    var prepareResult = {};\n\n    if (coordSys) {\n        if (__DEV__) {\n            zrUtil.assert(renderItem, 'series.render is required.');\n            zrUtil.assert(\n                coordSys.prepareCustoms || prepareCustoms[coordSys.type],\n                'This coordSys does not support custom series.'\n            );\n        }\n\n        prepareResult = coordSys.prepareCustoms\n            ? coordSys.prepareCustoms()\n            : prepareCustoms[coordSys.type](coordSys);\n    }\n\n    var userAPI = zrUtil.defaults({\n        getWidth: api.getWidth,\n        getHeight: api.getHeight,\n        getZr: api.getZr,\n        getDevicePixelRatio: api.getDevicePixelRatio,\n        value: value,\n        style: style,\n        styleEmphasis: styleEmphasis,\n        visual: visual,\n        barLayout: barLayout,\n        currentSeriesIndices: currentSeriesIndices,\n        font: font\n    }, prepareResult.api || {});\n\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    };\n\n    // Do not support call `api` asynchronously without dataIndexInside input.\n    var currDataIndexInside;\n    var currDirty = true;\n    var currItemModel;\n    var currLabelNormalModel;\n    var currLabelEmphasisModel;\n    var currVisualColor;\n\n    return function (dataIndexInside, payload) {\n        currDataIndexInside = dataIndexInside;\n        currDirty = true;\n\n        return renderItem && renderItem(\n            zrUtil.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),\n            userAPI\n        );\n    };\n\n    // Do not update cache until api called.\n    function updateCache(dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        if (currDirty) {\n            currItemModel = data.getItemModel(dataIndexInside);\n            currLabelNormalModel = currItemModel.getModel(LABEL_NORMAL);\n            currLabelEmphasisModel = currItemModel.getModel(LABEL_EMPHASIS);\n            currVisualColor = data.getItemVisual(dataIndexInside, 'color');\n\n            currDirty = false;\n        }\n    }\n\n    /**\n     * @public\n     * @param {number|string} dim\n     * @param {number} [dataIndexInside=currDataIndexInside]\n     * @return {number|string} value\n     */\n    function value(dim, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        return data.get(data.getDimension(dim || 0), dataIndexInside);\n    }\n\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     * @public\n     * @param {Object} [extra]\n     * @param {number} [dataIndexInside=currDataIndexInside]\n     */\n    function style(extra, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        updateCache(dataIndexInside);\n\n        var itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle();\n\n        currVisualColor != null && (itemStyle.fill = currVisualColor);\n        var opacity = data.getItemVisual(dataIndexInside, 'opacity');\n        opacity != null && (itemStyle.opacity = opacity);\n\n        var labelModel = extra\n            ? applyExtraBefore(extra, currLabelNormalModel)\n            : currLabelNormalModel;\n\n        graphicUtil.setTextStyle(itemStyle, labelModel, null, {\n            autoColor: currVisualColor,\n            isRectText: true\n        });\n\n        itemStyle.text = labelModel.getShallow('show')\n            ? zrUtil.retrieve2(\n                customSeries.getFormattedLabel(dataIndexInside, 'normal'),\n                getDefaultLabel(data, dataIndexInside)\n            )\n            : null;\n\n        extra && applyExtraAfter(itemStyle, extra);\n\n        return itemStyle;\n    }\n\n    /**\n     * @public\n     * @param {Object} [extra]\n     * @param {number} [dataIndexInside=currDataIndexInside]\n     */\n    function styleEmphasis(extra, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        updateCache(dataIndexInside);\n\n        var itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle();\n\n        var labelModel = extra\n            ? applyExtraBefore(extra, currLabelEmphasisModel)\n            : currLabelEmphasisModel;\n\n        graphicUtil.setTextStyle(itemStyle, labelModel, null, {\n            isRectText: true\n        }, true);\n\n        itemStyle.text = labelModel.getShallow('show')\n            ? zrUtil.retrieve3(\n                customSeries.getFormattedLabel(dataIndexInside, 'emphasis'),\n                customSeries.getFormattedLabel(dataIndexInside, 'normal'),\n                getDefaultLabel(data, dataIndexInside)\n            )\n            : null;\n\n        extra && applyExtraAfter(itemStyle, extra);\n\n        return itemStyle;\n    }\n\n    /**\n     * @public\n     * @param {string} visualType\n     * @param {number} [dataIndexInside=currDataIndexInside]\n     */\n    function visual(visualType, dataIndexInside) {\n        dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n        return data.getItemVisual(dataIndexInside, visualType);\n    }\n\n    /**\n     * @public\n     * @param {number} opt.count Positive interger.\n     * @param {number} [opt.barWidth]\n     * @param {number} [opt.barMaxWidth]\n     * @param {number} [opt.barGap]\n     * @param {number} [opt.barCategoryGap]\n     * @return {Object} {width, offset, offsetCenter} is not support, return undefined.\n     */\n    function barLayout(opt) {\n        if (coordSys.getBaseAxis) {\n            var baseAxis = coordSys.getBaseAxis();\n            return getLayoutOnAxis(zrUtil.defaults({axis: baseAxis}, opt), api);\n        }\n    }\n\n    /**\n     * @public\n     * @return {Array.<number>}\n     */\n    function currentSeriesIndices() {\n        return ecModel.getCurrentSeriesIndices();\n    }\n\n    /**\n     * @public\n     * @param {Object} opt\n     * @param {string} [opt.fontStyle]\n     * @param {number} [opt.fontWeight]\n     * @param {number} [opt.fontSize]\n     * @param {string} [opt.fontFamily]\n     * @return {string} font string\n     */\n    function font(opt) {\n        return graphicUtil.getFont(opt, ecModel);\n    }\n}\n\nfunction wrapEncodeDef(data) {\n    var encodeDef = {};\n    zrUtil.each(data.dimensions, function (dimName, dataDimIndex) {\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] = dataDimIndex;\n        }\n    });\n    return encodeDef;\n}\n\nfunction createOrUpdate(el, dataIndex, elOption, animatableModel, group, data) {\n    el = doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data, true);\n    el && data.setItemGraphicEl(dataIndex, el);\n\n    return el;\n}\n\nfunction doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data, isRoot) {\n\n    // [Rule]\n    // By default, follow merge mode.\n    //     (It probably brings benifit for performance in some cases of large data, where\n    //     user program can be optimized to that only updated props needed to be re-calculated,\n    //     or according to `actionType` some calculation can be skipped.)\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\n    var simplyRemove = !elOption; // `null`/`undefined`/`false`\n    elOption = elOption || {};\n    var elOptionType = elOption.type;\n    var elOptionShape = elOption.shape;\n    var elOptionStyle = elOption.style;\n\n    if (el && (\n        simplyRemove\n        // || elOption.$merge === false\n        // If `elOptionType` is `null`, follow the merge principle.\n        || (elOptionType != null\n            && elOptionType !== el.__customGraphicType\n        )\n        || (elOptionType === 'path'\n            && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== el.__customPathData\n        )\n        || (elOptionType === 'image'\n            && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== el.__customImagePath\n        )\n        // FIXME test and remove this restriction?\n        || (elOptionType === 'text'\n            && hasOwn(elOptionShape, 'text') && elOptionStyle.text !== el.__customText\n        )\n    )) {\n        group.remove(el);\n        el = null;\n    }\n\n    // `elOption.type` is undefined when `renderItem` returns nothing.\n    if (simplyRemove) {\n        return;\n    }\n\n    var isInit = !el;\n    !el && (el = createEl(elOption));\n    updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot);\n\n    if (elOptionType === 'group') {\n        mergeChildren(el, dataIndex, elOption, animatableModel, data);\n    }\n\n    // Always add whatever already added to ensure sequence.\n    group.add(el);\n\n    return el;\n}\n\n// Usage:\n// (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that\n//     the existing children will not be removed, and enables the feature that\n//     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 happen.\n//\n// For implementation simpleness, do not provide a direct way to remove sinlge\n// child (otherwise the total indicies of the children array have to be modified).\n// User can remove a single child by set its `ignore` as `true` or replace\n// it by another element, where its `$merge` can be set as `true` if necessary.\nfunction mergeChildren(el, dataIndex, elOption, animatableModel, data) {\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\n    // For better performance on roam update, only enter if necessary.\n    if (!newLen && !byName && !notMerge) {\n        return;\n    }\n\n    if (byName) {\n        diffGroupChildren({\n            oldChildren: el.children() || [],\n            newChildren: newChildren || [],\n            dataIndex: dataIndex,\n            animatableModel: animatableModel,\n            group: el,\n            data: data\n        });\n        return;\n    }\n\n    notMerge && el.removeAll();\n\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        newChildren[index] && doCreateOrUpdate(\n            el.childAt(index),\n            dataIndex,\n            newChildren[index],\n            animatableModel,\n            el,\n            data\n        );\n    }\n    if (__DEV__) {\n        zrUtil.assert(\n            !notMerge || el.childCount() === index,\n            'MUST NOT contain empty item in children array when `group.$mergeChildren` is `false`.'\n        );\n    }\n}\n\nfunction diffGroupChildren(context) {\n    (new DataDiffer(\n        context.oldChildren,\n        context.newChildren,\n        getKey,\n        getKey,\n        context\n    ))\n        .add(processAddUpdate)\n        .update(processAddUpdate)\n        .remove(processRemove)\n        .execute();\n}\n\nfunction getKey(item, idx) {\n    var name = item && item.name;\n    return name != null ? name : GROUP_DIFF_PREFIX + idx;\n}\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\n    doCreateOrUpdate(\n        child,\n        context.dataIndex,\n        childOption,\n        context.animatableModel,\n        context.group,\n        context.data\n    );\n}\n\n// `graphic#applyDefaultTextStyle` will cache\n// textFill, textStroke, textStrokeWidth.\n// We have to do this trick.\nfunction applyExtraBefore(extra, model) {\n    var dummyModel = new Model({}, model);\n    zrUtil.each(CACHED_LABEL_STYLE_PROPERTIES, function (stylePropName, modelPropName) {\n        if (extra.hasOwnProperty(stylePropName)) {\n            dummyModel.option[modelPropName] = extra[stylePropName];\n        }\n    });\n    return dummyModel;\n}\n\nfunction applyExtraAfter(itemStyle, extra) {\n    for (var key in extra) {\n        if (extra.hasOwnProperty(key)\n            || !CACHED_LABEL_STYLE_PROPERTIES.hasOwnProperty(key)\n        ) {\n            itemStyle[key] = extra[key];\n        }\n    }\n}\n\nfunction processRemove(oldIndex) {\n    var context = this.context;\n    var child = context.oldChildren[oldIndex];\n    child && context.group.remove(child);\n}\n\nfunction getPathData(shape) {\n    // \"d\" follows the SVG convention.\n    return shape && (shape.pathData || shape.d);\n}\n\nfunction hasOwnPathData(shape) {\n    return shape && (shape.hasOwnProperty('pathData') || shape.hasOwnProperty('d'));\n}\n\nfunction hasOwn(host, prop) {\n    return host && host.hasOwnProperty(prop);\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport './gridSimple';\nimport './axisPointer/CartesianAxisPointer';\nimport './axisPointer';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {parsePercent} from '../util/number';\nimport {isDimensionStacked} from '../data/helper/dataStackHelper';\n\nfunction getSeriesStackId(seriesModel) {\n    return seriesModel.get('stack')\n        || '__ec_stack_' + seriesModel.seriesIndex;\n}\n\nfunction getAxisKey(polar, axis) {\n    return axis.dim + polar.model.componentIndex;\n}\n\n/**\n * @param {string} seriesType\n * @param {module:echarts/model/Global} ecModel\n * @param {module:echarts/ExtensionAPI} api\n */\nfunction barLayoutPolar(seriesType, ecModel, api) {\n\n    var lastStackCoords = {};\n\n    var barWidthAndOffset = calRadialBar(\n        zrUtil.filter(\n            ecModel.getSeriesByType(seriesType),\n            function (seriesModel) {\n                return !ecModel.isSeriesFiltered(seriesModel)\n                    && seriesModel.coordinateSystem\n                    && seriesModel.coordinateSystem.type === 'polar';\n            }\n        )\n    );\n\n    ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n\n        // Check series coordinate, do layout for polar only\n        if (seriesModel.coordinateSystem.type !== 'polar') {\n            return;\n        }\n\n        var data = seriesModel.getData();\n        var polar = seriesModel.coordinateSystem;\n        var baseAxis = polar.getBaseAxis();\n        var axisKey = getAxisKey(polar, baseAxis);\n\n        var stackId = getSeriesStackId(seriesModel);\n        var columnLayoutInfo\n            = barWidthAndOffset[axisKey][stackId];\n        var columnOffset = columnLayoutInfo.offset;\n        var columnWidth = columnLayoutInfo.width;\n        var valueAxis = polar.getOtherAxis(baseAxis);\n\n        var cx = seriesModel.coordinateSystem.cx;\n        var cy = seriesModel.coordinateSystem.cy;\n\n        var barMinHeight = seriesModel.get('barMinHeight') || 0;\n        var barMinAngle = seriesModel.get('barMinAngle') || 0;\n\n        lastStackCoords[stackId] = lastStackCoords[stackId] || [];\n\n        var valueDim = data.mapDimension(valueAxis.dim);\n        var baseDim = data.mapDimension(baseAxis.dim);\n        var stacked = isDimensionStacked(data, valueDim /*, baseDim*/);\n\n        var valueAxisStart = valueAxis.getExtent()[0];\n\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\n            if (isNaN(value)) {\n                continue;\n            }\n\n            var sign = value >= 0 ? 'p' : 'n';\n            var baseCoord = valueAxisStart;\n\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, // Positive stack\n                        n: valueAxisStart  // Negative stack\n                    };\n                }\n                // Should also consider #4243\n                baseCoord = lastStackCoords[stackId][baseValue][sign];\n            }\n\n            var r0;\n            var r;\n            var startAngle;\n            var endAngle;\n\n            // radial sector\n            if (valueAxis.dim === 'radius') {\n                var radiusSpan = valueAxis.dataToRadius(value) - valueAxisStart;\n                var angle = baseAxis.dataToAngle(baseValue);\n\n                if (Math.abs(radiusSpan) < barMinHeight) {\n                    radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight;\n                }\n\n                r0 = baseCoord;\n                r = baseCoord + radiusSpan;\n                startAngle = angle - columnOffset;\n                endAngle = startAngle - columnWidth;\n\n                stacked && (lastStackCoords[stackId][baseValue][sign] = r);\n            }\n            // tangential sector\n            else {\n                // angleAxis must be clamped.\n                var angleSpan = valueAxis.dataToAngle(value, true) - valueAxisStart;\n                var radius = baseAxis.dataToRadius(baseValue);\n\n                if (Math.abs(angleSpan) < barMinAngle) {\n                    angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle;\n                }\n\n                r0 = radius + columnOffset;\n                r = r0 + columnWidth;\n                startAngle = baseCoord;\n                endAngle = baseCoord + angleSpan;\n\n                // if the previous stack is at the end of the ring,\n                // add a round to differentiate it from origin\n                // var extent = angleAxis.getExtent();\n                // var 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\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\n        }\n\n    }, this);\n\n}\n\n/**\n * Calculate bar width and offset for radial bar charts\n */\nfunction calRadialBar(barSeries, api) {\n    // Columns info on each category axis. Key is polar name\n    var columnsMap = {};\n\n    zrUtil.each(barSeries, function (seriesModel, idx) {\n        var data = seriesModel.getData();\n        var polar = seriesModel.coordinateSystem;\n\n        var baseAxis = polar.getBaseAxis();\n        var axisKey = getAxisKey(polar, baseAxis);\n\n        var axisExtent = baseAxis.getExtent();\n        var bandWidth = baseAxis.type === 'category'\n            ? baseAxis.getBandWidth()\n            : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());\n\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\n        var stackId = getSeriesStackId(seriesModel);\n\n        if (!stacks[stackId]) {\n            columnsOnAxis.autoWidthCount++;\n        }\n        stacks[stackId] = stacks[stackId] || {\n            width: 0,\n            maxWidth: 0\n        };\n\n        var barWidth = parsePercent(\n            seriesModel.get('barWidth'),\n            bandWidth\n        );\n        var barMaxWidth = parsePercent(\n            seriesModel.get('barMaxWidth'),\n            bandWidth\n        );\n        var barGap = seriesModel.get('barGap');\n        var barCategoryGap = seriesModel.get('barCategoryGap');\n\n        if (barWidth && !stacks[stackId].width) {\n            barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);\n            stacks[stackId].width = barWidth;\n            columnsOnAxis.remainedWidth -= barWidth;\n        }\n\n        barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n        (barGap != null) && (columnsOnAxis.gap = barGap);\n        (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);\n    });\n\n\n    var result = {};\n\n    zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) {\n\n        result[coordSysName] = {};\n\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\n        var remainedWidth = columnsOnAxis.remainedWidth;\n        var autoWidthCount = columnsOnAxis.autoWidthCount;\n        var autoWidth = (remainedWidth - categoryGap)\n            / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n\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\n        // Recalculate width again\n        autoWidth = (remainedWidth - categoryGap)\n            / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n        autoWidth = Math.max(autoWidth, 0);\n\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\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\n            offset += column.width * (1 + barGapPercent);\n        });\n    });\n\n    return result;\n}\n\nexport default barLayoutPolar;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../Axis';\n\nfunction RadiusAxis(scale, radiusExtent) {\n\n    Axis.call(this, 'radius', scale, radiusExtent);\n\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = 'category';\n}\n\nRadiusAxis.prototype = {\n\n    constructor: RadiusAxis,\n\n    /**\n     * @override\n     */\n    pointToData: function (point, clamp) {\n        return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n    },\n\n    dataToRadius: Axis.prototype.dataToCoord,\n\n    radiusToData: Axis.prototype.coordToData\n};\n\nzrUtil.inherits(RadiusAxis, Axis);\n\nexport default RadiusAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as textContain from 'zrender/src/contain/text';\nimport Axis from '../Axis';\nimport {makeInner} from '../../util/model';\n\nvar inner = makeInner();\n\nfunction AngleAxis(scale, angleExtent) {\n\n    angleExtent = angleExtent || [0, 360];\n\n    Axis.call(this, 'angle', scale, angleExtent);\n\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = 'category';\n}\n\nAngleAxis.prototype = {\n\n    constructor: AngleAxis,\n\n    /**\n     * @override\n     */\n    pointToData: function (point, clamp) {\n        return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n    },\n\n    dataToAngle: Axis.prototype.dataToCoord,\n\n    angleToData: Axis.prototype.coordToData,\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    calculateCategoryInterval: function () {\n        var axis = this;\n        var labelModel = axis.getLabelModel();\n\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\n        if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n            return 0;\n        }\n\n        var tickValue = ordinalExtent[0];\n        var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);\n        var unitH = Math.abs(unitSpan);\n\n        // Not precise, just use height as text width\n        // and each distance from axis line yet.\n        var rect = textContain.getBoundingRect(\n            tickValue, labelModel.getFont(), 'center', 'top'\n        );\n        var maxH = Math.max(rect.height, 7);\n\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\n        var cache = inner(axis.model);\n        var lastAutoInterval = cache.lastAutoInterval;\n        var lastTickCount = cache.lastTickCount;\n\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\n            && lastTickCount != null\n            && Math.abs(lastAutoInterval - interval) <= 1\n            && 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        ) {\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\n        return interval;\n    }\n};\n\nzrUtil.inherits(AngleAxis, Axis);\n\nexport default AngleAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * @module echarts/coord/polar/Polar\n */\n\nimport RadiusAxis from './RadiusAxis';\nimport AngleAxis from './AngleAxis';\n\n/**\n * @alias {module:echarts/coord/polar/Polar}\n * @constructor\n * @param {string} name\n */\nvar Polar = function (name) {\n\n    /**\n     * @type {string}\n     */\n    this.name = name || '';\n\n    /**\n     * x of polar center\n     * @type {number}\n     */\n    this.cx = 0;\n\n    /**\n     * y of polar center\n     * @type {number}\n     */\n    this.cy = 0;\n\n    /**\n     * @type {module:echarts/coord/polar/RadiusAxis}\n     * @private\n     */\n    this._radiusAxis = new RadiusAxis();\n\n    /**\n     * @type {module:echarts/coord/polar/AngleAxis}\n     * @private\n     */\n    this._angleAxis = new AngleAxis();\n\n    this._radiusAxis.polar = this._angleAxis.polar = this;\n};\n\nPolar.prototype = {\n\n    type: 'polar',\n\n    axisPointerEnabled: true,\n\n    constructor: Polar,\n\n    /**\n     * @param {Array.<string>}\n     * @readOnly\n     */\n    dimensions: ['radius', 'angle'],\n\n    /**\n     * @type {module:echarts/coord/PolarModel}\n     */\n    model: null,\n\n    /**\n     * If contain coord\n     * @param {Array.<number>} point\n     * @return {boolean}\n     */\n    containPoint: function (point) {\n        var coord = this.pointToCoord(point);\n        return this._radiusAxis.contain(coord[0])\n            && this._angleAxis.contain(coord[1]);\n    },\n\n    /**\n     * If contain data\n     * @param {Array.<number>} data\n     * @return {boolean}\n     */\n    containData: function (data) {\n        return this._radiusAxis.containData(data[0])\n            && this._angleAxis.containData(data[1]);\n    },\n\n    /**\n     * @param {string} dim\n     * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}\n     */\n    getAxis: function (dim) {\n        return this['_' + dim + 'Axis'];\n    },\n\n    /**\n     * @return {Array.<module:echarts/coord/Axis>}\n     */\n    getAxes: function () {\n        return [this._radiusAxis, this._angleAxis];\n    },\n\n    /**\n     * Get axes by type of scale\n     * @param {string} scaleType\n     * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}\n     */\n    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\n        return axes;\n    },\n\n    /**\n     * @return {module:echarts/coord/polar/AngleAxis}\n     */\n    getAngleAxis: function () {\n        return this._angleAxis;\n    },\n\n    /**\n     * @return {module:echarts/coord/polar/RadiusAxis}\n     */\n    getRadiusAxis: function () {\n        return this._radiusAxis;\n    },\n\n    /**\n     * @param {module:echarts/coord/polar/Axis}\n     * @return {module:echarts/coord/polar/Axis}\n     */\n    getOtherAxis: function (axis) {\n        var angleAxis = this._angleAxis;\n        return axis === angleAxis ? this._radiusAxis : angleAxis;\n    },\n\n    /**\n     * Base axis will be used on stacking.\n     *\n     * @return {module:echarts/coord/polar/Axis}\n     */\n    getBaseAxis: function () {\n        return this.getAxesByScale('ordinal')[0]\n            || this.getAxesByScale('time')[0]\n            || this.getAngleAxis();\n    },\n\n    /**\n     * @param {string} [dim] 'radius' or 'angle' or 'auto' or null/undefined\n     * @return {Object} {baseAxes: [], otherAxes: []}\n     */\n    getTooltipAxes: function (dim) {\n        var baseAxis = (dim != null && dim !== 'auto')\n            ? this.getAxis(dim) : this.getBaseAxis();\n        return {\n            baseAxes: [baseAxis],\n            otherAxes: [this.getOtherAxis(baseAxis)]\n        };\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     * @param {Array.<number>} data\n     * @param {boolean} [clamp=false]\n     * @return {Array.<number>}\n     */\n    dataToPoint: function (data, clamp) {\n        return this.coordToPoint([\n            this._radiusAxis.dataToRadius(data[0], clamp),\n            this._angleAxis.dataToAngle(data[1], clamp)\n        ]);\n    },\n\n    /**\n     * Convert a (x, y) point to data\n     * @param {Array.<number>} point\n     * @param {boolean} [clamp=false]\n     * @return {Array.<number>}\n     */\n    pointToData: function (point, clamp) {\n        var coord = this.pointToCoord(point);\n        return [\n            this._radiusAxis.radiusToData(coord[0], clamp),\n            this._angleAxis.angleToData(coord[1], clamp)\n        ];\n    },\n\n    /**\n     * Convert a (x, y) point to (radius, angle) coord\n     * @param {Array.<number>} point\n     * @return {Array.<number>}\n     */\n    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\n            ? (minAngle = maxAngle - 360)\n            : (maxAngle = minAngle + 360);\n\n        var radius = Math.sqrt(dx * dx + dy * dy);\n        dx /= radius;\n        dy /= radius;\n\n        var radian = Math.atan2(-dy, dx) / Math.PI * 180;\n\n        // move to angleExtent\n        var dir = radian < minAngle ? 1 : -1;\n        while (radian < minAngle || radian > maxAngle) {\n            radian += dir * 360;\n        }\n\n        return [radius, radian];\n    },\n\n    /**\n     * Convert a (radius, angle) coord to (x, y) point\n     * @param {Array.<number>} coord\n     * @return {Array.<number>}\n     */\n    coordToPoint: function (coord) {\n        var radius = coord[0];\n        var radian = coord[1] / 180 * Math.PI;\n        var x = Math.cos(radian) * radius + this.cx;\n        // Inverse the y\n        var y = -Math.sin(radian) * radius + this.cy;\n\n        return [x, y];\n    }\n\n};\n\nexport default Polar;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport axisModelCreator from '../axisModelCreator';\nimport axisModelCommonMixin from '../axisModelCommonMixin';\n\nvar PolarAxisModel = ComponentModel.extend({\n\n    type: 'polarAxis',\n\n    /**\n     * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}\n     */\n    axis: null,\n\n    /**\n     * @override\n     */\n    getCoordSysModel: function () {\n        return this.ecModel.queryComponents({\n            mainType: 'polar',\n            index: this.option.polarIndex,\n            id: this.option.polarId\n        })[0];\n    }\n\n});\n\nzrUtil.merge(PolarAxisModel.prototype, axisModelCommonMixin);\n\nvar polarAxisDefaultExtendedOption = {\n    angle: {\n        // polarIndex: 0,\n        // polarId: '',\n\n        startAngle: 90,\n\n        clockwise: true,\n\n        splitNumber: 12,\n\n        axisLabel: {\n            rotate: false\n        }\n    },\n    radius: {\n        // polarIndex: 0,\n        // polarId: '',\n\n        splitNumber: 5\n    }\n};\n\nfunction getAxisType(axisDim, option) {\n    // Default axis with data is category axis\n    return option.type || (option.data ? 'category' : 'value');\n}\n\naxisModelCreator('angle', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.angle);\naxisModelCreator('radius', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.radius);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport './AxisModel';\n\nexport default echarts.extendComponentModel({\n\n    type: 'polar',\n\n    dependencies: ['polarAxis', 'angleAxis'],\n\n    /**\n     * @type {module:echarts/coord/polar/Polar}\n     */\n    coordinateSystem: null,\n\n    /**\n     * @param {string} axisType\n     * @return {module:echarts/coord/polar/AxisModel}\n     */\n    findAxisModel: function (axisType) {\n        var foundAxisModel;\n        var ecModel = this.ecModel;\n\n        ecModel.eachComponent(axisType, function (axisModel) {\n            if (axisModel.getCoordSysModel() === this) {\n                foundAxisModel = axisModel;\n            }\n        }, this);\n        return foundAxisModel;\n    },\n\n    defaultOption: {\n\n        zlevel: 0,\n\n        z: 0,\n\n        center: ['50%', '50%'],\n\n        radius: '80%'\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// TODO Axis scale\n\nimport {__DEV__} from '../../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport Polar from './Polar';\nimport {parsePercent} from '../../util/number';\nimport {\n    createScaleByModel,\n    niceScaleExtent\n} from '../../coord/axisHelper';\nimport CoordinateSystem from '../../CoordinateSystem';\nimport {getStackedDimension} from '../../data/helper/dataStackHelper';\n\nimport './PolarModel';\n\n/**\n * Resize method bound to the polar\n * @param {module:echarts/coord/polar/PolarModel} polarModel\n * @param {module:echarts/ExtensionAPI} api\n */\nfunction resizePolar(polar, polarModel, api) {\n    var center = polarModel.get('center');\n    var width = api.getWidth();\n    var height = api.getHeight();\n\n    polar.cx = parsePercent(center[0], width);\n    polar.cy = parsePercent(center[1], height);\n\n    var radiusAxis = polar.getRadiusAxis();\n    var size = Math.min(width, height) / 2;\n    var radius = parsePercent(polarModel.get('radius'), size);\n    radiusAxis.inverse\n        ? radiusAxis.setExtent(radius, 0)\n        : radiusAxis.setExtent(0, radius);\n}\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\n    ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.coordinateSystem === polar) {\n            var data = seriesModel.getData();\n            zrUtil.each(data.mapDimension('radius', true), function (dim) {\n                radiusAxis.scale.unionExtentFromData(\n                    data, getStackedDimension(data, dim)\n                );\n            });\n            zrUtil.each(data.mapDimension('angle', true), function (dim) {\n                angleAxis.scale.unionExtentFromData(\n                    data, getStackedDimension(data, dim)\n                );\n            });\n        }\n    });\n\n    niceScaleExtent(angleAxis.scale, angleAxis.model);\n    niceScaleExtent(radiusAxis.scale, radiusAxis.model);\n\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}\n\n/**\n * Set common axis properties\n * @param {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}\n * @param {module:echarts/coord/polar/AxisModel}\n * @inner\n */\nfunction setAxis(axis, axisModel) {\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\n    if (axisModel.mainType === 'angleAxis') {\n        axis.inverse ^= axisModel.get('clockwise');\n        var startAngle = axisModel.get('startAngle');\n        axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360));\n    }\n\n    // Inject axis instance\n    axisModel.axis = axis;\n    axis.model = axisModel;\n}\n\n\nvar polarCreator = {\n\n    dimensions: Polar.prototype.dimensions,\n\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\n            var radiusAxis = polar.getRadiusAxis();\n            var angleAxis = polar.getAngleAxis();\n\n            var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n            var angleAxisModel = polarModel.findAxisModel('angleAxis');\n\n            setAxis(radiusAxis, radiusAxisModel);\n            setAxis(angleAxis, angleAxisModel);\n\n            resizePolar(polar, polarModel, api);\n\n            polarList.push(polar);\n\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 = ecModel.queryComponents({\n                    mainType: 'polar',\n                    index: seriesModel.get('polarIndex'),\n                    id: seriesModel.get('polarId')\n                })[0];\n\n                if (__DEV__) {\n                    if (!polarModel) {\n                        throw new Error(\n                            'Polar \"' + zrUtil.retrieve(\n                                seriesModel.get('polarIndex'),\n                                seriesModel.get('polarId'),\n                                0\n                            ) + '\" not found'\n                        );\n                    }\n                }\n                seriesModel.coordinateSystem = polarModel.coordinateSystem;\n            }\n        });\n\n        return polarList;\n    }\n};\n\nCoordinateSystem.register('polar', polarCreator);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport Model from '../../model/Model';\nimport AxisView from './AxisView';\nimport AxisBuilder from './AxisBuilder';\n\nvar elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];\n\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\n    return {\n        x1: start[0],\n        y1: start[1],\n        x2: end[0],\n        y2: end[1]\n    };\n}\n\nfunction getRadiusIdx(polar) {\n    var radiusAxis = polar.getRadiusAxis();\n    return radiusAxis.inverse ? 0 : 1;\n}\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\n        && lastItem\n        && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4\n    ) {\n        list.pop();\n    }\n}\n\nexport default AxisView.extend({\n\n    type: 'angleAxis',\n\n    axisPointerClass: 'PolarAxisPointer',\n\n    render: function (angleAxisModel, ecModel) {\n        this.group.removeAll();\n        if (!angleAxisModel.get('show')) {\n            return;\n        }\n\n        var angleAxis = angleAxisModel.axis;\n        var polar = angleAxis.polar;\n        var radiusExtent = polar.getRadiusAxis().getExtent();\n\n        var ticksAngles = angleAxis.getTicksCoords();\n        var labels = zrUtil.map(angleAxis.getViewLabels(), function (labelItem) {\n            var labelItem = zrUtil.clone(labelItem);\n            labelItem.coord = angleAxis.dataToCoord(labelItem.tickValue);\n            return labelItem;\n        });\n\n        fixAngleOverlap(labels);\n        fixAngleOverlap(ticksAngles);\n\n        zrUtil.each(elementList, function (name) {\n            if (angleAxisModel.get(name + '.show')\n                && (!angleAxis.scale.isBlank() || name === 'axisLine')\n            ) {\n                this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent, labels);\n            }\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n        var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle');\n\n        var circle = new graphic.Circle({\n            shape: {\n                cx: polar.cx,\n                cy: polar.cy,\n                r: radiusExtent[getRadiusIdx(polar)]\n            },\n            style: lineStyleModel.getLineStyle(),\n            z2: 1,\n            silent: true\n        });\n        circle.style.fill = null;\n\n        this.group.add(circle);\n    },\n\n    /**\n     * @private\n     */\n    _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n        var tickModel = angleAxisModel.getModel('axisTick');\n\n        var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');\n        var radius = radiusExtent[getRadiusIdx(polar)];\n\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        this.group.add(graphic.mergePath(\n            lines, {\n                style: zrUtil.defaults(\n                    tickModel.getModel('lineStyle').getLineStyle(),\n                    {\n                        stroke: angleAxisModel.get('axisLine.lineStyle.color')\n                    }\n                )\n            }\n        ));\n    },\n\n    /**\n     * @private\n     */\n    _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent, labels) {\n        var rawCategoryData = angleAxisModel.getCategories(true);\n\n        var commonLabelModel = angleAxisModel.getModel('axisLabel');\n\n        var labelMargin = commonLabelModel.get('margin');\n        var triggerEvent = angleAxisModel.get('triggerEvent');\n\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\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\n            var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3\n                ? 'center' : (p[0] > cx ? 'left' : 'right');\n            var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3\n                ? 'middle' : (p[1] > cy ? 'top' : 'bottom');\n\n            if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) {\n                labelModel = new Model(\n                    rawCategoryData[tickValue].textStyle, commonLabelModel, commonLabelModel.ecModel\n                );\n            }\n\n            var textEl = new graphic.Text({\n                silent: AxisBuilder.isLabelSilent(angleAxisModel)\n            });\n            this.group.add(textEl);\n            graphic.setTextStyle(textEl.style, labelModel, {\n                x: p[0],\n                y: p[1],\n                textFill: labelModel.getTextColor() || angleAxisModel.get('axisLine.lineStyle.color'),\n                text: labelItem.formattedLabel,\n                textAlign: labelTextAlign,\n                textVerticalAlign: labelTextVerticalAlign\n            });\n\n            // Pack data for mouse event\n            if (triggerEvent) {\n                textEl.eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel);\n                textEl.eventData.targetType = 'axisLabel';\n                textEl.eventData.value = labelItem.rawLabel;\n            }\n\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n        var splitLineModel = angleAxisModel.getModel('splitLine');\n        var lineStyleModel = splitLineModel.getModel('lineStyle');\n        var lineColors = lineStyleModel.get('color');\n        var lineCount = 0;\n\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\n        var splitLines = [];\n\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\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitLines.length; i++) {\n            this.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\n    /**\n     * @private\n     */\n    _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n        if (!ticksAngles.length) {\n            return;\n        }\n\n        var splitAreaModel = angleAxisModel.getModel('splitArea');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var areaColors = areaStyleModel.get('color');\n        var lineCount = 0;\n\n        areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n\n        var splitAreas = [];\n\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\n        var clockwise = angleAxisModel.get('clockwise');\n\n        for (var i = 1; i < ticksAngles.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: r0,\n                    r: r1,\n                    startAngle: prevAngle,\n                    endAngle: -ticksAngles[i].coord * RADIAN,\n                    clockwise: clockwise\n                },\n                silent: true\n            }));\n            prevAngle = -ticksAngles[i].coord * RADIAN;\n        }\n\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitAreas.length; i++) {\n            this.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* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/polar/polarCreator';\nimport './axis/AngleAxisView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport AxisBuilder from './AxisBuilder';\nimport AxisView from './AxisView';\n\nvar axisBuilderAttrs = [\n    'axisLine', 'axisTickLabel', 'axisName'\n];\nvar selfBuilderAttrs = [\n    'splitLine', 'splitArea'\n];\n\nexport default AxisView.extend({\n\n    type: 'radiusAxis',\n\n    axisPointerClass: 'PolarAxisPointer',\n\n    render: function (radiusAxisModel, ecModel) {\n        this.group.removeAll();\n        if (!radiusAxisModel.get('show')) {\n            return;\n        }\n        var radiusAxis = radiusAxisModel.axis;\n        var polar = radiusAxis.polar;\n        var angleAxis = polar.getAngleAxis();\n        var ticksCoords = radiusAxis.getTicksCoords();\n        var axisAngle = angleAxis.getExtent()[0];\n        var radiusExtent = radiusAxis.getExtent();\n\n        var layout = layoutAxis(polar, radiusAxisModel, axisAngle);\n        var axisBuilder = new AxisBuilder(radiusAxisModel, layout);\n        zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n        this.group.add(axisBuilder.getGroup());\n\n        zrUtil.each(selfBuilderAttrs, function (name) {\n            if (radiusAxisModel.get(name + '.show') && !radiusAxis.scale.isBlank()) {\n                this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords);\n            }\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _splitLine: function (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\n        lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\n        var splitLines = [];\n\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.Circle({\n                shape: {\n                    cx: polar.cx,\n                    cy: polar.cy,\n                    r: ticksCoords[i].coord\n                },\n                silent: true\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            this.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\n    /**\n     * @private\n     */\n    _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n        if (!ticksCoords.length) {\n            return;\n        }\n\n        var splitAreaModel = radiusAxisModel.getModel('splitArea');\n        var areaStyleModel = splitAreaModel.getModel('areaStyle');\n        var areaColors = areaStyleModel.get('color');\n        var lineCount = 0;\n\n        areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n\n        var splitAreas = [];\n\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\n        // Simple optimization\n        // Batching the lines if color are the same\n        for (var i = 0; i < splitAreas.length; i++) {\n            this.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/**\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}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/polar/polarCreator';\nimport './axis/RadiusAxisView';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as formatUtil from '../../util/format';\nimport BaseAxisPointer from './BaseAxisPointer';\nimport * as graphic from '../../util/graphic';\nimport * as viewHelper from './viewHelper';\nimport * as matrix from 'zrender/src/core/matrix';\nimport AxisBuilder from '../axis/AxisBuilder';\nimport AxisView from '../axis/AxisView';\n\n\nvar PolarAxisPointer = BaseAxisPointer.extend({\n\n    /**\n     * @override\n     */\n    makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {\n        var axis = axisModel.axis;\n\n        if (axis.dim === 'angle') {\n            this.animationThreshold = Math.PI / 18;\n        }\n\n        var polar = axis.polar;\n        var otherAxis = polar.getOtherAxis(axis);\n        var otherExtent = otherAxis.getExtent();\n\n        var coordValue;\n        coordValue = axis['dataTo' + formatUtil.capitalFirst(axis.dim)](value);\n\n        var axisPointerType = axisPointerModel.get('type');\n        if (axisPointerType && axisPointerType !== 'none') {\n            var elStyle = viewHelper.buildElStyle(axisPointerModel);\n            var pointerOption = pointerShapeBuilder[axisPointerType](\n                axis, polar, coordValue, otherExtent, elStyle\n            );\n            pointerOption.style = elStyle;\n            elOption.graphicKey = pointerOption.type;\n            elOption.pointer = pointerOption;\n        }\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\n    // Do not support handle, utill any user requires it.\n\n});\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\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\n        var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0;\n        var labelLayout = AxisBuilder.innerTextLayout(\n            axisAngle, labelRotation * Math.PI / 180, -1\n        );\n        align = labelLayout.textAlign;\n        verticalAlign = labelLayout.textVerticalAlign;\n    }\n    else { // 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\n            ? 'center' : (position[0] > cx ? 'left' : 'right');\n        verticalAlign = Math.abs(position[1] - cy) / r < 0.3\n            ? 'middle' : (position[1] > cy ? 'top' : 'bottom');\n    }\n\n    return {\n        position: position,\n        align: align,\n        verticalAlign: verticalAlign\n    };\n}\n\n\nvar pointerShapeBuilder = {\n\n    line: function (axis, polar, coordValue, otherExtent, elStyle) {\n        return axis.dim === 'angle'\n            ? {\n                type: 'Line',\n                shape: viewHelper.makeLineShape(\n                    polar.coordToPoint([otherExtent[0], coordValue]),\n                    polar.coordToPoint([otherExtent[1], coordValue])\n                )\n            }\n            : {\n                type: 'Circle',\n                shape: {\n                    cx: polar.cx,\n                    cy: polar.cy,\n                    r: coordValue\n                }\n            };\n    },\n\n    shadow: function (axis, polar, coordValue, otherExtent, elStyle) {\n        var bandWidth = Math.max(1, axis.getBandWidth());\n        var radian = Math.PI / 180;\n\n        return axis.dim === 'angle'\n            ? {\n                type: 'Sector',\n                shape: viewHelper.makeSectorShape(\n                    polar.cx, polar.cy,\n                    otherExtent[0], otherExtent[1],\n                    // In ECharts y is negative if angle is positive\n                    (-coordValue - bandWidth / 2) * radian,\n                    (-coordValue + bandWidth / 2) * radian\n                )\n            }\n            : {\n                type: 'Sector',\n                shape: viewHelper.makeSectorShape(\n                    polar.cx, polar.cy,\n                    coordValue - bandWidth / 2,\n                    coordValue + bandWidth / 2,\n                    0, Math.PI * 2\n                )\n            };\n    }\n};\n\nAxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer);\n\nexport default PolarAxisPointer;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport barPolar from '../layout/barPolar';\n\nimport '../coord/polar/polarCreator';\nimport './angleAxis';\nimport './radiusAxis';\nimport './axisPointer';\nimport './axisPointer/PolarAxisPointer';\n\n// For reducing size of echarts.min, barLayoutPolar is required by polar.\necharts.registerLayout(zrUtil.curry(barPolar, 'bar'));\n\n// Polar view\necharts.extendComponentView({\n    type: '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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as modelUtil from '../../util/model';\nimport ComponentModel from '../../model/Component';\nimport Model from '../../model/Model';\nimport selectableMixin from '../../component/helper/selectableMixin';\nimport geoCreator from './geoCreator';\n\nvar GeoModel = ComponentModel.extend({\n\n    type: 'geo',\n\n    /**\n     * @type {module:echarts/coord/geo/Geo}\n     */\n    coordinateSystem: null,\n\n    layoutMode: 'box',\n\n    init: function (option) {\n        ComponentModel.prototype.init.apply(this, arguments);\n\n        // Default label emphasis `show`\n        modelUtil.defaultEmphasis(option, 'label', ['show']);\n    },\n\n    optionUpdated: function () {\n        var option = this.option;\n        var self = this;\n\n        option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap);\n\n        this._optionModelMap = zrUtil.reduce(option.regions || [], function (optionModelMap, regionOpt) {\n            if (regionOpt.name) {\n                optionModelMap.set(regionOpt.name, new Model(regionOpt, self));\n            }\n            return optionModelMap;\n        }, zrUtil.createHashMap());\n\n        this.updateSelectedMap(option.regions);\n    },\n\n    defaultOption: {\n\n        zlevel: 0,\n\n        z: 0,\n\n        show: true,\n\n        left: 'center',\n\n        top: 'center',\n\n\n        // width:,\n        // height:,\n        // right\n        // bottom\n\n        // Aspect is width / height. Inited to be geoJson bbox aspect\n        // This parameter is used for scale this aspect\n        // If svg used, aspectScale is 1 by default.\n        // aspectScale: 0.75,\n        aspectScale: null,\n\n        ///// Layout with center and size\n        // If you wan't to put map in a fixed size box with right aspect ratio\n        // This two properties may more conveninet\n        // layoutCenter: [50%, 50%]\n        // layoutSize: 100\n\n        silent: false,\n\n        // Map type\n        map: '',\n\n        // Define left-top, right-bottom coords to control view\n        // For example, [ [180, 90], [-180, -90] ]\n        boundingCoords: null,\n\n        // Default on center of map\n        center: null,\n\n        zoom: 1,\n\n        scaleLimit: null,\n\n        // selectedMode: false\n\n        label: {\n            show: false,\n            color: '#000'\n        },\n\n        itemStyle: {\n            // color: 各异,\n            borderWidth: 0.5,\n            borderColor: '#444',\n            color: '#eee'\n        },\n\n        emphasis: {\n            label: {\n                show: true,\n                color: 'rgb(100,0,0)'\n            },\n            itemStyle: {\n                color: 'rgba(255,215,0,0.8)'\n            }\n        },\n\n        regions: []\n    },\n\n    /**\n     * Get model of region\n     * @param  {string} name\n     * @return {module:echarts/model/Model}\n     */\n    getRegionModel: function (name) {\n        return this._optionModelMap.get(name) || new Model(null, this, this.ecModel);\n    },\n\n    /**\n     * Format label\n     * @param {string} name Region name\n     * @param {string} [status='normal'] 'normal' or 'emphasis'\n     * @return {string}\n     */\n    getFormattedLabel: function (name, status) {\n        var regionModel = this.getRegionModel(name);\n        var formatter = regionModel.get('label.' + status + '.formatter');\n        var params = {\n            name: name\n        };\n        if (typeof formatter === 'function') {\n            params.status = status;\n            return formatter(params);\n        }\n        else if (typeof formatter === 'string') {\n            return formatter.replace('{a}', name != null ? name : '');\n        }\n    },\n\n    setZoom: function (zoom) {\n        this.option.zoom = zoom;\n    },\n\n    setCenter: function (center) {\n        this.option.center = center;\n    }\n});\n\nzrUtil.mixin(GeoModel, selectableMixin);\n\nexport default GeoModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport MapDraw from '../helper/MapDraw';\nimport * as echarts from '../../echarts';\n\nexport default echarts.extendComponentView({\n\n    type: 'geo',\n\n    init: function (ecModel, api) {\n        var mapDraw = new MapDraw(api, true);\n        this._mapDraw = mapDraw;\n\n        this.group.add(mapDraw.group);\n    },\n\n    render: function (geoModel, ecModel, api, payload) {\n        // Not render if it is an toggleSelect action from self\n        if (payload && payload.type === 'geoToggleSelect'\n            && payload.from === this.uid\n        ) {\n            return;\n        }\n\n        var mapDraw = this._mapDraw;\n        if (geoModel.get('show')) {\n            mapDraw.draw(geoModel, ecModel, api, this, payload);\n        }\n        else {\n            this._mapDraw.group.removeAll();\n        }\n\n        this.group.silent = geoModel.get('silent');\n    },\n\n    dispose: function () {\n        this._mapDraw && this._mapDraw.remove();\n    }\n\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nimport '../coord/geo/GeoModel';\nimport '../coord/geo/geoCreator';\nimport './geo/GeoView';\nimport '../action/geoRoam';\n\nfunction makeAction(method, actionInfo) {\n    actionInfo.update = 'updateView';\n    echarts.registerAction(actionInfo, function (payload, ecModel) {\n        var selected = {};\n\n        ecModel.eachComponent(\n            { mainType: 'geo', query: payload},\n            function (geoModel) {\n                geoModel[method](payload.name);\n                var geo = geoModel.coordinateSystem;\n                zrUtil.each(geo.regions, function (region) {\n                    selected[region.name] = geoModel.isSelected(region.name) || false;\n                });\n            }\n        );\n\n        return {\n            selected: selected,\n            name: payload.name\n        };\n    });\n}\n\nmakeAction('toggleSelected', {\n    type: 'geoToggleSelect',\n    event: 'geoselectchanged'\n});\nmakeAction('select', {\n    type: 'geoSelect',\n    event: 'geoselected'\n});\nmakeAction('unSelect', {\n    type: 'geoUnSelect',\n    event: 'geounselected'\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as layout from '../../util/layout';\nimport * as numberUtil from '../../util/number';\nimport CoordinateSystem from '../../CoordinateSystem';\n\n// (24*60*60*1000)\nvar PROXIMATE_ONE_DAY = 86400000;\n\n/**\n * Calendar\n *\n * @constructor\n *\n * @param {Object} calendarModel calendarModel\n * @param {Object} ecModel       ecModel\n * @param {Object} api           api\n */\nfunction Calendar(calendarModel, ecModel, api) {\n    this._model = calendarModel;\n}\n\nCalendar.prototype = {\n\n    constructor: Calendar,\n\n    type: 'calendar',\n\n    dimensions: ['time', 'value'],\n\n    // Required in createListFromData\n    getDimensionsInfo: function () {\n        return [{name: 'time', type: 'time'}, 'value'];\n    },\n\n    getRangeInfo: function () {\n        return this._rangeInfo;\n    },\n\n    getModel: function () {\n        return this._model;\n    },\n\n    getRect: function () {\n        return this._rect;\n    },\n\n    getCellWidth: function () {\n        return this._sw;\n    },\n\n    getCellHeight: function () {\n        return this._sh;\n    },\n\n    getOrient: function () {\n        return this._orient;\n    },\n\n    /**\n     * getFirstDayOfWeek\n     *\n     * @example\n     *     0 : start at Sunday\n     *     1 : start at Monday\n     *\n     * @return {number}\n     */\n    getFirstDayOfWeek: function () {\n        return this._firstDayOfWeek;\n    },\n\n    /**\n     * get date info\n     *\n     * @param  {string|number} date date\n     * @return {Object}\n     * {\n     *      y: string, local full year, eg., '1940',\n     *      m: string, local month, from '01' ot '12',\n     *      d: string, local date, from '01' to '31' (if exists),\n     *      day: It is not date.getDay(). It is the location of the cell in a week, from 0 to 6,\n     *      time: timestamp,\n     *      formatedDate: string, yyyy-MM-dd,\n     *      date: original date object.\n     * }\n     */\n    getDateInfo: function (date) {\n\n        date = numberUtil.parseDate(date);\n\n        var y = date.getFullYear();\n\n        var m = date.getMonth() + 1;\n        m = m < 10 ? '0' + m : m;\n\n        var d = date.getDate();\n        d = d < 10 ? '0' + d : d;\n\n        var day = date.getDay();\n\n        day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7);\n\n        return {\n            y: y,\n            m: m,\n            d: d,\n            day: day,\n            time: date.getTime(),\n            formatedDate: y + '-' + m + '-' + d,\n            date: date\n        };\n    },\n\n    getNextNDay: function (date, n) {\n        n = n || 0;\n        if (n === 0) {\n            return this.getDateInfo(date);\n        }\n\n        date = new Date(this.getDateInfo(date).time);\n        date.setDate(date.getDate() + n);\n\n        return this.getDateInfo(date);\n    },\n\n    update: function (ecModel, api) {\n\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\n\n        this._rangeInfo = this._getRangeInfo(this._initRangeOption());\n        var weeks = this._rangeInfo.weeks || 1;\n        var whNames = ['width', 'height'];\n        var cellSize = this._model.get('cellSize').slice();\n        var layoutParams = this._model.getBoxLayoutParams();\n        var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks];\n\n        zrUtil.each([0, 1], function (idx) {\n            if (cellSizeSpecified(cellSize, idx)) {\n                layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx];\n            }\n        });\n\n        var whGlobal = {\n            width: api.getWidth(),\n            height: api.getHeight()\n        };\n        var calendarRect = this._rect = layout.getLayoutRect(layoutParams, whGlobal);\n\n        zrUtil.each([0, 1], function (idx) {\n            if (!cellSizeSpecified(cellSize, idx)) {\n                cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx];\n            }\n        });\n\n        function cellSizeSpecified(cellSize, idx) {\n            return cellSize[idx] != null && cellSize[idx] !== 'auto';\n        }\n\n        this._sw = cellSize[0];\n        this._sh = cellSize[1];\n    },\n\n\n    /**\n     * Convert a time data(time, value) item to (x, y) point.\n     *\n     * @override\n     * @param  {Array|number} data data\n     * @param  {boolean} [clamp=true] out of range\n     * @return {Array} point\n     */\n    dataToPoint: function (data, clamp) {\n        zrUtil.isArray(data) && (data = data[0]);\n        clamp == null && (clamp = true);\n\n        var dayInfo = this.getDateInfo(data);\n        var range = this._rangeInfo;\n        var date = dayInfo.formatedDate;\n\n        // if not in range return [NaN, NaN]\n        if (clamp && !(\n            dayInfo.time >= range.start.time\n            && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY\n        )) {\n            return [NaN, NaN];\n        }\n\n        var week = dayInfo.day;\n        var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek;\n\n        if (this._orient === 'vertical') {\n            return [\n                this._rect.x + week * this._sw + this._sw / 2,\n                this._rect.y + nthWeek * this._sh + this._sh / 2\n            ];\n\n        }\n\n        return [\n            this._rect.x + nthWeek * this._sw + this._sw / 2,\n            this._rect.y + week * this._sh + this._sh / 2\n        ];\n\n    },\n\n    /**\n     * Convert a (x, y) point to time data\n     *\n     * @override\n     * @param  {string} point point\n     * @return {string}       data\n     */\n    pointToData: function (point) {\n\n        var date = this.pointToDate(point);\n\n        return date && date.time;\n    },\n\n    /**\n     * Convert a time date item to (x, y) four point.\n     *\n     * @param  {Array} data  date[0] is date\n     * @param  {boolean} [clamp=true]  out of range\n     * @return {Object}       point\n     */\n    dataToRect: function (data, clamp) {\n        var point = this.dataToPoint(data, clamp);\n\n        return {\n            contentShape: {\n                x: point[0] - (this._sw - this._lineWidth) / 2,\n                y: point[1] - (this._sh - this._lineWidth) / 2,\n                width: this._sw - this._lineWidth,\n                height: this._sh - this._lineWidth\n            },\n\n            center: point,\n\n            tl: [\n                point[0] - this._sw / 2,\n                point[1] - this._sh / 2\n            ],\n\n            tr: [\n                point[0] + this._sw / 2,\n                point[1] - this._sh / 2\n            ],\n\n            br: [\n                point[0] + this._sw / 2,\n                point[1] + this._sh / 2\n            ],\n\n            bl: [\n                point[0] - this._sw / 2,\n                point[1] + this._sh / 2\n            ]\n\n        };\n    },\n\n    /**\n     * Convert a (x, y) point to time date\n     *\n     * @param  {Array} point point\n     * @return {Object}       date\n     */\n    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\n        if (this._orient === 'vertical') {\n            return this._getDateByWeeksAndDay(nthY, nthX - 1, range);\n        }\n\n        return this._getDateByWeeksAndDay(nthX, nthY - 1, range);\n    },\n\n    /**\n     * @inheritDoc\n     */\n    convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),\n\n    /**\n     * @inheritDoc\n     */\n    convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),\n\n    /**\n     * initRange\n     *\n     * @private\n     * @return {Array} [start, end]\n     */\n    _initRangeOption: function () {\n        var range = this._model.get('range');\n\n        var rg = range;\n\n        if (zrUtil.isArray(rg) && rg.length === 1) {\n            rg = rg[0];\n        }\n\n        if (/^\\d{4}$/.test(rg)) {\n            range = [rg + '-01-01', rg + '-12-31'];\n        }\n\n        if (/^\\d{4}[\\/|-]\\d{1,2}$/.test(rg)) {\n\n            var start = this.getDateInfo(rg);\n            var firstDay = start.date;\n            firstDay.setMonth(firstDay.getMonth() + 1);\n\n            var end = this.getNextNDay(firstDay, -1);\n            range = [start.formatedDate, end.formatedDate];\n        }\n\n        if (/^\\d{4}[\\/|-]\\d{1,2}[\\/|-]\\d{1,2}$/.test(rg)) {\n            range = [rg, rg];\n        }\n\n        var tmp = this._getRangeInfo(range);\n\n        if (tmp.start.time > tmp.end.time) {\n            range.reverse();\n        }\n\n        return range;\n    },\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    _getRangeInfo: function (range) {\n        range = [\n            this.getDateInfo(range[0]),\n            this.getDateInfo(range[1])\n        ];\n\n        var reversed;\n        if (range[0].time > range[1].time) {\n            reversed = true;\n            range.reverse();\n        }\n\n        var allDay = Math.floor(range[1].time / PROXIMATE_ONE_DAY)\n            - Math.floor(range[0].time / PROXIMATE_ONE_DAY) + 1;\n\n        // Consider case:\n        // Firstly set system timezone as \"Time Zone: America/Toronto\",\n        // ```\n        // var first = new Date(1478412000000 - 3600 * 1000 * 2.5);\n        // var second = new Date(1478412000000);\n        // var 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(range[0].time);\n        var startDateNum = date.getDate();\n        var endDateNum = range[1].date.getDate();\n        date.setDate(startDateNum + allDay - 1);\n        // The bias can not over a month, so just compare date.\n        if (date.getDate() !== endDateNum) {\n            var sign = date.getTime() - range[1].time > 0 ? 1 : -1;\n            while (date.getDate() !== endDateNum && (date.getTime() - range[1].time) * sign > 0) {\n                allDay -= sign;\n                date.setDate(startDateNum + allDay - 1);\n            }\n        }\n\n        var weeks = Math.floor((allDay + range[0].day + 6) / 7);\n        var nthWeek = reversed ? -weeks + 1 : weeks - 1;\n\n        reversed && range.reverse();\n\n        return {\n            range: [range[0].formatedDate, range[1].formatedDate],\n            start: range[0],\n            end: range[1],\n            allDay: allDay,\n            weeks: weeks,\n            // From 0.\n            nthWeek: nthWeek,\n            fweek: range[0].day,\n            lweek: range[1].day\n        };\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    _getDateByWeeksAndDay: function (nthWeek, day, range) {\n        var rangeInfo = this._getRangeInfo(range);\n\n        if (nthWeek > rangeInfo.weeks\n            || (nthWeek === 0 && day < rangeInfo.fweek)\n            || (nthWeek === rangeInfo.weeks && day > rangeInfo.lweek)\n        ) {\n            return false;\n        }\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\n        return this.getDateInfo(date);\n    }\n};\n\nCalendar.dimensions = Calendar.prototype.dimensions;\n\nCalendar.getDimensionsInfo = Calendar.prototype.getDimensionsInfo;\n\nCalendar.create = function (ecModel, api) {\n    var calendarList = [];\n\n    ecModel.eachComponent('calendar', function (calendarModel) {\n        var calendar = new Calendar(calendarModel, ecModel, api);\n        calendarList.push(calendar);\n        calendarModel.coordinateSystem = calendar;\n    });\n\n    ecModel.eachSeries(function (calendarSeries) {\n        if (calendarSeries.get('coordinateSystem') === 'calendar') {\n            // Inject coordinate system\n            calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0];\n        }\n    });\n    return calendarList;\n};\n\nfunction doConvert(methodName, ecModel, finder, value) {\n    var calendarModel = finder.calendarModel;\n    var seriesModel = finder.seriesModel;\n\n    var coordSys = calendarModel\n        ? calendarModel.coordinateSystem\n        : seriesModel\n        ? seriesModel.coordinateSystem\n        : null;\n\n    return coordSys === this ? coordSys[methodName](value) : null;\n}\n\nCoordinateSystem.register('calendar', Calendar);\n\nexport default Calendar;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport {\n    getLayoutParams,\n    sizeCalculable,\n    mergeLayoutParam\n} from '../../util/layout';\n\nvar CalendarModel = ComponentModel.extend({\n\n    type: 'calendar',\n\n    /**\n     * @type {module:echarts/coord/calendar/Calendar}\n     */\n    coordinateSystem: null,\n\n    defaultOption: {\n        zlevel: 0,\n        z: 2,\n        left: 80,\n        top: 60,\n\n        cellSize: 20,\n\n        // horizontal vertical\n        orient: 'horizontal',\n\n        // month separate line style\n        splitLine: {\n            show: true,\n            lineStyle: {\n                color: '#000',\n                width: 1,\n                type: 'solid'\n            }\n        },\n\n        // rect style  temporarily unused emphasis\n        itemStyle: {\n            color: '#fff',\n            borderWidth: 1,\n            borderColor: '#ccc'\n        },\n\n        // week text style\n        dayLabel: {\n            show: true,\n\n            // a week first day\n            firstDay: 0,\n\n            // start end\n            position: 'start',\n            margin: '50%', // 50% of cellSize\n            nameMap: 'en',\n            color: '#000'\n        },\n\n        // month text style\n        monthLabel: {\n            show: true,\n\n            // start end\n            position: 'start',\n            margin: 5,\n\n            // center or left\n            align: 'center',\n\n            // cn en []\n            nameMap: 'en',\n            formatter: null,\n            color: '#000'\n        },\n\n        // year text style\n        yearLabel: {\n            show: true,\n\n            // top bottom left right\n            position: null,\n            margin: 30,\n            formatter: null,\n            color: '#ccc',\n            fontFamily: 'sans-serif',\n            fontWeight: 'bolder',\n            fontSize: 20\n        }\n    },\n\n    /**\n     * @override\n     */\n    init: function (option, parentModel, ecModel, extraOpt) {\n        var inputPositionParams = getLayoutParams(option);\n\n        CalendarModel.superApply(this, 'init', arguments);\n\n        mergeAndNormalizeLayoutParams(option, inputPositionParams);\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function (option, extraOpt) {\n        CalendarModel.superApply(this, 'mergeOption', arguments);\n\n        mergeAndNormalizeLayoutParams(this.option, option);\n    }\n});\n\nfunction mergeAndNormalizeLayoutParams(target, raw) {\n    // Normalize cellSize\n    var cellSize = target.cellSize;\n\n    if (!zrUtil.isArray(cellSize)) {\n        cellSize = target.cellSize = [cellSize, cellSize];\n    }\n    else if (cellSize.length === 1) {\n        cellSize[1] = cellSize[0];\n    }\n\n    var ignoreSize = zrUtil.map([0, 1], function (hvIdx) {\n        // If user have set `width` or both `left` and `right`, cellSize\n        // will be automatically set to 'auto', otherwise the default\n        // setting of cellSize will make `width` setting not work.\n        if (sizeCalculable(raw, hvIdx)) {\n            cellSize[hvIdx] = 'auto';\n        }\n        return cellSize[hvIdx] != null && cellSize[hvIdx] !== 'auto';\n    });\n\n    mergeLayoutParam(target, raw, {\n        type: 'box', ignoreSize: ignoreSize\n    });\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport * as formatUtil from '../../util/format';\nimport * as numberUtil from '../../util/number';\n\nvar MONTH_TEXT = {\n    EN: [\n        'Jan', 'Feb', 'Mar',\n        'Apr', 'May', 'Jun',\n        'Jul', 'Aug', 'Sep',\n        'Oct', 'Nov', 'Dec'\n    ],\n    CN: [\n        '一月', '二月', '三月',\n        '四月', '五月', '六月',\n        '七月', '八月', '九月',\n        '十月', '十一月', '十二月'\n    ]\n};\n\nvar WEEK_TEXT = {\n    EN: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n    CN: ['日', '一', '二', '三', '四', '五', '六']\n};\n\nexport default echarts.extendComponentView({\n\n    type: 'calendar',\n\n    /**\n     * top/left line points\n     *  @private\n     */\n    _tlpoints: null,\n\n    /**\n     * bottom/right line points\n     *  @private\n     */\n    _blpoints: null,\n\n    /**\n     * first day of month\n     *  @private\n     */\n    _firstDayOfMonth: null,\n\n    /**\n     * first day point of month\n     *  @private\n     */\n    _firstDayPoints: null,\n\n    render: function (calendarModel, ecModel, api) {\n\n        var group = this.group;\n\n        group.removeAll();\n\n        var coordSys = calendarModel.coordinateSystem;\n\n        // range info\n        var rangeData = coordSys.getRangeInfo();\n        var orient = coordSys.getOrient();\n\n        this._renderDayRect(calendarModel, rangeData, group);\n\n        // _renderLines must be called prior to following function\n        this._renderLines(calendarModel, rangeData, orient, group);\n\n        this._renderYearText(calendarModel, rangeData, orient, group);\n\n        this._renderMonthText(calendarModel, orient, group);\n\n        this._renderWeekText(calendarModel, rangeData, orient, group);\n    },\n\n    // render day rect\n    _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\n        for (var i = rangeData.start.time;\n            i <= rangeData.end.time;\n            i = coordSys.getNextNDay(i, 1).time\n        ) {\n\n            var point = coordSys.dataToRect([i], false).tl;\n\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\n            group.add(rect);\n        }\n\n    },\n\n    // render separate line\n    _renderLines: function (calendarModel, rangeData, orient, group) {\n\n        var self = this;\n\n        var coordSys = calendarModel.coordinateSystem;\n\n        var lineStyleModel = calendarModel.getModel('splitLine.lineStyle').getLineStyle();\n        var show = calendarModel.get('splitLine.show');\n\n        var lineWidth = lineStyleModel.lineWidth;\n\n        this._tlpoints = [];\n        this._blpoints = [];\n        this._firstDayOfMonth = [];\n        this._firstDayPoints = [];\n\n\n        var firstDay = rangeData.start;\n\n        for (var i = 0; firstDay.time <= rangeData.end.time; i++) {\n            addPoints(firstDay.formatedDate);\n\n            if (i === 0) {\n                firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m);\n            }\n\n            var date = firstDay.date;\n            date.setMonth(date.getMonth() + 1);\n            firstDay = coordSys.getDateInfo(date);\n        }\n\n        addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate);\n\n        function addPoints(date) {\n\n            self._firstDayOfMonth.push(coordSys.getDateInfo(date));\n            self._firstDayPoints.push(coordSys.dataToRect([date], false).tl);\n\n            var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);\n\n            self._tlpoints.push(points[0]);\n            self._blpoints.push(points[points.length - 1]);\n\n            show && self._drawSplitline(points, lineStyleModel, group);\n        }\n\n\n        // render top/left line\n        show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group);\n\n        // render bottom/right line\n        show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group);\n\n    },\n\n    // get points at both ends\n    _getEdgesPoints: function (points, lineWidth, orient) {\n        var rs = [points[0].slice(), points[points.length - 1].slice()];\n        var idx = orient === 'horizontal' ? 0 : 1;\n\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\n        return rs;\n    },\n\n    // render split line\n    _drawSplitline: function (points, lineStyleModel, group) {\n\n        var poyline = new graphic.Polyline({\n            z2: 20,\n            shape: {\n                points: points\n            },\n            style: lineStyleModel\n        });\n\n        group.add(poyline);\n    },\n\n    // render month line of one week points\n    _getLinePointsOfOneWeek: function (calendarModel, date, orient) {\n\n        var coordSys = calendarModel.coordinateSystem;\n        date = coordSys.getDateInfo(date);\n\n        var points = [];\n\n        for (var i = 0; i < 7; i++) {\n\n            var tmpD = coordSys.getNextNDay(date.time, i);\n            var point = coordSys.dataToRect([tmpD.time], false);\n\n            points[2 * tmpD.day] = point.tl;\n            points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];\n        }\n\n        return points;\n\n    },\n\n    _formatterLabel: function (formatter, params) {\n\n        if (typeof formatter === 'string' && formatter) {\n            return formatUtil.formatTplSimple(formatter, params);\n        }\n\n        if (typeof formatter === 'function') {\n            return formatter(params);\n        }\n\n        return params.nameMap;\n\n    },\n\n    _yearTextPositionControl: function (textEl, point, orient, position, margin) {\n\n        point = point.slice();\n        var aligns = ['center', 'bottom'];\n\n        if (position === 'bottom') {\n            point[1] += margin;\n            aligns = ['center', 'top'];\n        }\n        else if (position === 'left') {\n            point[0] -= margin;\n        }\n        else if (position === 'right') {\n            point[0] += margin;\n            aligns = ['center', 'top'];\n        }\n        else { // top\n            point[1] -= margin;\n        }\n\n        var rotate = 0;\n        if (position === 'left' || position === 'right') {\n            rotate = Math.PI / 2;\n        }\n\n        return {\n            rotation: rotate,\n            position: point,\n            style: {\n                textAlign: aligns[0],\n                textVerticalAlign: aligns[1]\n            }\n        };\n    },\n\n    // render year\n    _renderYearText: function (calendarModel, rangeData, orient, group) {\n        var yearLabel = calendarModel.getModel('yearLabel');\n\n        if (!yearLabel.get('show')) {\n            return;\n        }\n\n        var margin = yearLabel.get('margin');\n        var pos = yearLabel.get('position');\n\n        if (!pos) {\n            pos = orient !== 'horizontal' ? 'top' : 'left';\n        }\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\n        var idx = orient === 'horizontal' ? 0 : 1;\n\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\n        var name = rangeData.start.y;\n\n        if (+rangeData.end.y > +rangeData.start.y) {\n            name = name + '-' + rangeData.end.y;\n        }\n\n        var formatter = yearLabel.get('formatter');\n\n        var params = {\n            start: rangeData.start.y,\n            end: rangeData.end.y,\n            nameMap: name\n        };\n\n        var content = this._formatterLabel(formatter, params);\n\n        var yearText = new graphic.Text({z2: 30});\n        graphic.setTextStyle(yearText.style, yearLabel, {text: content}),\n        yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin));\n\n        group.add(yearText);\n    },\n\n    _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\n        if (orient === 'horizontal') {\n            y = y + margin;\n\n            if (isCenter) {\n                align = 'center';\n            }\n\n            if (position === 'start') {\n                vAlign = 'bottom';\n            }\n        }\n        else {\n            x = x + margin;\n\n            if (isCenter) {\n                vAlign = 'middle';\n            }\n\n            if (position === 'start') {\n                align = 'right';\n            }\n        }\n\n        return {\n            x: x,\n            y: y,\n            textAlign: align,\n            textVerticalAlign: vAlign\n        };\n    },\n\n    // render month and year text\n    _renderMonthText: function (calendarModel, orient, group) {\n        var monthLabel = calendarModel.getModel('monthLabel');\n\n        if (!monthLabel.get('show')) {\n            return;\n        }\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\n        var termPoints = [this._tlpoints, this._blpoints];\n\n        if (zrUtil.isString(nameMap)) {\n            nameMap = MONTH_TEXT[nameMap.toUpperCase()] || [];\n        }\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\n        for (var i = 0; i < termPoints[idx].length - 1; i++) {\n\n            var tmp = termPoints[idx][i].slice();\n            var firstDay = this._firstDayOfMonth[i];\n\n            if (isCenter) {\n                var firstDayPoints = this._firstDayPoints[i];\n                tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2;\n            }\n\n            var formatter = monthLabel.get('formatter');\n            var name = 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\n            };\n\n            var content = this._formatterLabel(formatter, params);\n\n            var monthText = new graphic.Text({z2: 30});\n            zrUtil.extend(\n                graphic.setTextStyle(monthText.style, monthLabel, {text: content}),\n                this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)\n            );\n\n            group.add(monthText);\n        }\n    },\n\n    _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\n        if (orient === 'horizontal') {\n            x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2;\n            align = isStart ? 'right' : 'left';\n        }\n        else {\n            y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2;\n            vAlign = isStart ? 'bottom' : 'top';\n        }\n\n        return {\n            x: x,\n            y: y,\n            textAlign: align,\n            textVerticalAlign: vAlign\n        };\n    },\n\n    // render weeks\n    _renderWeekText: function (calendarModel, rangeData, orient, group) {\n        var dayLabel = calendarModel.getModel('dayLabel');\n\n        if (!dayLabel.get('show')) {\n            return;\n        }\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\n        if (zrUtil.isString(nameMap)) {\n            nameMap = WEEK_TEXT[nameMap.toUpperCase()] || [];\n        }\n\n        var start = coordSys.getNextNDay(\n            rangeData.end.time, (7 - rangeData.lweek)\n        ).time;\n\n        var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()];\n        margin = numberUtil.parsePercent(margin, cellSize[orient === 'horizontal' ? 0 : 1]);\n\n        if (pos === 'start') {\n            start = coordSys.getNextNDay(\n                rangeData.start.time, -(7 + rangeData.fweek)\n            ).time;\n            margin = -margin;\n        }\n\n        for (var i = 0; i < 7; i++) {\n\n            var tmpD = coordSys.getNextNDay(start, i);\n            var point = coordSys.dataToRect([tmpD.time], false).center;\n            var day = i;\n            day = Math.abs((i + firstDayOfWeek) % 7);\n            var weekText = new graphic.Text({z2: 30});\n\n            zrUtil.extend(\n                graphic.setTextStyle(weekText.style, dayLabel, {text: nameMap[day]}),\n                this._weekTextPositionControl(point, orient, pos, margin, cellSize)\n            );\n            group.add(weekText);\n        }\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport '../coord/calendar/Calendar';\nimport '../coord/calendar/CalendarModel';\nimport './calendar/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\nimport {__DEV__} from '../config';\nimport * as echarts from '../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nimport * as modelUtil from '../util/model';\nimport * as graphicUtil from '../util/graphic';\nimport * as layoutUtil from '../util/layout';\n\n// -------------\n// Preprocessor\n// -------------\n\necharts.registerPreprocessor(function (option) {\n    var graphicOption = option.graphic;\n\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 (zrUtil.isArray(graphicOption)) {\n        if (!graphicOption[0] || !graphicOption[0].elements) {\n            option.graphic = [{elements: graphicOption}];\n        }\n        else {\n            // Only one graphic instance can be instantiated. (We dont\n            // want that too many views are created in echarts._viewMap)\n            option.graphic = [option.graphic[0]];\n        }\n    }\n    else if (graphicOption && !graphicOption.elements) {\n        option.graphic = [{elements: [graphicOption]}];\n    }\n});\n\n// ------\n// Model\n// ------\n\nvar GraphicModel = echarts.extendComponentModel({\n\n    type: 'graphic',\n\n    defaultOption: {\n\n        // Extra properties for each elements:\n        //\n        // left/right/top/bottom: (like 12, '22%', 'center', default undefined)\n        //      If left/rigth is set, shape.x/shape.cx/position will not be used.\n        //      If top/bottom is set, shape.y/shape.cy/position will not be used.\n        //      This mechanism is useful when you want to position a group/element\n        //      against the right side or the center of this container.\n        //\n        // width/height: (can only be pixel value, default 0)\n        //      Only be used to specify contianer(group) size, if needed. And\n        //      can not be percentage value (like '33%'). See the reason in the\n        //      layout algorithm below.\n        //\n        // bounding: (enum: 'all' (default) | 'raw')\n        //      Specify how to calculate boundingRect when locating.\n        //      'all': Get uioned and transformed boundingRect\n        //          from both itself and its descendants.\n        //          This mode simplies confining a group of elements in the bounding\n        //          of their ancester container (e.g., using 'right: 0').\n        //      'raw': Only use the boundingRect of itself and before transformed.\n        //          This mode is similar to css behavior, which is useful when you\n        //          want an element to be able to overflow its container. (Consider\n        //          a rotated circle needs to be located in a corner.)\n        // info: custom info. enables user to mount some info on elements and use them\n        //      in event handlers. Update them only when user specified, otherwise, remain.\n\n        // Note: elements is always behind its ancestors in this elements array.\n        elements: [],\n        parentId: null\n    },\n\n    /**\n     * Save el options for the sake of the performance (only update modified graphics).\n     * The order is the same as those in option. (ancesters -> descendants)\n     *\n     * @private\n     * @type {Array.<Object>}\n     */\n    _elOptionsToUpdate: null,\n\n    /**\n     * @override\n     */\n    mergeOption: function (option) {\n        // Prevent default merge to elements\n        var elements = this.option.elements;\n        this.option.elements = null;\n\n        GraphicModel.superApply(this, 'mergeOption', arguments);\n\n        this.option.elements = elements;\n    },\n\n    /**\n     * @override\n     */\n    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\n        var flattenedList = [];\n        this._flatten(newList, flattenedList);\n\n        var mappingResult = modelUtil.mappingToExists(existList, flattenedList);\n        modelUtil.makeIdAndName(mappingResult);\n\n        // Clear elOptionsToUpdate\n        var elOptionsToUpdate = this._elOptionsToUpdate = [];\n\n        zrUtil.each(mappingResult, function (resultItem, index) {\n            var newElOption = resultItem.option;\n\n            if (__DEV__) {\n                zrUtil.assert(\n                    zrUtil.isObject(newElOption) || resultItem.exist,\n                    'Empty graphic option definition'\n                );\n            }\n\n            if (!newElOption) {\n                return;\n            }\n\n            elOptionsToUpdate.push(newElOption);\n\n            setKeyInfoToNewElOption(resultItem, newElOption);\n\n            mergeNewElOptionToExist(existList, index, newElOption);\n\n            setLayoutInfoToExist(existList[index], newElOption);\n\n        }, this);\n\n        // Clean\n        for (var i = existList.length - 1; i >= 0; i--) {\n            if (existList[i] == null) {\n                existList.splice(i, 1);\n            }\n            else {\n                // $action should be volatile, otherwise option gotten from\n                // `getOption` will contain unexpected $action.\n                delete existList[i].$action;\n            }\n        }\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     * @private\n     * @param {Array.<Object>} optionList option list\n     * @param {Array.<Object>} result result of flatten\n     * @param {Object} parentOption parent option\n     */\n    _flatten: function (optionList, result, parentOption) {\n        zrUtil.each(optionList, function (option) {\n            if (!option) {\n                return;\n            }\n\n            if (parentOption) {\n                option.parentOption = parentOption;\n            }\n\n            result.push(option);\n\n            var children = option.children;\n            if (option.type === 'group' && children) {\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\n    // FIXME\n    // Pass to view using payload? setOption has a payload?\n    useElOptionsToUpdate: function () {\n        var els = this._elOptionsToUpdate;\n        // Clear to avoid render duplicately when zooming.\n        this._elOptionsToUpdate = null;\n        return els;\n    }\n});\n\n// -----\n// View\n// -----\n\necharts.extendComponentView({\n\n    type: 'graphic',\n\n    /**\n     * @override\n     */\n    init: function (ecModel, api) {\n\n        /**\n         * @private\n         * @type {module:zrender/core/util.HashMap}\n         */\n        this._elMap = zrUtil.createHashMap();\n\n        /**\n         * @private\n         * @type {module:echarts/graphic/GraphicModel}\n         */\n        this._lastGraphicModel;\n    },\n\n    /**\n     * @override\n     */\n    render: function (graphicModel, ecModel, api) {\n\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\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\n        this._updateElements(graphicModel);\n        this._relocate(graphicModel, api);\n    },\n\n    /**\n     * Update graphic elements.\n     *\n     * @private\n     * @param {Object} graphicModel graphic model\n     */\n    _updateElements: function (graphicModel) {\n        var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();\n\n        if (!elOptionsToUpdate) {\n            return;\n        }\n\n        var elMap = this._elMap;\n        var rootGroup = this.group;\n\n        // Top-down tranverse to assign graphic settings to each elements.\n        zrUtil.each(elOptionsToUpdate, function (elOption) {\n            var $action = elOption.$action;\n            var id = elOption.id;\n            var existEl = elMap.get(id);\n            var parentId = elOption.parentId;\n            var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;\n\n            var elOptionStyle = elOption.style;\n            if (elOption.type === '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 = null;\n                }\n\n                // Compatible with previous setting: both support fill and textFill,\n                // stroke and textStroke.\n                !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && (\n                    elOptionStyle.textFill = elOptionStyle.fill\n                );\n                !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && (\n                    elOptionStyle.textStroke = elOptionStyle.stroke\n                );\n            }\n\n            // Remove unnecessary props to avoid potential problems.\n            var elOptionCleaned = getCleanedElOption(elOption);\n\n            // For simple, do not support parent change, otherwise reorder is needed.\n            if (__DEV__) {\n                existEl && zrUtil.assert(\n                    targetElParent === existEl.parent,\n                    'Changing parent is not supported.'\n                );\n            }\n\n            if (!$action || $action === 'merge') {\n                existEl\n                    ? existEl.attr(elOptionCleaned)\n                    : createEl(id, targetElParent, elOptionCleaned, elMap);\n            }\n            else if ($action === 'replace') {\n                removeEl(existEl, elMap);\n                createEl(id, targetElParent, elOptionCleaned, elMap);\n            }\n            else if ($action === 'remove') {\n                removeEl(existEl, elMap);\n            }\n\n            var el = elMap.get(id);\n            if (el) {\n                el.__ecGraphicWidth = elOption.width;\n                el.__ecGraphicHeight = elOption.height;\n                setEventData(el, graphicModel, elOption);\n            }\n        });\n    },\n\n    /**\n     * Locate graphic elements.\n     *\n     * @private\n     * @param {Object} graphicModel graphic model\n     * @param {module:echarts/ExtensionAPI} api extension API\n     */\n    _relocate: function (graphicModel, api) {\n        var elOptions = graphicModel.option.elements;\n        var rootGroup = this.group;\n        var elMap = this._elMap;\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 el = elMap.get(elOption.id);\n\n            if (!el) {\n                continue;\n            }\n\n            var parentEl = el.parent;\n            var containerInfo = parentEl === rootGroup\n                ? {\n                    width: api.getWidth(),\n                    height: api.getHeight()\n                }\n                : { // Like 'position:absolut' in css, default 0.\n                    width: parentEl.__ecGraphicWidth || 0,\n                    height: parentEl.__ecGraphicHeight || 0\n                };\n\n            layoutUtil.positionElement(\n                el, elOption, containerInfo, null,\n                {hv: elOption.hv, boundingMode: elOption.bounding}\n            );\n        }\n    },\n\n    /**\n     * Clear all elements.\n     *\n     * @private\n     */\n    _clear: function () {\n        var elMap = this._elMap;\n        elMap.each(function (el) {\n            removeEl(el, elMap);\n        });\n        this._elMap = zrUtil.createHashMap();\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        this._clear();\n    }\n});\n\nfunction createEl(id, targetElParent, elOption, elMap) {\n    var graphicType = elOption.type;\n\n    if (__DEV__) {\n        zrUtil.assert(graphicType, 'graphic type MUST be set');\n    }\n\n    var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];\n\n    if (__DEV__) {\n        zrUtil.assert(Clz, 'graphic type can not be found');\n    }\n\n    var el = new Clz(elOption);\n    targetElParent.add(el);\n    elMap.set(id, el);\n    el.__ecGraphicId = id;\n}\n\nfunction removeEl(existEl, elMap) {\n    var existElParent = existEl && existEl.parent;\n    if (existElParent) {\n        existEl.type === 'group' && existEl.traverse(function (el) {\n            removeEl(el, elMap);\n        });\n        elMap.removeKey(existEl.__ecGraphicId);\n        existElParent.remove(existEl);\n    }\n}\n\n// Remove unnecessary props to avoid potential problems.\nfunction getCleanedElOption(elOption) {\n    elOption = zrUtil.extend({}, elOption);\n    zrUtil.each(\n        ['id', 'parentId', '$action', 'hv', 'bounding'].concat(layoutUtil.LOCATION_PARAMS),\n        function (name) {\n            delete elOption[name];\n        }\n    );\n    return elOption;\n}\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}\n\nfunction setKeyInfoToNewElOption(resultItem, newElOption) {\n    var existElOption = resultItem.exist;\n\n    // Set id and type after id assigned.\n    newElOption.id = resultItem.keyInfo.id;\n    !newElOption.type && existElOption && (newElOption.type = existElOption.type);\n\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        }\n        else if (existElOption) {\n            newElOption.parentId = existElOption.parentId;\n        }\n    }\n\n    // Clear\n    newElOption.parentOption = null;\n}\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\n    var $action = newElOption.$action || 'merge';\n    if ($action === 'merge') {\n        if (existElOption) {\n\n            if (__DEV__) {\n                var newType = newElOption.type;\n                zrUtil.assert(\n                    !newType || existElOption.type === newType,\n                    'Please set $action: \"replace\" to change `type`'\n                );\n            }\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            layoutUtil.mergeLayoutParam(existElOption, newElOptCopy, {ignoreSize: true});\n            // Will be used in render.\n            layoutUtil.copyLayoutParams(newElOption, existElOption);\n        }\n        else {\n            existList[index] = newElOptCopy;\n        }\n    }\n    else if ($action === 'replace') {\n        existList[index] = newElOptCopy;\n    }\n    else if ($action === 'remove') {\n        // null will be cleaned later.\n        existElOption && (existList[index] = null);\n    }\n}\n\nfunction setLayoutInfoToExist(existItem, newElOption) {\n    if (!existItem) {\n        return;\n    }\n    existItem.hv = newElOption.hv = [\n        // Rigid body, dont care `width`.\n        isSetLoc(newElOption, ['left', 'right']),\n        // Rigid body, dont care `height`.\n        isSetLoc(newElOption, ['top', 'bottom'])\n    ];\n    // Give default group size. Otherwise layout error may occur.\n    if (existItem.type === 'group') {\n        existItem.width == null && (existItem.width = newElOption.width = 0);\n        existItem.height == null && (existItem.height = newElOption.height = 0);\n    }\n}\n\nfunction setEventData(el, graphicModel, elOption) {\n    var eventData = el.eventData;\n    // Simple optimize for large amount of elements that no need event.\n    if (!el.silent && !el.ignore && !eventData) {\n        eventData = el.eventData = {\n            componentType: 'graphic',\n            componentIndex: graphicModel.componentIndex,\n            name: el.name\n        };\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 = el.info;\n    }\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\nvar features = {};\n\nexport function register(name, ctor) {\n    features[name] = ctor;\n}\n\nexport function get(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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as featureManager from './featureManager';\n\nvar ToolboxModel = echarts.extendComponentModel({\n\n    type: 'toolbox',\n\n    layoutMode: {\n        type: 'box',\n        ignoreSize: true\n    },\n\n    optionUpdated: function () {\n        ToolboxModel.superApply(this, 'optionUpdated', arguments);\n\n        zrUtil.each(this.option.feature, function (featureOpt, featureName) {\n            var Feature = featureManager.get(featureName);\n            Feature && zrUtil.merge(featureOpt, Feature.defaultOption);\n        });\n    },\n\n    defaultOption: {\n\n        show: true,\n\n        z: 6,\n\n        zlevel: 0,\n\n        orient: 'horizontal',\n\n        left: 'right',\n\n        top: 'top',\n\n        // right\n        // bottom\n\n        backgroundColor: 'transparent',\n\n        borderColor: '#ccc',\n\n        borderRadius: 0,\n\n        borderWidth: 0,\n\n        padding: 5,\n\n        itemSize: 15,\n\n        itemGap: 8,\n\n        showTitle: true,\n\n        iconStyle: {\n            borderColor: '#666',\n            color: 'none'\n        },\n        emphasis: {\n            iconStyle: {\n                borderColor: '#3E98C5'\n            }\n        },\n        // textStyle: {},\n\n        // feature\n\n        tooltip: {\n            show: false\n        }\n    }\n});\n\nexport default ToolboxModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {\n    getLayoutRect,\n    box as layoutBox,\n    positionElement\n} from '../../util/layout';\nimport * as formatUtil from '../../util/format';\nimport * as graphic from '../../util/graphic';\n\n/**\n * Layout list like component.\n * It will box layout each items in group of component and then position the whole group in the viewport\n * @param {module:zrender/group/Group} group\n * @param {module:echarts/model/Component} componentModel\n * @param {module:echarts/ExtensionAPI}\n */\nexport function layout(group, componentModel, api) {\n    var boxLayoutParams = componentModel.getBoxLayoutParams();\n    var padding = componentModel.get('padding');\n    var viewportSize = {width: api.getWidth(), height: api.getHeight()};\n\n    var rect = getLayoutRect(\n        boxLayoutParams,\n        viewportSize,\n        padding\n    );\n\n    layoutBox(\n        componentModel.get('orient'),\n        group,\n        componentModel.get('itemGap'),\n        rect.width,\n        rect.height\n    );\n\n    positionElement(\n        group,\n        boxLayoutParams,\n        viewportSize,\n        padding\n    );\n}\n\nexport function makeBackground(rect, componentModel) {\n    var padding = formatUtil.normalizeCssArray(\n        componentModel.get('padding')\n    );\n    var style = componentModel.getItemStyle(['color', 'opacity']);\n    style.fill = componentModel.get('backgroundColor');\n    var rect = 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\n    return 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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as textContain from 'zrender/src/contain/text';\nimport * as featureManager from './featureManager';\nimport * as graphic from '../../util/graphic';\nimport Model from '../../model/Model';\nimport DataDiffer from '../../data/DataDiffer';\nimport * as listComponentHelper from '../helper/listComponent';\n\nexport default echarts.extendComponentView({\n\n    type: 'toolbox',\n\n    render: function (toolboxModel, ecModel, api, payload) {\n        var group = this.group;\n        group.removeAll();\n\n        if (!toolboxModel.get('show')) {\n            return;\n        }\n\n        var itemSize = +toolboxModel.get('itemSize');\n        var featureOpts = toolboxModel.get('feature') || {};\n        var features = this._features || (this._features = {});\n\n        var featureNames = [];\n        zrUtil.each(featureOpts, function (opt, name) {\n            featureNames.push(name);\n        });\n\n        (new DataDiffer(this._featureNames || [], featureNames))\n            .add(processFeature)\n            .update(processFeature)\n            .remove(zrUtil.curry(processFeature, null))\n            .execute();\n\n        // Keep for diff.\n        this._featureNames = featureNames;\n\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\n            if (featureName && !oldName) { // Create\n                if (isUserFeatureName(featureName)) {\n                    feature = {\n                        model: featureModel,\n                        onclick: featureModel.option.onclick,\n                        featureName: featureName\n                    };\n                }\n                else {\n                    var Feature = featureManager.get(featureName);\n                    if (!Feature) {\n                        return;\n                    }\n                    feature = new Feature(featureModel, ecModel, api);\n                }\n                features[featureName] = feature;\n            }\n            else {\n                feature = features[oldName];\n                // If feature does not exsit.\n                if (!feature) {\n                    return;\n                }\n                feature.model = featureModel;\n                feature.ecModel = ecModel;\n                feature.api = api;\n            }\n\n            if (!featureName && oldName) {\n                feature.dispose && feature.dispose(ecModel, api);\n                return;\n            }\n\n            if (!featureModel.get('show') || feature.unusable) {\n                feature.remove && feature.remove(ecModel, api);\n                return;\n            }\n\n            createIconPaths(featureModel, feature, featureName);\n\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                // FIXME\n                iconPaths[iconName] && iconPaths[iconName].trigger(status);\n            };\n\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\n            // If one feature has mutiple icon. they are orginaized as\n            // {\n            //     icon: {\n            //         foo: '',\n            //         bar: ''\n            //     },\n            //     title: {\n            //         foo: '',\n            //         bar: ''\n            //     }\n            // }\n            var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon');\n            var titles = featureModel.get('title') || {};\n            if (typeof icons === 'string') {\n                var icon = icons;\n                var title = titles;\n                icons = {};\n                titles = {};\n                icons[featureName] = icon;\n                titles[featureName] = title;\n            }\n            var iconPaths = featureModel.iconPaths = {};\n            zrUtil.each(icons, function (iconStr, iconName) {\n                var path = graphic.createIcon(\n                    iconStr,\n                    {},\n                    {\n                        x: -itemSize / 2,\n                        y: -itemSize / 2,\n                        width: itemSize,\n                        height: itemSize\n                    }\n                );\n                path.setStyle(iconStyleModel.getItemStyle());\n                path.hoverStyle = iconStyleEmphasisModel.getItemStyle();\n\n                var tooltipModel = toolboxModel.getModel('tooltip');\n                if (tooltipModel && tooltipModel.get('show')) {\n                    path.attr('tooltip', zrUtil.extend({\n                        content: titles[iconName],\n                        formatter: tooltipModel.get('formatter', true)\n                            || function () {\n                                return titles[iconName];\n                            },\n                        formatterParams: {\n                            componentType: 'toolbox',\n                            name: iconName,\n                            title: titles[iconName],\n                            $vars: ['name', 'title']\n                        },\n                        position: tooltipModel.get('position', true) || 'bottom'\n                    }, tooltipModel.option));\n                }\n\n                graphic.setHoverStyle(path);\n\n                if (toolboxModel.get('showTitle')) {\n                    path.__title = titles[iconName];\n                    path.on('mouseover', function () {\n                            // Should not reuse above hoverStyle, which might be modified.\n                            var hoverStyle = iconStyleEmphasisModel.getItemStyle();\n                            path.setStyle({\n                                text: titles[iconName],\n                                textPosition: iconStyleEmphasisModel.get('textPosition') || 'bottom',\n                                textFill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000',\n                                textAlign: iconStyleEmphasisModel.get('textAlign') || 'center',\n                                textBackgroundColor: iconStyleEmphasisModel.get('textBackgroundColor'),\n                                textBorderRadius: iconStyleEmphasisModel.get('textBorderRadius'),\n                                textPadding: iconStyleEmphasisModel.get('textPadding')\n                            });\n                        })\n                        .on('mouseout', function () {\n                            path.setStyle({\n                                textFill: null,\n                                textBackgroundColor: null\n                            });\n                        });\n                }\n                path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal');\n\n                group.add(path);\n                path.on('click', zrUtil.bind(\n                    feature.onclick, feature, ecModel, api, iconName\n                ));\n\n                iconPaths[iconName] = path;\n            });\n        }\n\n        listComponentHelper.layout(group, toolboxModel, api);\n        // Render background after group is layout\n        // FIXME\n        group.add(listComponentHelper.makeBackground(group.getBoundingRect(), toolboxModel));\n\n        // Adjust icon title positions to avoid them out of screen\n        group.eachChild(function (icon) {\n            var titleText = icon.__title;\n            var hoverStyle = icon.hoverStyle;\n            // May be background element\n            if (hoverStyle && titleText) {\n                var rect = textContain.getBoundingRect(\n                    titleText, textContain.makeFont(hoverStyle)\n                );\n                var offsetX = icon.position[0] + group.position[0];\n                var offsetY = icon.position[1] + group.position[1] + itemSize;\n\n                var needPutOnTop = false;\n                if (offsetY + rect.height > api.getHeight()) {\n                    hoverStyle.textPosition = 'top';\n                    needPutOnTop = true;\n                }\n                var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8);\n                if (offsetX + rect.width / 2 > api.getWidth()) {\n                    hoverStyle.textPosition = ['100%', topOffset];\n                    hoverStyle.textAlign = 'right';\n                }\n                else if (offsetX - rect.width / 2 < 0) {\n                    hoverStyle.textPosition = [0, topOffset];\n                    hoverStyle.textAlign = 'left';\n                }\n            }\n        });\n    },\n\n    updateView: function (toolboxModel, ecModel, api, payload) {\n        zrUtil.each(this._features, function (feature) {\n            feature.updateView && feature.updateView(feature.model, ecModel, api, payload);\n        });\n    },\n\n    // updateLayout: function (toolboxModel, ecModel, api, payload) {\n    //     zrUtil.each(this._features, function (feature) {\n    //         feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);\n    //     });\n    // },\n\n    remove: function (ecModel, api) {\n        zrUtil.each(this._features, function (feature) {\n            feature.remove && feature.remove(ecModel, api);\n        });\n        this.group.removeAll();\n    },\n\n    dispose: function (ecModel, api) {\n        zrUtil.each(this._features, function (feature) {\n            feature.dispose && feature.dispose(ecModel, api);\n        });\n    }\n});\n\nfunction isUserFeatureName(featureName) {\n    return featureName.indexOf('my') === 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/* global Uint8Array */\n\nimport env from 'zrender/src/core/env';\nimport lang from '../../../lang';\nimport * as featureManager from '../featureManager';\n\nvar saveAsImageLang = lang.toolbox.saveAsImage;\n\nfunction SaveAsImage(model) {\n    this.model = model;\n}\n\nSaveAsImage.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: saveAsImageLang.title,\n    type: 'png',\n    // Default use option.backgroundColor\n    // backgroundColor: '#fff',\n    connectedBackgroundColor: '#fff',\n    name: '',\n    excludeComponents: ['toolbox'],\n    pixelRatio: 1,\n    lang: saveAsImageLang.lang.slice()\n};\n\nSaveAsImage.prototype.unusable = !env.canvasSupported;\n\nvar proto = SaveAsImage.prototype;\n\nproto.onclick = function (ecModel, api) {\n    var model = this.model;\n    var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';\n    var type = model.get('type', true) || 'png';\n    var url = api.getConnectedDataURL({\n        type: type,\n        backgroundColor: model.get('backgroundColor', true)\n            || ecModel.get('backgroundColor') || '#fff',\n        connectedBackgroundColor: model.get('connectedBackgroundColor'),\n        excludeComponents: model.get('excludeComponents'),\n        pixelRatio: model.get('pixelRatio')\n    });\n    // Chrome and Firefox\n    if (typeof MouseEvent === 'function' && !env.browser.ie && !env.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            view: window,\n            bubbles: true,\n            cancelable: false\n        });\n        $a.dispatchEvent(evt);\n    }\n    // IE\n    else {\n        if (window.navigator.msSaveOrOpenBlob) {\n            var bstr = atob(url.split(',')[1]);\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]);\n            window.navigator.msSaveOrOpenBlob(blob, title + '.' + type);\n        }\n        else {\n            var lang = model.get('lang');\n            var html = ''\n                + '<body style=\"margin:0;\">'\n                + '<img src=\"' + url + '\" style=\"max-width:100%;\" title=\"' + ((lang && lang[0]) || '') + '\" />'\n                + '</body>';\n            var tab = window.open();\n            tab.document.write(html);\n        }\n    }\n};\n\nfeatureManager.register(\n    'saveAsImage', SaveAsImage\n);\n\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\nimport * as echarts from '../../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport lang from '../../../lang';\nimport * as featureManager from '../featureManager';\n\nvar magicTypeLang = lang.toolbox.magicType;\n\nfunction MagicType(model) {\n    this.model = model;\n}\n\nMagicType.defaultOption = {\n    show: true,\n    type: [],\n    // Icon group\n    icon: {\n        /* eslint-disable */\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        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        tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z'\n        /* eslint-enable */\n    },\n    // `line`, `bar`, `stack`, `tiled`\n    title: zrUtil.clone(magicTypeLang.title),\n    option: {},\n    seriesIndex: {}\n};\n\nvar proto = MagicType.prototype;\n\nproto.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\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        if (seriesType === 'line' || seriesType === 'bar') {\n            return zrUtil.merge({\n                id: seriesId,\n                stack: '__ec_magicType_stack__'\n            }, model.get('option.stack') || {}, true);\n        }\n    },\n    'tiled': function (seriesType, seriesId, seriesModel, model) {\n        if (seriesType === 'line' || seriesType === 'bar') {\n            return zrUtil.merge({\n                id: seriesId,\n                stack: ''\n            }, model.get('option.tiled') || {}, true);\n        }\n    }\n};\n\nvar radioTypes = [\n    ['line', 'bar'],\n    ['stack', 'tiled']\n];\n\nproto.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](\n            seriesType, seriesId, seriesModel, model\n        );\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 = ecModel.queryComponents({\n                    mainType: axisType,\n                    index: seriesModel.get(name + 'Index'),\n                    id: seriesModel.get(name + 'Id')\n                })[0];\n                var axisIndex = axisModel.componentIndex;\n\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\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\n    model.setIconStatus(type, 'emphasis');\n\n    ecModel.eachComponent(\n        {\n            mainType: 'series',\n            query: seriesIndex == null ? null : {\n                seriesIndex: seriesIndex\n            }\n        }, generateNewSeriesTypes\n    );\n    api.dispatchAction({\n        type: 'changeMagicType',\n        currentType: type,\n        newOption: newOption\n    });\n};\n\necharts.registerAction({\n    type: 'changeMagicType',\n    event: 'magicTypeChanged',\n    update: 'prepareAndUpdate'\n}, function (payload, ecModel) {\n    ecModel.mergeOption(payload.newOption);\n});\n\nfeatureManager.register('magicType', MagicType);\n\nexport default MagicType;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as eventTool from 'zrender/src/core/event';\nimport lang from '../../../lang';\nimport * as featureManager from '../featureManager';\n\nvar dataViewLang = lang.toolbox.dataView;\n\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 * @param {module:echarts/model/Global} ecModel\n * @return {Object}\n * @inner\n */\nfunction groupSeries(ecModel) {\n    var seriesGroupByCategoryAxis = {};\n    var otherSeries = [];\n    var meta = [];\n    ecModel.eachRawSeries(function (seriesModel) {\n        var coordSys = seriesModel.coordinateSystem;\n\n        if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {\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            }\n            else {\n                otherSeries.push(seriesModel);\n            }\n        }\n        else {\n            otherSeries.push(seriesModel);\n        }\n    });\n\n    return {\n        seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,\n        other: otherSeries,\n        meta: meta\n    };\n}\n\n/**\n * Assemble content of series on cateogory axis\n * @param {Array.<module:echarts/model/Series>} series\n * @return {string}\n * @inner\n */\nfunction assembleSeriesWithCategoryAxis(series) {\n    var tables = [];\n    zrUtil.each(series, function (group, key) {\n        var categoryAxis = group.categoryAxis;\n        var valueAxis = group.valueAxis;\n        var valueAxisDim = valueAxis.dim;\n\n        var headers = [' '].concat(zrUtil.map(group.series, function (series) {\n            return series.name;\n        }));\n        var columns = [categoryAxis.model.getCategories()];\n        zrUtil.each(group.series, function (series) {\n            columns.push(series.getRawData().mapArray(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/**\n * Assemble content of other series\n * @param {Array.<module:echarts/model/Series>} series\n * @return {string}\n * @inner\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}\n\n/**\n * @param {module:echarts/model/Global}\n * @return {Object}\n * @inner\n */\nfunction getContentFromModel(ecModel) {\n\n    var result = groupSeries(ecModel);\n\n    return {\n        value: zrUtil.filter([\n                assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis),\n                assembleOtherSeries(result.other)\n            ], function (str) {\n                return str.replace(/[\\n\\t\\s]/g, '');\n            }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n'),\n\n        meta: result.meta\n    };\n}\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}\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\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}\n\n/**\n * @param {string} str\n * @return {Array.<Object>}\n * @inner\n */\nfunction parseListContents(str) {\n    var lines = str.split(/\\n+/g);\n    var seriesName = trim(lines.shift());\n\n    var data = [];\n    for (var i = 0; i < lines.length; i++) {\n        var items = trim(lines[i]).split(itemSplitRegex);\n        var name = '';\n        var value;\n        var hasName = false;\n        if (isNaN(items[0])) { // First item is name\n            hasName = true;\n            name = items[0];\n            items = items.slice(1);\n            data[i] = {\n                name: name,\n                value: []\n            };\n            value = data[i].value;\n        }\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\n    return {\n        name: seriesName,\n        data: data\n    };\n}\n\n/**\n * @param {string} str\n * @param {Array.<Object>} blockMetaList\n * @return {Object}\n * @inner\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\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        }\n        else {\n            var result = parseListContents(block);\n            newOption.series.push(result);\n        }\n    });\n    return newOption;\n}\n\n/**\n * @alias {module:echarts/component/toolbox/feature/DataView}\n * @constructor\n * @param {module:echarts/model/Model} model\n */\nfunction DataView(model) {\n\n    this._dom = null;\n\n    this.model = model;\n}\n\nDataView.defaultOption = {\n    show: true,\n    readOnly: false,\n    optionToContent: null,\n    contentToOption: null,\n\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: zrUtil.clone(dataViewLang.title),\n    lang: zrUtil.clone(dataViewLang.lang),\n    backgroundColor: '#fff',\n    textColor: '#000',\n    textareaColor: '#fff',\n    textareaBorderColor: '#333',\n    buttonColor: '#c23531',\n    buttonTextColor: '#fff'\n};\n\nDataView.prototype.onclick = function (ecModel, api) {\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    root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;';\n    root.style.backgroundColor = model.get('backgroundColor') || '#fff';\n\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\n    var viewMain = document.createElement('div');\n    var textarea = document.createElement('textarea');\n    viewMain.style.cssText = 'display:block;width:100%;overflow:auto;';\n\n    var optionToContent = model.get('optionToContent');\n    var contentToOption = model.get('contentToOption');\n    var result = getContentFromModel(ecModel);\n    if (typeof optionToContent === 'function') {\n        var htmlOrDom = optionToContent(api.getOption());\n        if (typeof htmlOrDom === 'string') {\n            viewMain.innerHTML = htmlOrDom;\n        }\n        else if (zrUtil.isDom(htmlOrDom)) {\n            viewMain.appendChild(htmlOrDom);\n        }\n    }\n    else {\n        // Use default textarea\n        viewMain.appendChild(textarea);\n        textarea.readOnly = model.get('readOnly');\n        textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;';\n        textarea.style.color = model.get('textColor');\n        textarea.style.borderColor = model.get('textareaBorderColor');\n        textarea.style.backgroundColor = model.get('textareaColor');\n        textarea.value = result.value;\n    }\n\n    var blockMetaList = result.meta;\n\n    var buttonContainer = document.createElement('div');\n    buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;';\n\n    var buttonStyle = 'float:right;margin-right:20px;border:none;'\n        + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';\n    var closeButton = document.createElement('div');\n    var refreshButton = document.createElement('div');\n\n    buttonStyle += ';background-color:' + model.get('buttonColor');\n    buttonStyle += ';color:' + model.get('buttonTextColor');\n\n    var self = this;\n\n    function close() {\n        container.removeChild(root);\n        self._dom = null;\n    }\n    eventTool.addEventListener(closeButton, 'click', close);\n\n    eventTool.addEventListener(refreshButton, 'click', function () {\n        var newOption;\n        try {\n            if (typeof contentToOption === 'function') {\n                newOption = contentToOption(viewMain, api.getOption());\n            }\n            else {\n                newOption = parseContents(textarea.value, blockMetaList);\n            }\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\n        close();\n    });\n\n    closeButton.innerHTML = lang[1];\n    refreshButton.innerHTML = lang[2];\n    refreshButton.style.cssText = buttonStyle;\n    closeButton.style.cssText = buttonStyle;\n\n    !model.get('readOnly') && buttonContainer.appendChild(refreshButton);\n    buttonContainer.appendChild(closeButton);\n\n    root.appendChild(header);\n    root.appendChild(viewMain);\n    root.appendChild(buttonContainer);\n\n    viewMain.style.height = (container.clientHeight - 80) + 'px';\n\n    container.appendChild(root);\n    this._dom = root;\n};\n\nDataView.prototype.remove = function (ecModel, api) {\n    this._dom && api.getDom().removeChild(this._dom);\n};\n\nDataView.prototype.dispose = function (ecModel, api) {\n    this.remove(ecModel, api);\n};\n\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            if (zrUtil.isObject(newVal) && !zrUtil.isArray(newVal)) {\n                newVal = newVal.value;\n            }\n            // Original data has option\n            return zrUtil.defaults({\n                value: newVal\n            }, original);\n        }\n        else {\n            return newVal;\n        }\n    });\n}\n\nfeatureManager.register('dataView', DataView);\n\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        }\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\n    ecModel.mergeOption(zrUtil.defaults({\n        series: newSeriesOptList\n    }, payload.newOption));\n});\n\nexport default DataView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport * as modelUtil from '../../util/model';\nimport * as brushHelper from './brushHelper';\n\nvar each = zrUtil.each;\nvar indexOf = zrUtil.indexOf;\nvar curry = zrUtil.curry;\n\nvar COORD_CONVERTS = ['dataToPoint', 'pointToData'];\n\n// FIXME\n// how to genarialize to more coordinate systems.\nvar INCLUDE_FINDER_MAIN_TYPES = [\n    'grid', 'xAxis', 'yAxis', 'geo', 'graph',\n    'polar', 'radiusAxis', 'angleAxis', 'bmap'\n];\n\n/**\n * [option in constructor]:\n * {\n *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.\n * }\n *\n *\n * [targetInfo]:\n *\n * There can be multiple axes in a single targetInfo. Consider the case\n * of `grid` component, a targetInfo represents a grid which contains one or more\n * cartesian and one or more axes. And consider the case of parallel system,\n * which has multiple axes in a coordinate system.\n * Can be {\n *     panelId: ...,\n *     coordSys: <a representitive cartesian in grid (first cartesian by default)>,\n *     coordSyses: all cartesians.\n *     gridModel: <grid component>\n *     xAxes: correspond to coordSyses on index\n *     yAxes: correspond to coordSyses on index\n * }\n * or {\n *     panelId: ...,\n *     coordSys: <geo coord sys>\n *     coordSyses: [<geo coord sys>]\n *     geoModel: <geo component>\n * }\n *\n *\n * [panelOpt]:\n *\n * Make from targetInfo. Input to BrushController.\n * {\n *     panelId: ...,\n *     rect: ...\n * }\n *\n *\n * [area]:\n *\n * Generated by BrushController or user input.\n * {\n *     panelId: Used to locate coordInfo directly. If user inpput, no panelId.\n *     brushType: determine how to convert to/from coord('rect' or 'polygon' or 'lineX/Y').\n *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.\n *     range: pixel range.\n *     coordRange: representitive coord range (the first one of coordRanges).\n *     coordRanges: <Array> coord ranges, used in multiple cartesian in one grid.\n * }\n */\n\n/**\n * @param {Object} option contains Index/Id/Name of xAxis/yAxis/geo/grid\n *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}\n * @param {module:echarts/model/Global} ecModel\n * @param {Object} [opt]\n * @param {Array.<string>} [opt.include] include coordinate system types.\n */\nfunction BrushTargetManager(option, ecModel, opt) {\n    /**\n     * @private\n     * @type {Array.<Object>}\n     */\n    var targetInfoList = this._targetInfoList = [];\n    var info = {};\n    var foundCpts = parseFinder(ecModel, option);\n\n    each(targetInfoBuilders, function (builder, type) {\n        if (!opt || !opt.include || indexOf(opt.include, type) >= 0) {\n            builder(foundCpts, targetInfoList, info);\n        }\n    });\n}\n\nvar proto = BrushTargetManager.prototype;\n\nproto.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};\n\nproto.matchOutputRanges = function (areas, ecModel, cb) {\n    each(areas, function (area) {\n        var targetInfo = this.findTargetInfo(area, ecModel);\n\n        if (targetInfo && targetInfo !== true) {\n            zrUtil.each(\n                targetInfo.coordSyses,\n                function (coordSys) {\n                    var result = coordConvert[area.brushType](1, coordSys, area.range);\n                    cb(area, result.values, coordSys, ecModel);\n                }\n            );\n        }\n    }, this);\n};\n\nproto.setInputRanges = function (areas, ecModel) {\n    each(areas, function (area) {\n        var targetInfo = this.findTargetInfo(area, ecModel);\n\n        if (__DEV__) {\n            zrUtil.assert(\n                !targetInfo || targetInfo === true || area.coordRange,\n                'coordRange must be specified when coord index specified.'\n            );\n            zrUtil.assert(\n                !targetInfo || targetInfo !== true || area.range,\n                'range must be specified in global brush.'\n            );\n        }\n\n        area.range = area.range || [];\n\n        // convert coordRange to global range and set panelId.\n        if (targetInfo && targetInfo !== true) {\n            area.panelId = targetInfo.panelId;\n            // (1) area.range shoule 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\n                ? diffProcessor[area.brushType](\n                    result.values,\n                    rangeOffset.offset,\n                    getScales(result.xyMinMax, rangeOffset.xyMinMax)\n                )\n                : result.values;\n        }\n    }, this);\n};\n\nproto.makePanelOpts = function (api, getDefaultBrushType) {\n    return zrUtil.map(this._targetInfoList, function (targetInfo) {\n        var rect = targetInfo.getPanelRect();\n        return {\n            panelId: targetInfo.panelId,\n            defaultBrushType: getDefaultBrushType && getDefaultBrushType(targetInfo),\n            clipPath: brushHelper.makeRectPanelClipPath(rect),\n            isTargetByCursor: brushHelper.makeRectIsTargetByCursor(\n                rect, api, targetInfo.coordSysModel\n            ),\n            getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect)\n        };\n    });\n};\n\nproto.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 || (\n        targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0\n    );\n};\n\n/**\n * If return Object, a coord found.\n * If reutrn true, global found.\n * Otherwise nothing found.\n *\n * @param {Object} area\n * @param {Array} targetInfoList\n * @return {Object|boolean}\n */\nproto.findTargetInfo = function (area, ecModel) {\n    var targetInfoList = this._targetInfoList;\n    var foundCpts = parseFinder(ecModel, area);\n\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        }\n        else {\n            for (var i = 0; i < targetInfoMatchers.length; i++) {\n                if (targetInfoMatchers[i](foundCpts, targetInfo)) {\n                    return targetInfo;\n                }\n            }\n        }\n    }\n\n    return true;\n};\n\nfunction formatMinMax(minMax) {\n    minMax[0] > minMax[1] && minMax.reverse();\n    return minMax;\n}\n\nfunction parseFinder(ecModel, option) {\n    return modelUtil.parseFinder(\n        ecModel, option, {includeMainTypes: INCLUDE_FINDER_MAIN_TYPES}\n    );\n}\n\nvar targetInfoBuilders = {\n\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 = zrUtil.createHashMap();\n        var xAxesHas = {};\n        var yAxesHas = {};\n\n        if (!xAxisModels && !yAxisModels && !gridModels) {\n            return;\n        }\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\n        gridModelMap.each(function (gridModel) {\n            var grid = gridModel.coordinateSystem;\n            var cartesians = [];\n\n            each(grid.getCartesians(), function (cartesian, index) {\n                if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0\n                    || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0\n                ) {\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: panelRectBuilder.grid,\n                xAxisDeclared: xAxesHas[gridModel.id],\n                yAxisDeclared: yAxesHas[gridModel.id]\n            });\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: panelRectBuilder.geo\n            });\n        });\n    }\n};\n\nvar targetInfoMatchers = [\n\n    // grid\n    function (foundCpts, targetInfo) {\n        var xAxisModel = foundCpts.xAxisModel;\n        var yAxisModel = foundCpts.yAxisModel;\n        var gridModel = foundCpts.gridModel;\n\n        !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model);\n        !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model);\n\n        return gridModel && gridModel === targetInfo.gridModel;\n    },\n\n    // geo\n    function (foundCpts, targetInfo) {\n        var geoModel = foundCpts.geoModel;\n        return geoModel && geoModel === targetInfo.geoModel;\n    }\n];\n\nvar panelRectBuilder = {\n\n    grid: function () {\n        // grid is not Transformable.\n        return this.coordSys.grid.getRect().clone();\n    },\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};\n\nvar coordConvert = {\n\n    lineX: curry(axisConvert, 0),\n\n    lineY: curry(axisConvert, 1),\n\n    rect: function (to, coordSys, rangeOrCoordRange) {\n        var xminymin = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]]);\n        var xmaxymax = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]]);\n        var values = [\n            formatMinMax([xminymin[0], xmaxymax[0]]),\n            formatMinMax([xminymin[1], xmaxymax[1]])\n        ];\n        return {values: values, xyMinMax: values};\n    },\n\n    polygon: function (to, coordSys, rangeOrCoordRange) {\n        var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]];\n        var values = zrUtil.map(rangeOrCoordRange, function (item) {\n            var p = coordSys[COORD_CONVERTS[to]](item);\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 {values: values, xyMinMax: xyMinMax};\n    }\n};\n\nfunction axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) {\n    if (__DEV__) {\n        zrUtil.assert(\n            coordSys.type === 'cartesian2d',\n            'lineX/lineY brush is available only in cartesian2d.'\n        );\n    }\n\n    var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]);\n    var values = formatMinMax(zrUtil.map([0, 1], function (i) {\n        return to\n            ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]))\n            : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i]));\n    }));\n    var xyMinMax = [];\n    xyMinMax[axisNameIndex] = values;\n    xyMinMax[1 - axisNameIndex] = [NaN, NaN];\n\n    return {values: values, xyMinMax: xyMinMax};\n}\n\nvar diffProcessor = {\n    lineX: curry(axisDiffProcessor, 0),\n\n    lineY: curry(axisDiffProcessor, 1),\n\n    rect: function (values, refer, scales) {\n        return [\n            [values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]],\n            [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]\n        ];\n    },\n\n    polygon: function (values, refer, scales) {\n        return zrUtil.map(values, function (item, idx) {\n            return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]];\n        });\n    }\n};\n\nfunction axisDiffProcessor(axisNameIndex, values, refer, scales) {\n    return [\n        values[0] - scales[axisNameIndex] * refer[0],\n        values[1] - scales[axisNameIndex] * refer[1]\n    ];\n}\n\n// We have to process scale caused by dataZoom manually,\n// although it might be not accurate.\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}\n\nfunction getSize(xyMinMax) {\n    return xyMinMax\n        ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]]\n        : [NaN, NaN];\n}\n\nexport default BrushTargetManager;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar each = zrUtil.each;\n\nvar ATTR = '\\0_ec_hist_store';\n\n/**\n * @param {module:echarts/model/Global} ecModel\n * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]}\n */\nexport function push(ecModel, newSnapshot) {\n    var store = giveStore(ecModel);\n\n    // If previous dataZoom can not be found,\n    // complete an range with current range.\n    each(newSnapshot, function (batchItem, dataZoomId) {\n        var i = store.length - 1;\n        for (; i >= 0; i--) {\n            var snapshot = store[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', subType: 'select', id: dataZoomId}\n            )[0];\n            if (dataZoomModel) {\n                var percentRange = dataZoomModel.getPercentRange();\n                store[0][dataZoomId] = {\n                    dataZoomId: dataZoomId,\n                    start: percentRange[0],\n                    end: percentRange[1]\n                };\n            }\n        }\n    });\n\n    store.push(newSnapshot);\n}\n\n/**\n * @param {module:echarts/model/Global} ecModel\n * @return {Object} snapshot\n */\nexport function pop(ecModel) {\n    var store = giveStore(ecModel);\n    var head = store[store.length - 1];\n    store.length > 1 && store.pop();\n\n    // Find top for all dataZoom.\n    var snapshot = {};\n    each(head, function (batchItem, dataZoomId) {\n        for (var i = store.length - 1; i >= 0; i--) {\n            var batchItem = store[i][dataZoomId];\n            if (batchItem) {\n                snapshot[dataZoomId] = batchItem;\n                break;\n            }\n        }\n    });\n\n    return snapshot;\n}\n\n/**\n * @param {module:echarts/model/Global} ecModel\n */\nexport function clear(ecModel) {\n    ecModel[ATTR] = null;\n}\n\n/**\n * @param {module:echarts/model/Global} ecModel\n * @return {number} records. always >= 1.\n */\nexport function count(ecModel) {\n    return giveStore(ecModel).length;\n}\n\n/**\n * [{key: dataZoomId, value: {dataZoomId, range}}, ...]\n * History length of each dataZoom may be different.\n * this._history[0] is used to store origin range.\n * @type {Array.<Object>}\n */\nfunction giveStore(ecModel) {\n    var store = ecModel[ATTR];\n    if (!store) {\n        store = ecModel[ATTR] = [{}];\n    }\n    return store;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport Component from '../../model/Component';\n\nComponent.registerSubTypeDefaulter('dataZoom', function () {\n    // Default 'slider' when no type specified.\n    return 'slider';\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as formatUtil from '../../util/format';\n\n\nvar AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle', 'single'];\n// Supported coords.\nvar COORDS = ['cartesian2d', 'polar', 'singleAxis'];\n\n/**\n * @param {string} coordType\n * @return {boolean}\n */\nexport function isCoordSupported(coordType) {\n    return zrUtil.indexOf(COORDS, coordType) >= 0;\n}\n\n/**\n * Create \"each\" method to iterate names.\n *\n * @pubilc\n * @param  {Array.<string>} names\n * @param  {Array.<string>=} attrs\n * @return {Function}\n */\nexport function createNameEach(names, attrs) {\n    names = names.slice();\n    var capitalNames = zrUtil.map(names, formatUtil.capitalFirst);\n    attrs = (attrs || []).slice();\n    var capitalAttrs = zrUtil.map(attrs, formatUtil.capitalFirst);\n\n    return function (callback, context) {\n        zrUtil.each(names, function (name, index) {\n            var nameObj = {name: name, capital: capitalNames[index]};\n\n            for (var j = 0; j < attrs.length; j++) {\n                nameObj[attrs[j]] = name + capitalAttrs[j];\n            }\n\n            callback.call(context, nameObj);\n        });\n    };\n}\n\n/**\n * Iterate each dimension name.\n *\n * @public\n * @param {Function} callback The parameter is like:\n *                            {\n *                                name: 'angle',\n *                                capital: 'Angle',\n *                                axis: 'angleAxis',\n *                                axisIndex: 'angleAixs',\n *                                index: 'angleIndex'\n *                            }\n * @param {Object} context\n */\nexport var eachAxisDim = createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index', 'id']);\n\n/**\n * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'.\n * dataZoomModels and 'links' make up one or more graphics.\n * This function finds the graphic where the source dataZoomModel is in.\n *\n * @public\n * @param {Function} forEachNode Node iterator.\n * @param {Function} forEachEdgeType edgeType iterator\n * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id.\n * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}}\n */\nexport function createLinkedNodesFinder(forEachNode, forEachEdgeType, edgeIdGetter) {\n\n    return function (sourceNode) {\n        var result = {\n            nodes: [],\n            records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean).\n        };\n\n        forEachEdgeType(function (edgeType) {\n            result.records[edgeType.name] = {};\n        });\n\n        if (!sourceNode) {\n            return result;\n        }\n\n        absorb(sourceNode, result);\n\n        var existsLink;\n        do {\n            existsLink = false;\n            forEachNode(processSingleNode);\n        }\n        while (existsLink);\n\n        function processSingleNode(node) {\n            if (!isNodeAbsorded(node, result) && isLinked(node, result)) {\n                absorb(node, result);\n                existsLink = true;\n            }\n        }\n\n        return result;\n    };\n\n    function isNodeAbsorded(node, result) {\n        return zrUtil.indexOf(result.nodes, node) >= 0;\n    }\n\n    function isLinked(node, result) {\n        var hasLink = false;\n        forEachEdgeType(function (edgeType) {\n            zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) {\n                result.records[edgeType.name][edgeId] && (hasLink = true);\n            });\n        });\n        return hasLink;\n    }\n\n    function absorb(node, result) {\n        result.nodes.push(node);\n        forEachEdgeType(function (edgeType) {\n            zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) {\n                result.records[edgeType.name][edgeId] = 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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as numberUtil from '../../util/number';\nimport * as helper from './helper';\nimport sliderMove from '../helper/sliderMove';\n\nvar each = zrUtil.each;\nvar asc = numberUtil.asc;\n\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 *\n * @class\n */\nvar AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) {\n\n    /**\n     * @private\n     * @type {string}\n     */\n    this._dimName = dimName;\n\n    /**\n     * @private\n     */\n    this._axisIndex = axisIndex;\n\n    /**\n     * @private\n     * @type {Array.<number>}\n     */\n    this._valueWindow;\n\n    /**\n     * @private\n     * @type {Array.<number>}\n     */\n    this._percentWindow;\n\n    /**\n     * @private\n     * @type {Array.<number>}\n     */\n    this._dataExtent;\n\n    /**\n     * {minSpan, maxSpan, minValueSpan, maxValueSpan}\n     * @private\n     * @type {Object}\n     */\n    this._minMaxSpan;\n\n    /**\n     * @readOnly\n     * @type {module: echarts/model/Global}\n     */\n    this.ecModel = ecModel;\n\n    /**\n     * @private\n     * @type {module: echarts/component/dataZoom/DataZoomModel}\n     */\n    this._dataZoomModel = dataZoomModel;\n\n    // /**\n    //  * @readOnly\n    //  * @private\n    //  */\n    // this.hasSeriesStacked;\n};\n\nAxisProxy.prototype = {\n\n    constructor: AxisProxy,\n\n    /**\n     * Whether the axisProxy is hosted by dataZoomModel.\n     *\n     * @public\n     * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n     * @return {boolean}\n     */\n    hostedBy: function (dataZoomModel) {\n        return this._dataZoomModel === dataZoomModel;\n    },\n\n    /**\n     * @return {Array.<number>} Value can only be NaN or finite value.\n     */\n    getDataValueWindow: function () {\n        return this._valueWindow.slice();\n    },\n\n    /**\n     * @return {Array.<number>}\n     */\n    getDataPercentWindow: function () {\n        return this._percentWindow.slice();\n    },\n\n    /**\n     * @public\n     * @param {number} axisIndex\n     * @return {Array} seriesModels\n     */\n    getTargetSeriesModels: function () {\n        var seriesModels = [];\n        var ecModel = this.ecModel;\n\n        ecModel.eachSeries(function (seriesModel) {\n            if (helper.isCoordSupported(seriesModel.get('coordinateSystem'))) {\n                var dimName = this._dimName;\n                var axisModel = ecModel.queryComponents({\n                    mainType: dimName + 'Axis',\n                    index: seriesModel.get(dimName + 'AxisIndex'),\n                    id: seriesModel.get(dimName + 'AxisId')\n                })[0];\n                if (this._axisIndex === (axisModel && axisModel.componentIndex)) {\n                    seriesModels.push(seriesModel);\n                }\n            }\n        }, this);\n\n        return seriesModels;\n    },\n\n    getAxisModel: function () {\n        return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);\n    },\n\n    getOtherAxisModel: function () {\n        var axisDim = this._dimName;\n        var ecModel = this.ecModel;\n        var axisModel = this.getAxisModel();\n        var isCartesian = axisDim === 'x' || axisDim === 'y';\n        var otherAxisDim;\n        var coordSysIndexName;\n        if (isCartesian) {\n            coordSysIndexName = 'gridIndex';\n            otherAxisDim = axisDim === 'x' ? 'y' : 'x';\n        }\n        else {\n            coordSysIndexName = 'polarIndex';\n            otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle';\n        }\n        var foundOtherAxisModel;\n        ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) {\n            if ((otherAxisModel.get(coordSysIndexName) || 0)\n                === (axisModel.get(coordSysIndexName) || 0)\n            ) {\n                foundOtherAxisModel = otherAxisModel;\n            }\n        });\n        return foundOtherAxisModel;\n    },\n\n    getMinMaxSpan: function () {\n        return zrUtil.clone(this._minMaxSpan);\n    },\n\n    /**\n     * Only calculate by given range and this._dataExtent, do not change anything.\n     *\n     * @param {Object} opt\n     * @param {number} [opt.start]\n     * @param {number} [opt.end]\n     * @param {number} [opt.startValue]\n     * @param {number} [opt.endValue]\n     */\n    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\n        each(['start', 'end'], function (prop, idx) {\n            var boundPercent = opt[prop];\n            var boundValue = opt[prop + 'Value'];\n\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\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(\n                    boundPercent, percentExtent, dataExtent\n                ));\n            }\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(\n                    boundValue, dataExtent, percentExtent\n                );\n            }\n\n            // valueWindow[idx] = round(boundValue);\n            // percentWindow[idx] = round(boundPercent);\n            valueWindow[idx] = boundValue;\n            percentWindow[idx] = boundPercent;\n        });\n\n        asc(valueWindow);\n        asc(percentWindow);\n\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 dont 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\n            ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false)\n            : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true);\n\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\n        return {\n            valueWindow: valueWindow,\n            percentWindow: percentWindow\n        };\n    },\n\n    /**\n     * Notice: reset should not be called before series.restoreData() called,\n     * so it is recommanded to be called in \"process stage\" but not \"model init\n     * stage\".\n     *\n     * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n     */\n    reset: function (dataZoomModel) {\n        if (dataZoomModel !== this._dataZoomModel) {\n            return;\n        }\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\n        // this.hasSeriesStacked = false;\n        // each(targetSeries, function (series) {\n            // var data = series.getData();\n            // var dataDim = data.mapDimension(this._dimName);\n            // var stackedDimension = data.getCalculationInfo('stackedDimension');\n            // if (stackedDimension && stackedDimension === dataDim) {\n                // this.hasSeriesStacked = true;\n            // }\n        // }, this);\n\n        // `calculateDataWindow` uses min/maxSpan.\n        setMinMaxSpan(this);\n\n        var dataWindow = this.calculateDataWindow(dataZoomModel.option);\n\n        this._valueWindow = dataWindow.valueWindow;\n        this._percentWindow = dataWindow.percentWindow;\n\n        // Update axis setting then.\n        setAxisModel(this);\n    },\n\n    /**\n     * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n     */\n    restore: function (dataZoomModel) {\n        if (dataZoomModel !== this._dataZoomModel) {\n            return;\n        }\n\n        this._valueWindow = this._percentWindow = null;\n        setAxisModel(this, true);\n    },\n\n    /**\n     * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n     */\n    filterData: function (dataZoomModel, api) {\n        if (dataZoomModel !== this._dataZoomModel) {\n            return;\n        }\n\n        var axisDim = this._dimName;\n        var seriesModels = this.getTargetSeriesModels();\n        var filterMode = dataZoomModel.get('filterMode');\n        var valueWindow = this._valueWindow;\n\n        if (filterMode === 'none') {\n            return;\n        }\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        // var otherAxisModel = this.getOtherAxisModel();\n        // if (dataZoomModel.get('$fromToolbox')\n        //     && otherAxisModel\n        //     && otherAxisModel.hasSeriesStacked\n        // ) {\n        //     filterMode = 'empty';\n        // }\n\n        // TODO\n        // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet.\n\n        each(seriesModels, function (seriesModel) {\n            var seriesData = seriesModel.getData();\n            var dataDims = seriesData.mapDimension(axisDim, true);\n\n            if (!dataDims.length) {\n                return;\n            }\n\n            if (filterMode === 'weakFilter') {\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 = seriesData.get(dataDims[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            }\n            else {\n                each(dataDims, function (dim) {\n                    if (filterMode === 'empty') {\n                        seriesModel.setData(\n                            seriesData = seriesData.map(dim, function (value) {\n                                return !isInWindow(value) ? NaN : value;\n                            })\n                        );\n                    }\n                    else {\n                        var range = {};\n                        range[dim] = valueWindow;\n\n                        // console.time('select');\n                        seriesData.selectRange(range);\n                        // console.timeEnd('select');\n                    }\n                });\n            }\n\n            each(dataDims, function (dim) {\n                seriesData.setApproximateExtent(valueWindow, dim);\n            });\n        });\n\n        function isInWindow(value) {\n            return value >= valueWindow[0] && value <= valueWindow[1];\n        }\n    }\n};\n\nfunction calculateDataExtent(axisProxy, axisDim, seriesModels) {\n    var dataExtent = [Infinity, -Infinity];\n\n    each(seriesModels, function (seriesModel) {\n        var seriesData = seriesModel.getData();\n        if (seriesData) {\n            each(seriesData.mapDimension(axisDim, true), function (dim) {\n                var seriesExtent = seriesData.getApproximateExtent(dim);\n                seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);\n                seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);\n            });\n        }\n    });\n\n    if (dataExtent[1] < dataExtent[0]) {\n        dataExtent = [NaN, NaN];\n    }\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    fixExtentByAxis(axisProxy, dataExtent);\n\n    return dataExtent;\n}\n\nfunction fixExtentByAxis(axisProxy, dataExtent) {\n    var axisModel = axisProxy.getAxisModel();\n    var min = axisModel.getMin(true);\n\n    // For category axis, if min/max/scale are not set, extent is determined\n    // by axis.data by default.\n    var isCategoryAxis = axisModel.get('type') === 'category';\n    var axisDataLen = isCategoryAxis && axisModel.getCategories().length;\n\n    if (min != null && min !== 'dataMin' && typeof min !== 'function') {\n        dataExtent[0] = min;\n    }\n    else if (isCategoryAxis) {\n        dataExtent[0] = axisDataLen > 0 ? 0 : NaN;\n    }\n\n    var max = axisModel.getMax(true);\n    if (max != null && max !== 'dataMax' && typeof max !== 'function') {\n        dataExtent[1] = max;\n    }\n    else if (isCategoryAxis) {\n        dataExtent[1] = axisDataLen > 0 ? axisDataLen - 1 : NaN;\n    }\n\n    if (!axisModel.get('scale', true)) {\n        dataExtent[0] > 0 && (dataExtent[0] = 0);\n        dataExtent[1] < 0 && (dataExtent[1] = 0);\n    }\n\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\n    return dataExtent;\n}\n\nfunction setAxisModel(axisProxy, isRestore) {\n    var axisModel = axisProxy.getAxisModel();\n\n    var percentWindow = axisProxy._percentWindow;\n    var valueWindow = axisProxy._valueWindow;\n\n    if (!percentWindow) {\n        return;\n    }\n\n    // [0, 500]: arbitrary value, guess axis extent.\n    var precision = numberUtil.getPixelPrecision(valueWindow, [0, 500]);\n    precision = Math.min(precision, 20);\n    // isRestore or isFull\n    var useOrigin = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100);\n\n    axisModel.setRange(\n        useOrigin ? null : +valueWindow[0].toFixed(precision),\n        useOrigin ? null : +valueWindow[1].toFixed(precision)\n    );\n}\n\nfunction setMinMaxSpan(axisProxy) {\n    var minMaxSpan = axisProxy._minMaxSpan = {};\n    var dataZoomModel = axisProxy._dataZoomModel;\n    var dataExtent = axisProxy._dataExtent;\n\n    each(['min', 'max'], function (minMax) {\n        var percentSpan = dataZoomModel.get(minMax + 'Span');\n        var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');\n        valueSpan != null && (valueSpan = axisProxy.getAxisModel().axis.scale.parse(valueSpan));\n\n        // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan\n        if (valueSpan != null) {\n            percentSpan = numberUtil.linearMap(\n                dataExtent[0] + valueSpan, dataExtent, [0, 100], true\n            );\n        }\n        else if (percentSpan != null) {\n            valueSpan = numberUtil.linearMap(\n                percentSpan, [0, 100], dataExtent, true\n            ) - dataExtent[0];\n        }\n\n        minMaxSpan[minMax + 'Span'] = percentSpan;\n        minMaxSpan[minMax + 'ValueSpan'] = valueSpan;\n    });\n}\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\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport * as modelUtil from '../../util/model';\nimport * as helper from './helper';\nimport AxisProxy from './AxisProxy';\n\nvar each = zrUtil.each;\nvar eachAxisDim = helper.eachAxisDim;\n\nvar DataZoomModel = echarts.extendComponentModel({\n\n    type: 'dataZoom',\n\n    dependencies: [\n        'xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series'\n    ],\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        zlevel: 0,\n        z: 4,                   // Higher than normal component (z: 2).\n        orient: null,           // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'.\n        xAxisIndex: null,       // Default the first horizontal category axis.\n        yAxisIndex: null,       // Default the first vertical category axis.\n\n        filterMode: 'filter',   // Possible values: 'filter' or 'empty' or 'weakFilter'.\n                                // 'filter': data items which are out of window will be removed. This option is\n                                //          applicable when filtering outliers. For each data item, it will be\n                                //          filtered if one of the relevant dimensions is out of the window.\n                                // 'weakFilter': data items which are out of window will be removed. This option\n                                //          is applicable when filtering outliers. For each data item, it will be\n                                //          filtered only if all  of the relevant dimensions are out of the same\n                                //          side of the window.\n                                // 'empty': data items which are out of window will be set to empty.\n                                //          This option is applicable when user should not neglect\n                                //          that there are some data items out of window.\n                                // 'none': Do not filter.\n                                // Taking line chart as an example, line will be broken in\n                                // the filtered points when filterModel is set to 'empty', but\n                                // be connected when set to 'filter'.\n\n        throttle: null,         // Dispatch action by the fixed rate, avoid frequency.\n                                // default 100. Do not throttle when use null/undefined.\n                                // If animation === true and animationDurationUpdate > 0,\n                                // default value is 100, otherwise 20.\n        start: 0,               // Start percent. 0 ~ 100\n        end: 100,               // End percent. 0 ~ 100\n        startValue: null,       // Start value. If startValue specified, start is ignored.\n        endValue: null,         // End value. If endValue specified, end is ignored.\n        minSpan: null,          // 0 ~ 100\n        maxSpan: null,          // 0 ~ 100\n        minValueSpan: null,     // The range of dataZoom can not be smaller than that.\n        maxValueSpan: null,     // The range of dataZoom can not be larger than that.\n        rangeMode: null         // Array, can be 'value' or 'percent'.\n    },\n\n    /**\n     * @override\n     */\n    init: function (option, parentModel, ecModel) {\n\n        /**\n         * key like x_0, y_1\n         * @private\n         * @type {Object}\n         */\n        this._dataIntervalByAxis = {};\n\n        /**\n         * @private\n         */\n        this._dataInfo = {};\n\n        /**\n         * key like x_0, y_1\n         * @private\n         */\n        this._axisProxies = {};\n\n        /**\n         * @readOnly\n         */\n        this.textStyleModel;\n\n        /**\n         * @private\n         */\n        this._autoThrottle = true;\n\n        /**\n         * 'percent' or 'value'\n         * @private\n         */\n        this._rangePropMode = ['percent', 'percent'];\n\n        var rawOption = retrieveRaw(option);\n\n        this.mergeDefaultAndTheme(option, ecModel);\n\n        this.doInit(rawOption);\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function (newOption) {\n        var rawOption = retrieveRaw(newOption);\n\n        //FIX #2591\n        zrUtil.merge(this.option, newOption, true);\n\n        this.doInit(rawOption);\n    },\n\n    /**\n     * @protected\n     */\n    doInit: function (rawOption) {\n        var thisOption = this.option;\n\n        // Disable realtime view update if canvas is not supported.\n        if (!env.canvasSupported) {\n            thisOption.realtime = false;\n        }\n\n        this._setDefaultThrottle(rawOption);\n\n        updateRangeUse(this, rawOption);\n\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]] = null;\n            }\n            // Otherwise do nothing and use the merge result.\n        }, this);\n\n        this.textStyleModel = this.getModel('textStyle');\n\n        this._resetTarget();\n\n        this._giveAxisProxies();\n    },\n\n    /**\n     * @private\n     */\n    _giveAxisProxies: function () {\n        var axisProxies = this._axisProxies;\n\n        this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) {\n            var axisModel = this.dependentModels[dimNames.axis][axisIndex];\n\n            // If exists, share axisProxy with other dataZoomModels.\n            var axisProxy = axisModel.__dzAxisProxy || (\n                // Use the first dataZoomModel as the main model of axisProxy.\n                axisModel.__dzAxisProxy = new AxisProxy(\n                    dimNames.name, axisIndex, this, ecModel\n                )\n            );\n            // FIXME\n            // dispose __dzAxisProxy\n\n            axisProxies[dimNames.name + '_' + axisIndex] = axisProxy;\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _resetTarget: function () {\n        var thisOption = this.option;\n\n        var autoMode = this._judgeAutoMode();\n\n        eachAxisDim(function (dimNames) {\n            var axisIndexName = dimNames.axisIndex;\n            thisOption[axisIndexName] = modelUtil.normalizeToArray(\n                thisOption[axisIndexName]\n            );\n        }, this);\n\n        if (autoMode === 'axisIndex') {\n            this._autoSetAxisIndex();\n        }\n        else if (autoMode === 'orient') {\n            this._autoSetOrient();\n        }\n    },\n\n    /**\n     * @private\n     */\n    _judgeAutoMode: function () {\n        // Auto set only works for setOption at the first time.\n        // The following is user's reponsibility. So using merged\n        // option is OK.\n        var thisOption = this.option;\n\n        var hasIndexSpecified = false;\n        eachAxisDim(function (dimNames) {\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 occured.\n            if (thisOption[dimNames.axisIndex] != null) {\n                hasIndexSpecified = true;\n            }\n        }, this);\n\n        var orient = thisOption.orient;\n\n        if (orient == null && hasIndexSpecified) {\n            return 'orient';\n        }\n        else if (!hasIndexSpecified) {\n            if (orient == null) {\n                thisOption.orient = 'horizontal';\n            }\n            return 'axisIndex';\n        }\n    },\n\n    /**\n     * @private\n     */\n    _autoSetAxisIndex: function () {\n        var autoAxisIndex = true;\n        var orient = this.get('orient', true);\n        var thisOption = this.option;\n        var dependentModels = this.dependentModels;\n\n        if (autoAxisIndex) {\n            // Find axis that parallel to dataZoom as default.\n            var dimName = orient === 'vertical' ? 'y' : 'x';\n\n            if (dependentModels[dimName + 'Axis'].length) {\n                thisOption[dimName + 'AxisIndex'] = [0];\n                autoAxisIndex = false;\n            }\n            else {\n                each(dependentModels.singleAxis, function (singleAxisModel) {\n                    if (autoAxisIndex && singleAxisModel.get('orient', true) === orient) {\n                        thisOption.singleAxisIndex = [singleAxisModel.componentIndex];\n                        autoAxisIndex = false;\n                    }\n                });\n            }\n        }\n\n        if (autoAxisIndex) {\n            // Find the first category axis as default. (consider polar)\n            eachAxisDim(function (dimNames) {\n                if (!autoAxisIndex) {\n                    return;\n                }\n                var axisIndices = [];\n                var axisModels = this.dependentModels[dimNames.axis];\n                if (axisModels.length && !axisIndices.length) {\n                    for (var i = 0, len = axisModels.length; i < len; i++) {\n                        if (axisModels[i].get('type') === 'category') {\n                            axisIndices.push(i);\n                        }\n                    }\n                }\n                thisOption[dimNames.axisIndex] = axisIndices;\n                if (axisIndices.length) {\n                    autoAxisIndex = false;\n                }\n            }, this);\n        }\n\n        if (autoAxisIndex) {\n            // FIXME\n            // 这里是兼容ec2的写法（没指定xAxisIndex和yAxisIndex时把scatter和双数值轴折柱纳入dataZoom控制），\n            // 但是实际是否需要Grid.js#getScaleByOption来判断（考虑time，log等axis type）？\n\n            // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified,\n            // dataZoom component auto adopts series that reference to\n            // both xAxis and yAxis which type is 'value'.\n            this.ecModel.eachSeries(function (seriesModel) {\n                if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) {\n                    eachAxisDim(function (dimNames) {\n                        var axisIndices = thisOption[dimNames.axisIndex];\n\n                        var axisIndex = seriesModel.get(dimNames.axisIndex);\n                        var axisId = seriesModel.get(dimNames.axisId);\n\n                        var axisModel = seriesModel.ecModel.queryComponents({\n                            mainType: dimNames.axis,\n                            index: axisIndex,\n                            id: axisId\n                        })[0];\n\n                        if (__DEV__) {\n                            if (!axisModel) {\n                                throw new Error(\n                                    dimNames.axis + ' \"' + zrUtil.retrieve(\n                                        axisIndex,\n                                        axisId,\n                                        0\n                                    ) + '\" not found'\n                                );\n                            }\n                        }\n                        axisIndex = axisModel.componentIndex;\n\n                        if (zrUtil.indexOf(axisIndices, axisIndex) < 0) {\n                            axisIndices.push(axisIndex);\n                        }\n                    });\n                }\n            }, this);\n        }\n    },\n\n    /**\n     * @private\n     */\n    _autoSetOrient: function () {\n        var dim;\n\n        // Find the first axis\n        this.eachTargetAxis(function (dimNames) {\n            !dim && (dim = dimNames.name);\n        }, this);\n\n        this.option.orient = dim === 'y' ? 'vertical' : 'horizontal';\n    },\n\n    /**\n     * @private\n     */\n    _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) {\n        // FIXME\n        // 需要series的xAxisIndex和yAxisIndex都首先自动设置上。\n        // 例如series.type === scatter时。\n\n        var is = true;\n        eachAxisDim(function (dimNames) {\n            var seriesAxisIndex = seriesModel.get(dimNames.axisIndex);\n            var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex];\n\n            if (!axisModel || axisModel.get('type') !== axisType) {\n                is = false;\n            }\n        }, this);\n        return is;\n    },\n\n    /**\n     * @private\n     */\n    _setDefaultThrottle: function (rawOption) {\n        // When first time user set throttle, auto throttle ends.\n        if (rawOption.hasOwnProperty('throttle')) {\n            this._autoThrottle = false;\n        }\n        if (this._autoThrottle) {\n            var globalOption = this.ecModel.option;\n            this.option.throttle\n                = (globalOption.animation && globalOption.animationDurationUpdate > 0)\n                ? 100 : 20;\n        }\n    },\n\n    /**\n     * @public\n     */\n    getFirstTargetAxisModel: function () {\n        var firstAxisModel;\n        eachAxisDim(function (dimNames) {\n            if (firstAxisModel == null) {\n                var indices = this.get(dimNames.axisIndex);\n                if (indices.length) {\n                    firstAxisModel = this.dependentModels[dimNames.axis][indices[0]];\n                }\n            }\n        }, this);\n\n        return firstAxisModel;\n    },\n\n    /**\n     * @public\n     * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel\n     */\n    eachTargetAxis: function (callback, context) {\n        var ecModel = this.ecModel;\n        eachAxisDim(function (dimNames) {\n            each(\n                this.get(dimNames.axisIndex),\n                function (axisIndex) {\n                    callback.call(context, dimNames, axisIndex, this, ecModel);\n                },\n                this\n            );\n        }, this);\n    },\n\n    /**\n     * @param {string} dimName\n     * @param {number} axisIndex\n     * @return {module:echarts/component/dataZoom/AxisProxy} If not found, return null/undefined.\n     */\n    getAxisProxy: function (dimName, axisIndex) {\n        return this._axisProxies[dimName + '_' + axisIndex];\n    },\n\n    /**\n     * @param {string} dimName\n     * @param {number} axisIndex\n     * @return {module:echarts/model/Model} If not found, return null/undefined.\n     */\n    getAxisModel: function (dimName, axisIndex) {\n        var axisProxy = this.getAxisProxy(dimName, axisIndex);\n        return axisProxy && axisProxy.getAxisModel();\n    },\n\n    /**\n     * If not specified, set to undefined.\n     *\n     * @public\n     * @param {Object} opt\n     * @param {number} [opt.start]\n     * @param {number} [opt.end]\n     * @param {number} [opt.startValue]\n     * @param {number} [opt.endValue]\n     * @param {boolean} [ignoreUpdateRangeUsg=false]\n     */\n    setRawRange: function (opt, ignoreUpdateRangeUsg) {\n        var option = this.option;\n        each([['start', 'startValue'], ['end', 'endValue']], function (names) {\n            // If only one of 'start' and 'startValue' is not null/undefined, the other\n            // should be cleared, which enable clear the option.\n            // If both of them are not set, keep option with the original value, which\n            // enable use only set start but not set end when calling `dispatchAction`.\n            // The same as 'end' and 'endValue'.\n            if (opt[names[0]] != null || opt[names[1]] != null) {\n                option[names[0]] = opt[names[0]];\n                option[names[1]] = opt[names[1]];\n            }\n        }, this);\n\n        !ignoreUpdateRangeUsg && updateRangeUse(this, opt);\n    },\n\n    /**\n     * @public\n     * @return {Array.<number>} [startPercent, endPercent]\n     */\n    getPercentRange: function () {\n        var axisProxy = this.findRepresentativeAxisProxy();\n        if (axisProxy) {\n            return axisProxy.getDataPercentWindow();\n        }\n    },\n\n    /**\n     * @public\n     * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);\n     *\n     * @param {string} [axisDimName]\n     * @param {number} [axisIndex]\n     * @return {Array.<number>} [startValue, endValue] value can only be '-' or finite number.\n     */\n    getValueRange: function (axisDimName, axisIndex) {\n        if (axisDimName == null && axisIndex == null) {\n            var axisProxy = this.findRepresentativeAxisProxy();\n            if (axisProxy) {\n                return axisProxy.getDataValueWindow();\n            }\n        }\n        else {\n            return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow();\n        }\n    },\n\n    /**\n     * @public\n     * @param {module:echarts/model/Model} [axisModel] If axisModel given, find axisProxy\n     *      corresponding to the axisModel\n     * @return {module:echarts/component/dataZoom/AxisProxy}\n     */\n    findRepresentativeAxisProxy: function (axisModel) {\n        if (axisModel) {\n            return axisModel.__dzAxisProxy;\n        }\n\n        // Find the first hosted axisProxy\n        var axisProxies = this._axisProxies;\n        for (var key in axisProxies) {\n            if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) {\n                return axisProxies[key];\n            }\n        }\n\n        // If no hosted axis find not hosted axisProxy.\n        // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis,\n        // and the option.start or option.end settings are different. The percentRange\n        // should follow axisProxy.\n        // (We encounter this problem in toolbox data zoom.)\n        for (var key in axisProxies) {\n            if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) {\n                return axisProxies[key];\n            }\n        }\n    },\n\n    /**\n     * @return {Array.<string>}\n     */\n    getRangePropMode: function () {\n        return this._rangePropMode.slice();\n    }\n\n});\n\nfunction retrieveRaw(option) {\n    var ret = {};\n    each(\n        ['start', 'end', 'startValue', 'endValue', 'throttle'],\n        function (name) {\n            option.hasOwnProperty(name) && (ret[name] = option[name]);\n        }\n    );\n    return ret;\n}\n\nfunction updateRangeUse(dataZoomModel, rawOption) {\n    var rangePropMode = dataZoomModel._rangePropMode;\n    var rangeModeInOption = dataZoomModel.get('rangeMode');\n\n    each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {\n        var percentSpecified = rawOption[names[0]] != null;\n        var valueSpecified = rawOption[names[1]] != null;\n        if (percentSpecified && !valueSpecified) {\n            rangePropMode[index] = 'percent';\n        }\n        else if (!percentSpecified && valueSpecified) {\n            rangePropMode[index] = 'value';\n        }\n        else if (rangeModeInOption) {\n            rangePropMode[index] = rangeModeInOption[index];\n        }\n        else if (percentSpecified) { // percentSpecified && valueSpecified\n            rangePropMode[index] = 'percent';\n        }\n        // else remain its original setting.\n    });\n}\n\nexport default DataZoomModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport ComponentView from '../../view/Component';\n\nexport default ComponentView.extend({\n\n    type: 'dataZoom',\n\n    render: function (dataZoomModel, ecModel, api, payload) {\n        this.dataZoomModel = dataZoomModel;\n        this.ecModel = ecModel;\n        this.api = api;\n    },\n\n    /**\n     * Find the first target coordinate system.\n     *\n     * @protected\n     * @return {Object} {\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    getTargetCoordInfo: function () {\n        var dataZoomModel = this.dataZoomModel;\n        var ecModel = this.ecModel;\n        var coordSysLists = {};\n\n        dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {\n            var axisModel = ecModel.getComponent(dimNames.axis, axisIndex);\n            if (axisModel) {\n                var coordModel = axisModel.getCoordSysModel();\n                coordModel && save(\n                    coordModel,\n                    axisModel,\n                    coordSysLists[coordModel.mainType] || (coordSysLists[coordModel.mainType] = []),\n                    coordModel.componentIndex\n                );\n            }\n        }, this);\n\n        function save(coordModel, axisModel, store, coordIndex) {\n            var item;\n            for (var i = 0; i < store.length; i++) {\n                if (store[i].model === coordModel) {\n                    item = store[i];\n                    break;\n                }\n            }\n            if (!item) {\n                store.push(item = {\n                    model: coordModel, axisModels: [], coordIndex: coordIndex\n                });\n            }\n            item.axisModels.push(axisModel);\n        }\n\n        return coordSysLists;\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\nimport DataZoomModel from './DataZoomModel';\n\nexport default DataZoomModel.extend({\n    type: 'dataZoom.select'\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport DataZoomView from './DataZoomView';\n\nexport default DataZoomView.extend({\n    type: 'dataZoom.select'\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport {createHashMap, each} from 'zrender/src/core/util';\n\necharts.registerProcessor({\n\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        var seriesModelMap = createHashMap();\n\n        ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n            dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) {\n                var axisProxy = dataZoomModel.getAxisProxy(dimNames.name, axisIndex);\n                each(axisProxy.getTargetSeriesModels(), function (seriesModel) {\n                    seriesModelMap.set(seriesModel.uid, seriesModel);\n                });\n            });\n        });\n\n        return seriesModelMap;\n    },\n\n    modifyOutputEnd: true,\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\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 (dimNames, axisIndex, dataZoomModel) {\n                dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel, api);\n            });\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 (dimNames, axisIndex, dataZoomModel) {\n                dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel, api);\n            });\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            var percentRange = axisProxy.getDataPercentWindow();\n            var valueRange = axisProxy.getDataValueWindow();\n\n            dataZoomModel.setRawRange({\n                start: percentRange[0],\n                end: percentRange[1],\n                startValue: valueRange[0],\n                endValue: valueRange[1]\n            }, 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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as helper from './helper';\n\n\necharts.registerAction('dataZoom', function (payload, ecModel) {\n\n    var linkedNodesFinder = helper.createLinkedNodesFinder(\n        zrUtil.bind(ecModel.eachComponent, ecModel, 'dataZoom'),\n        helper.eachAxisDim,\n        function (model, dimNames) {\n            return model.get(dimNames.axisIndex);\n        }\n    );\n\n    var effectedModels = [];\n\n    ecModel.eachComponent(\n        {mainType: 'dataZoom', query: payload},\n        function (model, index) {\n            effectedModels.push.apply(\n                effectedModels, linkedNodesFinder(model).nodes\n            );\n        }\n    );\n\n    zrUtil.each(effectedModels, function (dataZoomModel, index) {\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 * Only work for toolbox dataZoom. User\n * MUST NOT import this module directly.\n */\n\nimport './dataZoom/typeDefaulter';\n\nimport './dataZoom/DataZoomModel';\nimport './dataZoom/DataZoomView';\n\nimport './dataZoom/SelectZoomModel';\nimport './dataZoom/SelectZoomView';\n\nimport './dataZoom/dataZoomProcessor';\nimport './dataZoom/dataZoomAction';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport BrushController from '../../helper/BrushController';\nimport BrushTargetManager from '../../helper/BrushTargetManager';\nimport * as history from '../../dataZoom/history';\nimport sliderMove from '../../helper/sliderMove';\nimport lang from '../../../lang';\nimport * as featureManager from '../featureManager';\n\n// Use dataZoomSelect\nimport '../../dataZoomSelect';\n\nvar dataZoomLang = lang.toolbox.dataZoom;\nvar each = zrUtil.each;\n\n// Spectial component id start with \\0ec\\0, see echarts/model/Global.js~hasInnerId\nvar DATA_ZOOM_ID_BASE = '\\0_ec_\\0toolbox-dataZoom_';\n\nfunction DataZoom(model, ecModel, api) {\n\n    /**\n     * @private\n     * @type {module:echarts/component/helper/BrushController}\n     */\n    (this._brushController = new BrushController(api.getZr()))\n        .on('brush', zrUtil.bind(this._onBrush, this))\n        .mount();\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._isZoomActive;\n}\n\nDataZoom.defaultOption = {\n    show: true,\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: zrUtil.clone(dataZoomLang.title)\n};\n\nvar proto = DataZoom.prototype;\n\nproto.render = function (featureModel, ecModel, api, payload) {\n    this.model = featureModel;\n    this.ecModel = ecModel;\n    this.api = api;\n\n    updateZoomBtnStatus(featureModel, ecModel, this, payload, api);\n    updateBackBtnStatus(featureModel, ecModel);\n};\n\nproto.onclick = function (ecModel, api, type) {\n    handlers[type].call(this);\n};\n\nproto.remove = function (ecModel, api) {\n    this._brushController.unmount();\n};\n\nproto.dispose = function (ecModel, api) {\n    this._brushController.dispose();\n};\n\n/**\n * @private\n */\nvar handlers = {\n\n    zoom: function () {\n        var nextActive = !this._isZoomActive;\n\n        this.api.dispatchAction({\n            type: 'takeGlobalCursor',\n            key: 'dataZoomSelect',\n            dataZoomSelectActive: nextActive\n        });\n    },\n\n    back: function () {\n        this._dispatchZoomAction(history.pop(this.ecModel));\n    }\n};\n\n/**\n * @private\n */\nproto._onBrush = function (areas, opt) {\n    if (!opt.isEnd || !areas.length) {\n        return;\n    }\n    var snapshot = {};\n    var ecModel = this.ecModel;\n\n    this._brushController.updateCovers([]); // remove cover\n\n    var brushTargetManager = new BrushTargetManager(\n        retrieveAxisSetting(this.model.option), ecModel, {include: ['grid']}\n    );\n    brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {\n        if (coordSys.type !== 'cartesian2d') {\n            return;\n        }\n\n        var brushType = area.brushType;\n        if (brushType === 'rect') {\n            setBatch('x', coordSys, coordRange[0]);\n            setBatch('y', coordSys, coordRange[1]);\n        }\n        else {\n            setBatch(({lineX: 'x', lineY: 'y'})[brushType], coordSys, coordRange);\n        }\n    });\n\n    history.push(ecModel, snapshot);\n\n    this._dispatchZoomAction(snapshot);\n\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\n        // Restrict range.\n        var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();\n        if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {\n            minMax = sliderMove(\n                0, minMax.slice(), axis.scale.getExtent(), 0,\n                minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan\n            );\n        }\n\n        dataZoomModel && (snapshot[dataZoomModel.id] = {\n            dataZoomId: dataZoomModel.id,\n            startValue: minMax[0],\n            endValue: minMax[1]\n        });\n    }\n\n    function findDataZoom(dimName, axisModel, ecModel) {\n        var found;\n        ecModel.eachComponent({mainType: 'dataZoom', subType: 'select'}, function (dzModel) {\n            var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);\n            has && (found = dzModel);\n        });\n        return found;\n    }\n};\n\n/**\n * @private\n */\nproto._dispatchZoomAction = function (snapshot) {\n    var batch = [];\n\n    // Convert from hash map to array.\n    each(snapshot, function (batchItem, dataZoomId) {\n        batch.push(zrUtil.clone(batchItem));\n    });\n\n    batch.length && this.api.dispatchAction({\n        type: 'dataZoom',\n        from: this.uid,\n        batch: batch\n    });\n};\n\nfunction retrieveAxisSetting(option) {\n    var setting = {};\n    // Compatible with previous setting: null => all axis, false => no axis.\n    zrUtil.each(['xAxisIndex', 'yAxisIndex'], function (name) {\n        setting[name] = option[name];\n        setting[name] == null && (setting[name] = 'all');\n        (setting[name] === false || setting[name] === 'none') && (setting[name] = []);\n    });\n    return setting;\n}\n\nfunction updateBackBtnStatus(featureModel, ecModel) {\n    featureModel.setIconStatus(\n        'back',\n        history.count(ecModel) > 1 ? 'emphasis' : 'normal'\n    );\n}\n\nfunction updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {\n    var zoomActive = view._isZoomActive;\n\n    if (payload && payload.type === 'takeGlobalCursor') {\n        zoomActive = payload.key === 'dataZoomSelect'\n            ? payload.dataZoomSelectActive : false;\n    }\n\n    view._isZoomActive = zoomActive;\n\n    featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');\n\n    var brushTargetManager = new BrushTargetManager(\n        retrieveAxisSetting(featureModel.option), ecModel, {include: ['grid']}\n    );\n\n    view._brushController\n        .setPanels(brushTargetManager.makePanelOpts(api, function (targetInfo) {\n            return (targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared)\n                ? 'lineX'\n                : (!targetInfo.xAxisDeclared && targetInfo.yAxisDeclared)\n                ? 'lineY'\n                : 'rect';\n        }))\n        .enableBrush(\n            zoomActive\n            ? {\n                brushType: 'auto',\n                brushStyle: {\n                    // FIXME user customized?\n                    lineWidth: 0,\n                    fill: 'rgba(0,0,0,0.2)'\n                }\n            }\n            : false\n        );\n}\n\n\nfeatureManager.register('dataZoom', DataZoom);\n\n\n// Create special dataZoom option for select\n// FIXME consider the case of merge option, where axes options are not exists.\necharts.registerPreprocessor(function (option) {\n    if (!option) {\n        return;\n    }\n\n    var dataZoomOpts = option.dataZoom || (option.dataZoom = []);\n    if (!zrUtil.isArray(dataZoomOpts)) {\n        option.dataZoom = dataZoomOpts = [dataZoomOpts];\n    }\n\n    var toolboxOpt = option.toolbox;\n    if (toolboxOpt) {\n        // Assume there is only one toolbox\n        if (zrUtil.isArray(toolboxOpt)) {\n            toolboxOpt = toolboxOpt[0];\n        }\n\n        if (toolboxOpt && toolboxOpt.feature) {\n            var dataZoomOpt = toolboxOpt.feature.dataZoom;\n            // FIXME: If add dataZoom when setOption in merge mode,\n            // no axis info to be added. See `test/dataZoom-extreme.html`\n            addForAxis('xAxis', dataZoomOpt);\n            addForAxis('yAxis', dataZoomOpt);\n        }\n    }\n\n    function addForAxis(axisName, dataZoomOpt) {\n        if (!dataZoomOpt) {\n            return;\n        }\n\n        // Try not to modify model, because it is not merged yet.\n        var axisIndicesName = axisName + 'Index';\n        var givenAxisIndices = dataZoomOpt[axisIndicesName];\n        if (givenAxisIndices != null\n            && givenAxisIndices !== 'all'\n            && !zrUtil.isArray(givenAxisIndices)\n        ) {\n            givenAxisIndices = (givenAxisIndices === false || givenAxisIndices === 'none') ? [] : [givenAxisIndices];\n        }\n\n        forEachComponent(axisName, function (axisOpt, axisIndex) {\n            if (givenAxisIndices != null\n                && givenAxisIndices !== 'all'\n                && zrUtil.indexOf(givenAxisIndices, axisIndex) === -1\n            ) {\n                return;\n            }\n            var newOpt = {\n                type: 'select',\n                $fromToolbox: true,\n                // Id for merge mapping.\n                id: DATA_ZOOM_ID_BASE + axisName + axisIndex\n            };\n            // FIXME\n            // Only support one axis now.\n            newOpt[axisIndicesName] = axisIndex;\n            dataZoomOpts.push(newOpt);\n        });\n    }\n\n    function forEachComponent(mainType, cb) {\n        var opts = option[mainType];\n        if (!zrUtil.isArray(opts)) {\n            opts = opts ? [opts] : [];\n        }\n        each(opts, cb);\n    }\n});\n\nexport default DataZoom;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../../echarts';\nimport * as history from '../../dataZoom/history';\nimport lang from '../../../lang';\nimport * as featureManager from '../featureManager';\n\nvar restoreLang = lang.toolbox.restore;\n\nfunction Restore(model) {\n    this.model = model;\n}\n\nRestore.defaultOption = {\n    show: true,\n    /* eslint-disable */\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    /* eslint-enable */\n    title: restoreLang.title\n};\n\nvar proto = Restore.prototype;\n\nproto.onclick = function (ecModel, api, type) {\n    history.clear(ecModel);\n\n    api.dispatchAction({\n        type: 'restore',\n        from: this.uid\n    });\n};\n\nfeatureManager.register('restore', Restore);\n\necharts.registerAction(\n    {type: 'restore', event: 'restore', update: 'prepareAndUpdate'},\n    function (payload, ecModel) {\n        ecModel.resetOption('recreate');\n    }\n);\n\nexport default Restore;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport './toolbox/ToolboxModel';\nimport './toolbox/ToolboxView';\nimport './toolbox/feature/SaveAsImage';\nimport './toolbox/feature/MagicType';\nimport './toolbox/feature/DataView';\nimport './toolbox/feature/DataZoom';\nimport './toolbox/feature/Restore';","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\n\nexport default echarts.extendComponentModel({\n\n    type: 'tooltip',\n\n    dependencies: ['axisPointer'],\n\n    defaultOption: {\n        zlevel: 0,\n\n        z: 60,\n\n        show: true,\n\n        // tooltip主体内容\n        showContent: true,\n\n        // 'trigger' only works on coordinate system.\n        // 'item' | 'axis' | 'none'\n        trigger: 'item',\n\n        // 'click' | 'mousemove' | 'none'\n        triggerOn: 'mousemove|click',\n\n        alwaysShowContent: false,\n\n        displayMode: 'single', // 'single' | 'multipleByCoordSys'\n\n        renderMode: 'auto', // 'auto' | 'html' | 'richText'\n        // 'auto': use html by default, and use non-html if `document` is not defined\n        // 'html': use html for tooltip\n        // 'richText': use canvas, svg, and etc. for tooltip\n\n        // 位置 {Array} | {Function}\n        // position: null\n        // Consider triggered from axisPointer handle, verticalAlign should be 'middle'\n        // align: null,\n        // verticalAlign: null,\n\n        // 是否约束 content 在 viewRect 中。默认 false 是为了兼容以前版本。\n        confine: false,\n\n        // 内容格式器：{string}（Template） ¦ {Function}\n        // formatter: null\n\n        showDelay: 0,\n\n        // 隐藏延迟，单位ms\n        hideDelay: 100,\n\n        // 动画变换时间，单位s\n        transitionDuration: 0.4,\n\n        enterable: false,\n\n        // 提示背景颜色，默认为透明度为0.7的黑色\n        backgroundColor: 'rgba(50,50,50,0.7)',\n\n        // 提示边框颜色\n        borderColor: '#333',\n\n        // 提示边框圆角，单位px，默认为4\n        borderRadius: 4,\n\n        // 提示边框线宽，单位px，默认为0（无边框）\n        borderWidth: 0,\n\n        // 提示内边距，单位px，默认各方向内边距为5，\n        // 接受数组分别设定上右下左边距，同css\n        padding: 5,\n\n        // Extra css text\n        extraCssText: '',\n\n        // 坐标轴指示器，坐标轴触发有效\n        axisPointer: {\n            // 默认为直线\n            // 可选为：'line' | 'shadow' | 'cross'\n            type: 'line',\n\n            // type 为 line 的时候有效，指定 tooltip line 所在的轴，可选\n            // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto'\n            // 默认 'auto'，会选择类型为 category 的轴，对于双数值轴，笛卡尔坐标系会默认选择 x 轴\n            // 极坐标系会默认选择 angle 轴\n            axis: 'auto',\n\n            animation: 'auto',\n            animationDurationUpdate: 200,\n            animationEasingUpdate: 'exponentialOut',\n\n            crossStyle: {\n                color: '#999',\n                width: 1,\n                type: 'dashed',\n\n                // TODO formatter\n                textStyle: {}\n            }\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: '#fff',\n            fontSize: 14\n        }\n    }\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as zrColor from 'zrender/src/tool/color';\nimport * as eventUtil from 'zrender/src/core/event';\nimport env from 'zrender/src/core/env';\nimport * as formatUtil from '../../util/format';\n\nvar each = zrUtil.each;\nvar toCamelCase = formatUtil.toCamelCase;\n\nvar vendors = ['', '-webkit-', '-moz-', '-o-'];\n\nvar gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;';\n\n/**\n * @param {number} duration\n * @return {string}\n * @inner\n */\nfunction assembleTransition(duration) {\n    var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)';\n    var transitionText = 'left ' + duration + 's ' + transitionCurve + ','\n                        + 'top ' + duration + 's ' + transitionCurve;\n    return zrUtil.map(vendors, function (vendorPrefix) {\n        return vendorPrefix + 'transition:' + transitionText;\n    }).join(';');\n}\n\n/**\n * @param {Object} textStyle\n * @return {string}\n * @inner\n */\nfunction assembleFont(textStyleModel) {\n    var cssText = [];\n\n    var fontSize = textStyleModel.get('fontSize');\n    var color = textStyleModel.getTextColor();\n\n    color && cssText.push('color:' + color);\n\n    cssText.push('font:' + textStyleModel.getFont());\n\n    fontSize\n        && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px');\n\n    each(['decoration', 'align'], function (name) {\n        var val = textStyleModel.get(name);\n        val && cssText.push('text-' + name + ':' + val);\n    });\n\n    return cssText.join(';');\n}\n\n/**\n * @param {Object} tooltipModel\n * @return {string}\n * @inner\n */\nfunction assembleCssText(tooltipModel) {\n\n    var cssText = [];\n\n    var transitionDuration = tooltipModel.get('transitionDuration');\n    var backgroundColor = tooltipModel.get('backgroundColor');\n    var textStyleModel = tooltipModel.getModel('textStyle');\n    var padding = tooltipModel.get('padding');\n\n    // Animation transition. Do not animate when transitionDuration is 0.\n    transitionDuration\n        && cssText.push(assembleTransition(transitionDuration));\n\n    if (backgroundColor) {\n        if (env.canvasSupported) {\n            cssText.push('background-Color:' + backgroundColor);\n        }\n        else {\n            // for ie\n            cssText.push(\n                'background-Color:#' + zrColor.toHex(backgroundColor)\n            );\n            cssText.push('filter:alpha(opacity=70)');\n        }\n    }\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\n            && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));\n    });\n\n    // Text style\n    cssText.push(assembleFont(textStyleModel));\n\n    // Padding\n    if (padding != null) {\n        cssText.push('padding:' + formatUtil.normalizeCssArray(padding).join('px ') + 'px');\n    }\n\n    return cssText.join(';') + ';';\n}\n\n/**\n * @alias module:echarts/component/tooltip/TooltipContent\n * @constructor\n */\nfunction TooltipContent(container, api) {\n    if (env.wxa) {\n        return null;\n    }\n\n    var el = document.createElement('div');\n    var zr = this._zr = api.getZr();\n\n    this.el = el;\n\n    this._x = api.getWidth() / 2;\n    this._y = api.getHeight() / 2;\n\n    container.appendChild(el);\n\n    this._container = container;\n\n    this._show = false;\n\n    /**\n     * @private\n     */\n    this._hideTimeout;\n\n    // FIXME\n    // Is it needed to trigger zr event manually if\n    // the browser do not support `pointer-events: none`.\n\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            eventUtil.normalizeEvent(container, e, true);\n            handler.dispatch('mousemove', e);\n        }\n    };\n    el.onmouseleave = function () {\n        if (self._enterable) {\n            if (self._show) {\n                self.hideLater(self._hideDelay);\n            }\n        }\n        self._inContent = false;\n    };\n}\n\nTooltipContent.prototype = {\n\n    constructor: TooltipContent,\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    _enterable: true,\n\n    /**\n     * Update when tooltip is rendered\n     */\n    update: function () {\n        // FIXME\n        // Move this logic to ec main?\n        var container = this._container;\n        var stl = container.currentStyle\n            || document.defaultView.getComputedStyle(container);\n        var domStyle = container.style;\n        if (domStyle.position !== 'absolute' && stl.position !== 'absolute') {\n            domStyle.position = 'relative';\n        }\n        // Hide the tooltip\n        // PENDING\n        // this.hide();\n    },\n\n    show: function (tooltipModel) {\n        clearTimeout(this._hideTimeout);\n        var el = this.el;\n\n        el.style.cssText = gCssText + assembleCssText(tooltipModel)\n            // Because of the reason described in:\n            // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore\n            // we should set initial value to `left` and `top`.\n            + ';left:' + this._x + 'px;top:' + this._y + 'px;'\n            + (tooltipModel.get('extraCssText') || '');\n\n        el.style.display = el.innerHTML ? 'block' : 'none';\n\n        // If mouse occsionally move over the tooltip, a mouseout event will be\n        // triggered by canvas, and cuase some unexpectable result like dragging\n        // stop, \"unfocusAdjacency\". Here `pointer-events: none` is used to solve\n        // it. Although it is not suppored by IE8~IE10, fortunately it is a rare\n        // scenario.\n        el.style.pointerEvents = this._enterable ? 'auto' : 'none';\n\n        this._show = true;\n    },\n\n    setContent: function (content) {\n        this.el.innerHTML = content == null ? '' : content;\n    },\n\n    setEnterable: function (enterable) {\n        this._enterable = enterable;\n    },\n\n    getSize: function () {\n        var el = this.el;\n        return [el.clientWidth, el.clientHeight];\n    },\n\n    moveTo: function (x, y) {\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 zr = this._zr;\n        var viewportRootOffset;\n        if (zr && zr.painter && (viewportRootOffset = zr.painter.getViewportRootOffset())) {\n            x += viewportRootOffset.offsetLeft;\n            y += viewportRootOffset.offsetTop;\n        }\n\n        var style = this.el.style;\n        style.left = x + 'px';\n        style.top = y + 'px';\n\n        this._x = x;\n        this._y = y;\n    },\n\n    hide: function () {\n        this.el.style.display = 'none';\n        this._show = false;\n    },\n\n    hideLater: function (time) {\n        if (this._show && !(this._inContent && this._enterable)) {\n            if (time) {\n                this._hideDelay = time;\n                // Set show false to avoid invoke hideLater mutiple times\n                this._show = false;\n                this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time);\n            }\n            else {\n                this.hide();\n            }\n        }\n    },\n\n    isShow: function () {\n        return this._show;\n    },\n\n    getOuterSize: function () {\n        var width = this.el.clientWidth;\n        var height = this.el.clientHeight;\n\n        // Consider browser compatibility.\n        // IE8 does not support getComputedStyle.\n        if (document.defaultView && document.defaultView.getComputedStyle) {\n            var stl = document.defaultView.getComputedStyle(this.el);\n            if (stl) {\n                width += parseInt(stl.borderLeftWidth, 10) + parseInt(stl.borderRightWidth, 10);\n                height += parseInt(stl.borderTopWidth, 10) + parseInt(stl.borderBottomWidth, 10);\n            }\n        }\n\n        return {width: width, height: height};\n    }\n};\n\nexport default TooltipContent;\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n// import Group from 'zrender/src/container/Group';\nimport Text from 'zrender/src/graphic/Text';\n\n/**\n * @alias module:echarts/component/tooltip/TooltipRichContent\n * @constructor\n */\nfunction TooltipRichContent(api) {\n\n    this._zr = api.getZr();\n\n    this._show = false;\n\n    /**\n     * @private\n     */\n    this._hideTimeout;\n}\n\nTooltipRichContent.prototype = {\n\n    constructor: TooltipRichContent,\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    _enterable: true,\n\n    /**\n     * Update when tooltip is rendered\n     */\n    update: function () {\n        // noop\n    },\n\n    show: function (tooltipModel) {\n        if (this._hideTimeout) {\n            clearTimeout(this._hideTimeout);\n        }\n\n        this.el.attr('show', true);\n        this._show = true;\n    },\n\n    /**\n     * Set tooltip content\n     *\n     * @param {string} content rich text string of content\n     * @param {Object} markerRich rich text style\n     * @param {Object} tooltipModel tooltip model\n     */\n    setContent: function (content, markerRich, tooltipModel) {\n        if (this.el) {\n            this._zr.remove(this.el);\n        }\n\n        var markers = {};\n        var text = content;\n        var prefix = '{marker';\n        var suffix = '|}';\n        var startId = text.indexOf(prefix);\n        while (startId >= 0) {\n            var endId = text.indexOf(suffix);\n            var name = text.substr(startId + prefix.length, endId - startId - prefix.length);\n            if (name.indexOf('sub') > -1) {\n                markers['marker' + name] = {\n                    textWidth: 4,\n                    textHeight: 4,\n                    textBorderRadius: 2,\n                    textBackgroundColor: markerRich[name],\n                    // TODO: textOffset is not implemented for rich text\n                    textOffset: [3, 0]\n                };\n            }\n            else {\n                markers['marker' + name] = {\n                    textWidth: 10,\n                    textHeight: 10,\n                    textBorderRadius: 5,\n                    textBackgroundColor: markerRich[name]\n                };\n            }\n\n            text = text.substr(endId + 1);\n            startId = text.indexOf('{marker');\n        }\n\n        this.el = new Text({\n            style: {\n                rich: markers,\n                text: content,\n                textLineHeight: 20,\n                textBackgroundColor: tooltipModel.get('backgroundColor'),\n                textBorderRadius: tooltipModel.get('borderRadius'),\n                textFill: tooltipModel.get('textStyle.color'),\n                textPadding: tooltipModel.get('padding')\n            },\n            z: tooltipModel.get('z')\n        });\n        this._zr.add(this.el);\n\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\n    setEnterable: function (enterable) {\n        this._enterable = enterable;\n    },\n\n    getSize: function () {\n        var bounding = this.el.getBoundingRect();\n        return [bounding.width, bounding.height];\n    },\n\n    moveTo: function (x, y) {\n        if (this.el) {\n            this.el.attr('position', [x, y]);\n        }\n    },\n\n    hide: function () {\n        if (this.el) {\n            this.el.hide();\n        }\n        this._show = false;\n    },\n\n    hideLater: function (time) {\n        if (this._show && !(this._inContent && this._enterable)) {\n            if (time) {\n                this._hideDelay = time;\n                // Set show false to avoid invoke hideLater mutiple times\n                this._show = false;\n                this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time);\n            }\n            else {\n                this.hide();\n            }\n        }\n    },\n\n    isShow: function () {\n        return this._show;\n    },\n\n    getOuterSize: function () {\n        var size = this.getSize();\n        return {\n            width: size[0],\n            height: size[1]\n        };\n    }\n};\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport TooltipContent from './TooltipContent';\nimport TooltipRichContent from './TooltipRichContent';\nimport * as formatUtil from '../../util/format';\nimport * as numberUtil from '../../util/number';\nimport * as graphic from '../../util/graphic';\nimport findPointFromSeries from '../axisPointer/findPointFromSeries';\nimport * as layoutUtil from '../../util/layout';\nimport Model from '../../model/Model';\nimport * as globalListener from '../axisPointer/globalListener';\nimport * as axisHelper from '../../coord/axisHelper';\nimport * as axisPointerViewHelper from '../axisPointer/viewHelper';\nimport { getTooltipRenderMode } from '../../util/model';\n\nvar bind = zrUtil.bind;\nvar each = zrUtil.each;\nvar parsePercent = numberUtil.parsePercent;\n\nvar proxyRect = new graphic.Rect({\n    shape: {x: -1, y: -1, width: 2, height: 2}\n});\n\nexport default echarts.extendComponentView({\n\n    type: 'tooltip',\n\n    init: function (ecModel, api) {\n        if (env.node) {\n            return;\n        }\n\n        var tooltipModel = ecModel.getComponent('tooltip');\n        var renderMode = tooltipModel.get('renderMode');\n        this._renderMode = getTooltipRenderMode(renderMode);\n\n        var tooltipContent;\n        if (this._renderMode === 'html') {\n            tooltipContent = new TooltipContent(api.getDom(), api);\n            this._newLine = '<br/>';\n        }\n        else {\n            tooltipContent = new TooltipRichContent(api);\n            this._newLine = '\\n';\n        }\n\n        this._tooltipContent = tooltipContent;\n    },\n\n    render: function (tooltipModel, ecModel, api) {\n        if (env.node) {\n            return;\n        }\n\n        // Reset\n        this.group.removeAll();\n\n        /**\n         * @private\n         * @type {module:echarts/component/tooltip/TooltipModel}\n         */\n        this._tooltipModel = tooltipModel;\n\n        /**\n         * @private\n         * @type {module:echarts/model/Global}\n         */\n        this._ecModel = ecModel;\n\n        /**\n         * @private\n         * @type {module:echarts/ExtensionAPI}\n         */\n        this._api = api;\n\n        /**\n         * Should be cleaned when render.\n         * @private\n         * @type {Array.<Array.<Object>>}\n         */\n        this._lastDataByCoordSys = null;\n\n        /**\n         * @private\n         * @type {boolean}\n         */\n        this._alwaysShowContent = tooltipModel.get('alwaysShowContent');\n\n        var tooltipContent = this._tooltipContent;\n        tooltipContent.update();\n        tooltipContent.setEnterable(tooltipModel.get('enterable'));\n\n        this._initGlobalListener();\n\n        this._keepShow();\n    },\n\n    _initGlobalListener: function () {\n        var tooltipModel = this._tooltipModel;\n        var triggerOn = tooltipModel.get('triggerOn');\n\n        globalListener.register(\n            'itemTooltip',\n            this._api,\n            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                    }\n                    else if (currTrigger === 'leave') {\n                        this._hide(dispatchAction);\n                    }\n                }\n            }, this)\n        );\n    },\n\n    _keepShow: function () {\n        var tooltipModel = this._tooltipModel;\n        var ecModel = this._ecModel;\n        var api = this._api;\n\n        // Try to keep the tooltip show when refreshing\n        if (this._lastX != null\n            && 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            && tooltipModel.get('triggerOn') !== 'none'\n        ) {\n            var self = 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.manuallyShowTip(tooltipModel, ecModel, api, {\n                    x: self._lastX,\n                    y: self._lastY\n                });\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    manuallyShowTip: function (tooltipModel, ecModel, api, payload) {\n        if (payload.from === this.uid || env.node) {\n            return;\n        }\n\n        var dispatchAction = makeDispatchAction(payload, api);\n\n        // Reset ticket\n        this._ticket = '';\n\n        // When triggered from axisPointer.\n        var dataByCoordSys = payload.dataByCoordSys;\n\n        if (payload.tooltip && payload.x != null && payload.y != null) {\n            var el = proxyRect;\n            el.position = [payload.x, payload.y];\n            el.update();\n            el.tooltip = payload.tooltip;\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        }\n        else if (dataByCoordSys) {\n            this._tryShow({\n                offsetX: payload.x,\n                offsetY: payload.y,\n                position: payload.position,\n                event: {},\n                dataByCoordSys: payload.dataByCoordSys,\n                tooltipOption: payload.tooltipOption\n            }, dispatchAction);\n        }\n        else if (payload.seriesIndex != null) {\n\n            if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) {\n                return;\n            }\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                    position: payload.position,\n                    target: pointInfo.el,\n                    event: {}\n                }, dispatchAction);\n            }\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\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                event: {}\n            }, dispatchAction);\n        }\n    },\n\n    manuallyHideTip: function (tooltipModel, ecModel, api, payload) {\n        var tooltipContent = this._tooltipContent;\n\n        if (!this._alwaysShowContent && this._tooltipModel) {\n            tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));\n        }\n\n        this._lastX = this._lastY = null;\n\n        if (payload.from !== this.uid) {\n            this._hide(makeDispatchAction(payload, api));\n        }\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    _manuallyAxisShowTip: function (tooltipModel, ecModel, api, payload) {\n        var seriesIndex = payload.seriesIndex;\n        var dataIndex = payload.dataIndex;\n        var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n\n        if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) {\n            return;\n        }\n\n        var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n        if (!seriesModel) {\n            return;\n        }\n\n        var data = seriesModel.getData();\n        var tooltipModel = buildTooltipModel([\n            data.getItemModel(dataIndex),\n            seriesModel,\n            (seriesModel.coordinateSystem || {}).model,\n            tooltipModel\n        ]);\n\n        if (tooltipModel.get('trigger') !== 'axis') {\n            return;\n        }\n\n        api.dispatchAction({\n            type: 'updateAxisPointer',\n            seriesIndex: seriesIndex,\n            dataIndex: dataIndex,\n            position: payload.position\n        });\n\n        return true;\n    },\n\n    _tryShow: function (e, dispatchAction) {\n        var el = e.target;\n        var tooltipModel = this._tooltipModel;\n\n        if (!tooltipModel) {\n            return;\n        }\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\n        var dataByCoordSys = e.dataByCoordSys;\n        if (dataByCoordSys && dataByCoordSys.length) {\n            this._showAxisTooltip(dataByCoordSys, e);\n        }\n        // Always show item tooltip if mouse is on the element with dataIndex\n        else if (el && el.dataIndex != null) {\n            this._lastDataByCoordSys = null;\n            this._showSeriesItemTooltip(e, el, dispatchAction);\n        }\n        // Tooltip provided directly. Like legend.\n        else if (el && el.tooltip) {\n            this._lastDataByCoordSys = null;\n            this._showComponentItemTooltip(e, el, dispatchAction);\n        }\n        else {\n            this._lastDataByCoordSys = null;\n            this._hide(dispatchAction);\n        }\n    },\n\n    _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 easyer to enter the content\n        // but tooltip do not move immediately.\n        var delay = tooltipModel.get('showDelay');\n        cb = zrUtil.bind(cb, this);\n        clearTimeout(this._showTimout);\n        delay > 0\n            ? (this._showTimout = setTimeout(cb, delay))\n            : cb();\n    },\n\n    _showAxisTooltip: function (dataByCoordSys, e) {\n        var ecModel = this._ecModel;\n        var globalTooltipModel = this._tooltipModel;\n        var point = [e.offsetX, e.offsetY];\n        var singleDefaultHTML = [];\n        var singleParamsList = [];\n        var singleTooltipModel = buildTooltipModel([\n            e.tooltipOption,\n            globalTooltipModel\n        ]);\n\n        var renderMode = this._renderMode;\n        var newLine = this._newLine;\n\n        var markers = {};\n\n        each(dataByCoordSys, function (itemCoordSys) {\n            // var coordParamList = [];\n            // var coordDefaultHTML = [];\n            // var coordTooltipModel = buildTooltipModel([\n            //     e.tooltipOption,\n            //     itemCoordSys.tooltipOption,\n            //     ecModel.getComponent(itemCoordSys.coordSysMainType, itemCoordSys.coordSysIndex),\n            //     globalTooltipModel\n            // ]);\n            // var displayMode = coordTooltipModel.get('displayMode');\n            // var paramsList = displayMode === 'single' ? singleParamsList : [];\n\n            each(itemCoordSys.dataByAxis, function (item) {\n                var axisModel = ecModel.getComponent(item.axisDim + 'Axis', item.axisIndex);\n                var axisValue = item.value;\n                var seriesDefaultHTML = [];\n\n                if (!axisModel || axisValue == null) {\n                    return;\n                }\n\n                var valueLabel = axisPointerViewHelper.getValueLabel(\n                    axisValue, axisModel.axis, ecModel,\n                    item.seriesDataIndices,\n                    item.valueLabelOpt\n                );\n\n                zrUtil.each(item.seriesDataIndices, function (idxItem) {\n                    var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);\n                    var dataIndex = idxItem.dataIndexInside;\n                    var dataParams = series && series.getDataParams(dataIndex);\n                    dataParams.axisDim = item.axisDim;\n                    dataParams.axisIndex = item.axisIndex;\n                    dataParams.axisType = item.axisType;\n                    dataParams.axisId = item.axisId;\n                    dataParams.axisValue = axisHelper.getAxisRawValue(axisModel.axis, axisValue);\n                    dataParams.axisValueLabel = valueLabel;\n\n                    if (dataParams) {\n                        singleParamsList.push(dataParams);\n                        var seriesTooltip = series.formatTooltip(dataIndex, true, null, renderMode);\n\n                        var html;\n                        if (zrUtil.isObject(seriesTooltip)) {\n                            html = seriesTooltip.html;\n                            var newMarkers = seriesTooltip.markers;\n                            zrUtil.merge(markers, newMarkers);\n                        }\n                        else {\n                            html = seriesTooltip;\n                        }\n                        seriesDefaultHTML.push(html);\n                    }\n                });\n\n                // Default tooltip content\n                // FIXME\n                // (1) shold be the first data which has name?\n                // (2) themeRiver, firstDataIndex is array, and first line is unnecessary.\n                var firstLine = valueLabel;\n                if (renderMode !== 'html') {\n                    singleDefaultHTML.push(seriesDefaultHTML.join(newLine));\n                }\n                else {\n                    singleDefaultHTML.push(\n                        (firstLine ? formatUtil.encodeHTML(firstLine) + newLine : '')\n                        + seriesDefaultHTML.join(newLine)\n                    );\n                }\n            });\n        }, this);\n\n        // In most case, the second axis is shown upper than the first one.\n        singleDefaultHTML.reverse();\n        singleDefaultHTML = singleDefaultHTML.join(this._newLine + this._newLine);\n\n        var positionExpr = e.position;\n        this._showOrMove(singleTooltipModel, function () {\n            if (this._updateContentNotChangedOnAxis(dataByCoordSys)) {\n                this._updatePosition(\n                    singleTooltipModel,\n                    positionExpr,\n                    point[0], point[1],\n                    this._tooltipContent,\n                    singleParamsList\n                );\n            }\n            else {\n                this._showTooltipContent(\n                    singleTooltipModel, singleDefaultHTML, singleParamsList, Math.random(),\n                    point[0], point[1], positionExpr, undefined, markers\n                );\n            }\n        });\n\n        // Do not trigger events here, because this branch only be entered\n        // from dispatchAction.\n    },\n\n    _showSeriesItemTooltip: function (e, el, dispatchAction) {\n        var ecModel = this._ecModel;\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 = el.seriesIndex;\n        var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n\n        // For example, graph link.\n        var dataModel = el.dataModel || seriesModel;\n        var dataIndex = el.dataIndex;\n        var dataType = el.dataType;\n        var data = dataModel.getData();\n\n        var tooltipModel = buildTooltipModel([\n            data.getItemModel(dataIndex),\n            dataModel,\n            seriesModel && (seriesModel.coordinateSystem || {}).model,\n            this._tooltipModel\n        ]);\n\n        var tooltipTrigger = tooltipModel.get('trigger');\n        if (tooltipTrigger != null && tooltipTrigger !== 'item') {\n            return;\n        }\n\n        var params = dataModel.getDataParams(dataIndex, dataType);\n        var seriesTooltip = dataModel.formatTooltip(dataIndex, false, dataType, this._renderMode);\n        var defaultHtml;\n        var markers;\n        if (zrUtil.isObject(seriesTooltip)) {\n            defaultHtml = seriesTooltip.html;\n            markers = seriesTooltip.markers;\n        }\n        else {\n            defaultHtml = seriesTooltip;\n            markers = null;\n        }\n\n        var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex;\n\n        this._showOrMove(tooltipModel, function () {\n            this._showTooltipContent(\n                tooltipModel, defaultHtml, params, asyncTicket,\n                e.offsetX, e.offsetY, e.position, e.target, markers\n            );\n        });\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\n    _showComponentItemTooltip: function (e, el, dispatchAction) {\n        var tooltipOpt = el.tooltip;\n        if (typeof tooltipOpt === 'string') {\n            var content = tooltipOpt;\n            tooltipOpt = {\n                content: content,\n                // Fixed formatter\n                formatter: content\n            };\n        }\n        var subTooltipModel = new Model(tooltipOpt, this._tooltipModel, this._ecModel);\n        var defaultHtml = subTooltipModel.get('content');\n        var asyncTicket = Math.random();\n\n        // Do not check whether `trigger` is 'none' here, because `trigger`\n        // only works on cooridinate system. In fact, we have not found case\n        // that requires setting `trigger` nothing on component yet.\n\n        this._showOrMove(subTooltipModel, function () {\n            this._showTooltipContent(\n                subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {},\n                asyncTicket, e.offsetX, e.offsetY, e.position, el\n            );\n        });\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\n    _showTooltipContent: function (\n        tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markers\n    ) {\n        // Reset ticket\n        this._ticket = '';\n\n        if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) {\n            return;\n        }\n\n        var tooltipContent = this._tooltipContent;\n\n        var formatter = tooltipModel.get('formatter');\n        positionExpr = positionExpr || tooltipModel.get('position');\n        var html = defaultHtml;\n\n        if (formatter && typeof formatter === 'string') {\n            html = formatUtil.formatTpl(formatter, params, true);\n        }\n        else if (typeof formatter === 'function') {\n            var callback = bind(function (cbTicket, html) {\n                if (cbTicket === this._ticket) {\n                    tooltipContent.setContent(html, markers, tooltipModel);\n                    this._updatePosition(\n                        tooltipModel, positionExpr, x, y, tooltipContent, params, el\n                    );\n                }\n            }, this);\n            this._ticket = asyncTicket;\n            html = formatter(params, asyncTicket, callback);\n        }\n\n        tooltipContent.setContent(html, markers, tooltipModel);\n        tooltipContent.show(tooltipModel);\n\n        this._updatePosition(\n            tooltipModel, positionExpr, x, y, tooltipContent, params, el\n        );\n    },\n\n    /**\n     * @param  {string|Function|Array.<number>|Object} positionExpr\n     * @param  {number} x Mouse x\n     * @param  {number} y Mouse y\n     * @param  {boolean} confine Whether confine tooltip content in view rect.\n     * @param  {Object|<Array.<Object>} params\n     * @param  {module:zrender/Element} el target element\n     * @param  {module:echarts/ExtensionAPI} api\n     * @return {Array.<number>}\n     */\n    _updatePosition: function (tooltipModel, positionExpr, x, y, content, params, el) {\n        var viewWidth = this._api.getWidth();\n        var viewHeight = this._api.getHeight();\n        positionExpr = positionExpr || tooltipModel.get('position');\n\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\n        if (typeof positionExpr === 'function') {\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\n        if (zrUtil.isArray(positionExpr)) {\n            x = parsePercent(positionExpr[0], viewWidth);\n            y = parsePercent(positionExpr[1], viewHeight);\n        }\n        else if (zrUtil.isObject(positionExpr)) {\n            positionExpr.width = contentSize[0];\n            positionExpr.height = contentSize[1];\n            var layoutRect = layoutUtil.getLayoutRect(\n                positionExpr, {width: viewWidth, 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 (typeof positionExpr === 'string' && el) {\n            var pos = calcTooltipPosition(\n                positionExpr, rect, contentSize\n            );\n            x = pos[0];\n            y = pos[1];\n        }\n        else {\n            var pos = refixTooltipPosition(\n                x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20\n            );\n            x = pos[0];\n            y = pos[1];\n        }\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\n        if (tooltipModel.get('confine')) {\n            var pos = confineTooltipPosition(\n                x, y, content, viewWidth, viewHeight\n            );\n            x = pos[0];\n            y = pos[1];\n        }\n\n        content.moveTo(x, y);\n    },\n\n    // FIXME\n    // Should we remove this but leave this to user?\n    _updateContentNotChangedOnAxis: function (dataByCoordSys) {\n        var lastCoordSys = this._lastDataByCoordSys;\n        var contentNotChanged = !!lastCoordSys\n            && lastCoordSys.length === dataByCoordSys.length;\n\n        contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {\n            var lastDataByAxis = lastItemCoordSys.dataByAxis || {};\n            var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};\n            var thisDataByAxis = thisItemCoordSys.dataByAxis || [];\n            contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length;\n\n            contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) {\n                var thisItem = thisDataByAxis[indexAxis] || {};\n                var lastIndices = lastItem.seriesDataIndices || [];\n                var newIndices = thisItem.seriesDataIndices || [];\n\n                contentNotChanged\n                    &= lastItem.value === thisItem.value\n                    && lastItem.axisType === thisItem.axisType\n                    && lastItem.axisId === thisItem.axisId\n                    && lastIndices.length === newIndices.length;\n\n                contentNotChanged && each(lastIndices, function (lastIdxItem, j) {\n                    var newIdxItem = newIndices[j];\n                    contentNotChanged\n                        &= lastIdxItem.seriesIndex === newIdxItem.seriesIndex\n                        && lastIdxItem.dataIndex === newIdxItem.dataIndex;\n                });\n            });\n        });\n\n        this._lastDataByCoordSys = dataByCoordSys;\n\n        return !!contentNotChanged;\n    },\n\n    _hide: function (dispatchAction) {\n        // Do not directly hideLater here, because this behavior may be prevented\n        // in dispatchAction when showTip is dispatched.\n\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\n    dispose: function (ecModel, api) {\n        if (env.node) {\n            return;\n        }\n        this._tooltipContent.hide();\n        globalListener.unregister('itemTooltip', api);\n    }\n});\n\n\n/**\n * @param {Array.<Object|module:echarts/model/Model>} modelCascade\n * From top to bottom. (the last one should be globalTooltipModel);\n */\nfunction buildTooltipModel(modelCascade) {\n    var resultModel = modelCascade.pop();\n    while (modelCascade.length) {\n        var tooltipOpt = modelCascade.pop();\n        if (tooltipOpt) {\n            if (Model.isInstance(tooltipOpt)) {\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 (typeof tooltipOpt === 'string') {\n                tooltipOpt = {formatter: tooltipOpt};\n            }\n            resultModel = new Model(tooltipOpt, resultModel, resultModel.ecModel);\n        }\n    }\n    return resultModel;\n}\n\nfunction makeDispatchAction(payload, api) {\n    return payload.dispatchAction || zrUtil.bind(api.dispatchAction, api);\n}\n\nfunction refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) {\n    var size = content.getOuterSize();\n    var width = size.width;\n    var height = size.height;\n\n    if (gapH != null) {\n        if (x + width + gapH > viewWidth) {\n            x -= width + gapH;\n        }\n        else {\n            x += gapH;\n        }\n    }\n    if (gapV != null) {\n        if (y + height + gapV > viewHeight) {\n            y -= height + gapV;\n        }\n        else {\n            y += gapV;\n        }\n    }\n    return [x, y];\n}\n\nfunction confineTooltipPosition(x, y, content, viewWidth, viewHeight) {\n    var size = content.getOuterSize();\n    var width = size.width;\n    var height = size.height;\n\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\n    return [x, y];\n}\n\nfunction calcTooltipPosition(position, rect, contentSize) {\n    var domWidth = contentSize[0];\n    var domHeight = contentSize[1];\n    var gap = 5;\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 - gap;\n            break;\n        case 'bottom':\n            x = rect.x + rectWidth / 2 - domWidth / 2;\n            y = rect.y + rectHeight + gap;\n            break;\n        case 'left':\n            x = rect.x - domWidth - gap;\n            y = rect.y + rectHeight / 2 - domHeight / 2;\n            break;\n        case 'right':\n            x = rect.x + rectWidth + gap;\n            y = rect.y + rectHeight / 2 - domHeight / 2;\n    }\n    return [x, y];\n}\n\nfunction isCenterAlign(align) {\n    return align === 'center' || align === 'middle';\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// FIXME Better way to pack data in graphic element\n\nimport * as echarts from '../echarts';\n\nimport './axisPointer';\nimport './tooltip/TooltipModel';\nimport './tooltip/TooltipView';\n\n\n/**\n * @action\n * @property {string} type\n * @property {number} seriesIndex\n * @property {number} dataIndex\n * @property {number} [x]\n * @property {number} [y]\n */\necharts.registerAction(\n    {\n        type: 'showTip',\n        event: 'showTip',\n        update: 'tooltip:manuallyShowTip'\n    },\n    // noop\n    function () {}\n);\n\necharts.registerAction(\n    {\n        type: 'hideTip',\n        event: 'hideTip',\n        update: 'tooltip:manuallyHideTip'\n    },\n    // noop\n    function () {}\n);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];\n\nexport default function (option, isNew) {\n    var brushComponents = option && option.brush;\n    if (!zrUtil.isArray(brushComponents)) {\n        brushComponents = brushComponents ? [brushComponents] : [];\n    }\n\n    if (!brushComponents.length) {\n        return;\n    }\n\n    var brushComponentSpecifiedBtns = [];\n\n    zrUtil.each(brushComponents, function (brushOpt) {\n        var tbs = brushOpt.hasOwnProperty('toolbox')\n            ? brushOpt.toolbox : [];\n\n        if (tbs instanceof Array) {\n            brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);\n        }\n    });\n\n    var toolbox = option && option.toolbox;\n\n    if (zrUtil.isArray(toolbox)) {\n        toolbox = toolbox[0];\n    }\n    if (!toolbox) {\n        toolbox = {feature: {}};\n        option.toolbox = [toolbox];\n    }\n\n    var toolboxFeature = (toolbox.feature || (toolbox.feature = {}));\n    var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});\n    var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);\n\n    brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);\n\n    removeDuplicate(brushTypes);\n\n    if (isNew && !brushTypes.length) {\n        brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);\n    }\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 * @file Visual solution, for consistent option specification.\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport VisualMapping from './VisualMapping';\n\nvar each = zrUtil.each;\n\nfunction hasKeys(obj) {\n    if (obj) {\n        for (var name in obj) {\n            if (obj.hasOwnProperty(name)) {\n                return true;\n            }\n        }\n    }\n}\n\n/**\n * @param {Object} option\n * @param {Array.<string>} stateList\n * @param {Function} [supplementVisualOption]\n * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>>\n */\nexport function createVisualMappings(option, stateList, supplementVisualOption) {\n    var visualMappings = {};\n\n    each(stateList, function (state) {\n        var mappings = visualMappings[state] = createMappings();\n\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\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\n    return visualMappings;\n\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}\n\n/**\n * @param {Object} thisOption\n * @param {Object} newOption\n * @param {Array.<string>} keys\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        }\n        else {\n            delete thisOption[key];\n        }\n    });\n}\n\n/**\n * @param {Array.<string>} stateList\n * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>\n * @param {module:echarts/data/List} list\n * @param {Function} getValueState param: valueOrIndex, return: state.\n * @param {object} [scope] Scope for getValueState\n * @param {string} [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\n    var dataIndex;\n\n    function getVisual(key) {\n        return data.getItemVisual(dataIndex, key);\n    }\n\n    function setVisual(key, value) {\n        data.setItemVisual(dataIndex, key, value);\n    }\n\n    if (dimension == null) {\n        data.each(eachItem);\n    }\n    else {\n        data.each([dimension], eachItem);\n    }\n\n    function eachItem(valueOrIndex, index) {\n        dataIndex = dimension == null ? valueOrIndex : index;\n\n        var rawDataItem = data.getRawDataItem(dataIndex);\n        // Consider performance\n        if (rawDataItem && rawDataItem.visualMap === false) {\n            return;\n        }\n\n        var valueState = getValueState.call(scope, valueOrIndex);\n        var mappings = visualMappings[valueState];\n        var visualTypes = visualTypesMap[valueState];\n\n        for (var i = 0, len = visualTypes.length; i < len; i++) {\n            var type = visualTypes[i];\n            mappings[type] && mappings[type].applyVisual(\n                valueOrIndex, getVisual, setVisual\n            );\n        }\n    }\n}\n\n/**\n * @param {module:echarts/data/List} data\n * @param {Array.<string>} stateList\n * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>\n * @param {Function} getValueState param: valueOrIndex, return: state.\n * @param {number} [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\n    function progress(params, data) {\n        if (dim != null) {\n            dim = data.getDimension(dim);\n        }\n\n        function getVisual(key) {\n            return data.getItemVisual(dataIndex, key);\n        }\n\n        function setVisual(key, value) {\n            data.setItemVisual(dataIndex, key, value);\n        }\n\n        var dataIndex;\n        while ((dataIndex = params.next()) != null) {\n            var rawDataItem = data.getRawDataItem(dataIndex);\n\n            // Consider performance\n            if (rawDataItem && rawDataItem.visualMap === false) {\n                continue;\n            }\n\n            var value = dim != null\n                ? data.get(dim, dataIndex, true)\n                : dataIndex;\n\n            var valueState = getValueState(value);\n            var mappings = visualMappings[valueState];\n            var visualTypes = visualTypesMap[valueState];\n\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    return {progress: progress};\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as polygonContain from 'zrender/src/contain/polygon';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport {linePolygonIntersect} from '../../util/graphic';\n\n// Key of the first level is brushType: `line`, `rect`, `polygon`.\n// Key of the second level is chart element type: `point`, `rect`.\n// See moudule:echarts/component/helper/BrushController\n// function param:\n//      {Object} itemLayout fetch from data.getItemLayout(dataIndex)\n//      {Object} selectors {point: selector, rect: selector, ...}\n//      {Object} area {range: [[], [], ..], boudingRect}\n// function return:\n//      {boolean} Whether in the given brush.\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\n                && area.boundingRect.contain(itemLayout[0], itemLayout[1])\n                && polygonContain.contain(area.range, itemLayout[0], itemLayout[1]);\n        },\n        rect: function (itemLayout, selectors, area) {\n            var points = area.range;\n\n            if (!itemLayout || points.length <= 1) {\n                return false;\n            }\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\n            if (polygonContain.contain(points, x, y)\n                || polygonContain.contain(points, x + width, y)\n                || polygonContain.contain(points, x, y + height)\n                || polygonContain.contain(points, x + width, y + height)\n                || BoundingRect.create(itemLayout).contain(p[0], p[1])\n                || linePolygonIntersect(x, y, x + width, y, points)\n                || linePolygonIntersect(x, y, x, y + height, points)\n                || linePolygonIntersect(x + width, y, x + width, y + height, points)\n                || linePolygonIntersect(x, y + height, x + width, y + height, points)\n            ) {\n                return true;\n            }\n        }\n    }\n};\n\nfunction getLineSelectors(xyIndex) {\n    var xy = ['x', 'y'];\n    var wh = ['width', 'height'];\n\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 = [\n                    itemLayout[xy[xyIndex]],\n                    itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]\n                ];\n                layoutRange[1] < layoutRange[0] && layoutRange.reverse();\n                return inLineRange(layoutRange[0], range)\n                    || inLineRange(layoutRange[1], range)\n                    || inLineRange(range[0], layoutRange)\n                    || inLineRange(range[1], layoutRange);\n            }\n        }\n    };\n}\n\nfunction inLineRange(p, range) {\n    return range[0] <= p && p <= range[1];\n}\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport * as visualSolution from '../../visual/visualSolution';\nimport selector from './selector';\nimport * as throttleUtil from '../../util/throttle';\nimport BrushTargetManager from '../helper/BrushTargetManager';\n\nvar STATE_LIST = ['inBrush', 'outOfBrush'];\nvar DISPATCH_METHOD = '__ecBrushSelect';\nvar DISPATCH_FLAG = '__ecInBrushSelectEvent';\nvar PRIORITY_BRUSH = echarts.PRIORITY.VISUAL.BRUSH;\n\n/**\n * Layout for visual, the priority higher than other layout, and before brush visual.\n */\necharts.registerLayout(PRIORITY_BRUSH, function (ecModel, api, payload) {\n    ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {\n\n        payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(\n            payload.key === 'brush' ? payload.brushOption : {brushType: false}\n        );\n\n        var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);\n\n        brushTargetManager.setInputRanges(brushModel.areas, ecModel);\n    });\n});\n\n/**\n * Register the visual encoding if this modules required.\n */\necharts.registerVisual(PRIORITY_BRUSH, function (ecModel, api, payload) {\n\n    var brushSelected = [];\n    var throttleType;\n    var throttleDelay;\n\n    ecModel.eachComponent({mainType: 'brush'}, function (brushModel, brushIndex) {\n\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\n        var brushOption = brushModel.option;\n        var brushLink = brushOption.brushLink;\n        var linkedSeriesMap = [];\n        var selectedDataIndexForLink = [];\n        var rangeInfoBySeries = [];\n        var hasBrushExists = 0;\n\n        if (!brushIndex) { // Only the first throttle setting works.\n            throttleType = brushOption.throttleType;\n            throttleDelay = brushOption.throttleDelay;\n        }\n\n        // Add boundingRect and selectors to range.\n        var areas = zrUtil.map(brushModel.areas, function (area) {\n            return bindSelector(\n                zrUtil.defaults(\n                    {boundingRect: boundingRectBuilders[area.brushType](area)},\n                    area\n                )\n            );\n        });\n\n        var visualMappings = visualSolution.createVisualMappings(\n            brushModel.option, STATE_LIST, function (mappingOption) {\n                mappingOption.mappingMethod = 'fixed';\n            }\n        );\n\n        zrUtil.isArray(brushLink) && zrUtil.each(brushLink, function (seriesIndex) {\n            linkedSeriesMap[seriesIndex] = 1;\n        });\n\n        function linkOthers(seriesIndex) {\n            return brushLink === 'all' || linkedSeriesMap[seriesIndex];\n        }\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        /**\n         * Logic for each series: (If the logic has to be modified one day, do it carefully!)\n         *\n         * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers  ) => StepA: ┬record, ┬ StepB: ┬visualByRecord.\n         *   !brushed┘    ├hasBrushExist ┤                            └nothing,┘        ├visualByRecord.\n         *                └!hasBrushExist┘                                              └nothing.\n         * ( !brushed  && ┬hasBrushExist ┬ && linkOthers  ) => StepA:  nothing,  StepB: ┬visualByRecord.\n         *                └!hasBrushExist┘                                              └nothing.\n         * ( brushed ┬ &&                     !linkOthers ) => StepA:  nothing,  StepB: ┬visualByCheck.\n         *   !brushed┘                                                                  └nothing.\n         * ( !brushed  &&                     !linkOthers ) => StepA:  nothing,  StepB:  nothing.\n         */\n\n        // Step A\n        ecModel.eachSeries(function (seriesModel, seriesIndex) {\n            var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];\n\n            seriesModel.subType === 'parallel'\n                ? stepAParallel(seriesModel, seriesIndex, rangeInfoList)\n                : stepAOthers(seriesModel, seriesIndex, rangeInfoList);\n        });\n\n        function stepAParallel(seriesModel, seriesIndex) {\n            var coordSys = seriesModel.coordinateSystem;\n            hasBrushExists |= coordSys.hasAxisBrushed();\n\n            linkOthers(seriesIndex) && coordSys.eachActiveState(\n                seriesModel.getData(),\n                function (activeState, dataIndex) {\n                    activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);\n                }\n            );\n        }\n\n        function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {\n            var selectorsByBrushType = getSelectorsByBrushType(seriesModel);\n            if (!selectorsByBrushType || brushModelNotControll(brushModel, seriesIndex)) {\n                return;\n            }\n\n            zrUtil.each(areas, function (area) {\n                selectorsByBrushType[area.brushType]\n                    && brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)\n                    && rangeInfoList.push(area);\n                hasBrushExists |= brushed(rangeInfoList);\n            });\n\n            if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {\n                var data = seriesModel.getData();\n                data.each(function (dataIndex) {\n                    if (checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)) {\n                        selectedDataIndexForLink[dataIndex] = 1;\n                    }\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\n            var selectorsByBrushType = getSelectorsByBrushType(seriesModel);\n            var rangeInfoList = rangeInfoBySeries[seriesIndex];\n\n            var data = seriesModel.getData();\n            var getValueState = linkOthers(seriesIndex)\n                ? function (dataIndex) {\n                    return selectedDataIndexForLink[dataIndex]\n                        ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')\n                        : 'outOfBrush';\n                }\n                : function (dataIndex) {\n                    return checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)\n                        ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')\n                        : 'outOfBrush';\n                };\n\n            // If no supported brush or no brush, all visuals are in original state.\n            (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList))\n                && visualSolution.applyVisual(\n                    STATE_LIST, visualMappings, data, getValueState\n                );\n        });\n\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\n    var zr = api.getZr();\n    if (zr[DISPATCH_FLAG]) {\n        return;\n    }\n\n    if (!zr[DISPATCH_METHOD]) {\n        zr[DISPATCH_METHOD] = doDispatch;\n    }\n\n    var fn = throttleUtil.createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);\n\n    fn(api, brushSelected);\n}\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}\n\nfunction checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) {\n    for (var i = 0, len = rangeInfoList.length; i < len; i++) {\n        var area = rangeInfoList[i];\n        if (selectorsByBrushType[area.brushType](\n            dataIndex, data, area.selectors, area\n        )) {\n            return true;\n        }\n    }\n}\n\nfunction getSelectorsByBrushType(seriesModel) {\n    var brushSelector = seriesModel.brushSelector;\n    if (zrUtil.isString(brushSelector)) {\n        var sels = [];\n        zrUtil.each(selector, function (selectorsByElementType, brushType) {\n            sels[brushType] = function (dataIndex, data, selectors, area) {\n                var itemLayout = data.getItemLayout(dataIndex);\n                return selectorsByElementType[brushSelector](itemLayout, selectors, area);\n            };\n        });\n        return sels;\n    }\n    else if (zrUtil.isFunction(brushSelector)) {\n        var bSelector = {};\n        zrUtil.each(selector, function (sel, brushType) {\n            bSelector[brushType] = brushSelector;\n        });\n        return bSelector;\n    }\n    return brushSelector;\n}\n\nfunction brushModelNotControll(brushModel, seriesIndex) {\n    var seriesIndices = brushModel.option.seriesIndex;\n    return seriesIndices != null\n        && seriesIndices !== 'all'\n        && (\n            zrUtil.isArray(seriesIndices)\n            ? zrUtil.indexOf(seriesIndices, seriesIndex) < 0\n            : seriesIndex !== seriesIndices\n        );\n}\n\nfunction bindSelector(area) {\n    var selectors = area.selectors = {};\n    zrUtil.each(selector[area.brushType], function (selFn, elType) {\n        // Do not use function binding or curry for performance.\n        selectors[elType] = function (itemLayout) {\n            return selFn(itemLayout, selectors, area);\n        };\n    });\n    return area;\n}\n\nvar boundingRectBuilders = {\n\n    lineX: zrUtil.noop,\n\n    lineY: zrUtil.noop,\n\n    rect: function (area) {\n        return getBoundingRectFromMinMax(area.range);\n    },\n\n    polygon: function (area) {\n        var minMax;\n        var range = area.range;\n\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\n        return minMax && getBoundingRectFromMinMax(minMax);\n    }\n};\n\nfunction getBoundingRectFromMinMax(minMax) {\n    return new BoundingRect(\n        minMax[0][0],\n        minMax[1][0],\n        minMax[0][1] - minMax[0][0],\n        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\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as visualSolution from '../../visual/visualSolution';\nimport Model from '../../model/Model';\n\nvar DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd'];\n\nvar BrushModel = echarts.extendComponentModel({\n\n    type: 'brush',\n\n    dependencies: ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'],\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        // inBrush: null,\n        // outOfBrush: null,\n        toolbox: null,          // Default value see preprocessor.\n        brushLink: null,        // Series indices array, broadcast using dataIndex.\n                                // or 'all', which means all series. 'none' or null means no series.\n        seriesIndex: 'all',     // seriesIndex array, specify series controlled by this brush component.\n        geoIndex: null,         //\n        xAxisIndex: null,\n        yAxisIndex: null,\n\n        brushType: 'rect',      // Default brushType, see BrushController.\n        brushMode: 'single',    // Default brushMode, 'single' or 'multiple'\n        transformable: true,    // Default transformable.\n        brushStyle: {           // Default brushStyle\n            borderWidth: 1,\n            color: 'rgba(120,140,180,0.3)',\n            borderColor: 'rgba(120,140,180,0.8)'\n        },\n\n        throttleType: 'fixRate', // Throttle in brushSelected event. 'fixRate' or 'debounce'.\n                                 // If null, no throttle. Valid only in the first brush component\n        throttleDelay: 0,        // Unit: ms, 0 means every event will be triggered.\n\n        // FIXME\n        // 试验效果\n        removeOnClick: true,\n\n        z: 10000\n    },\n\n    /**\n     * @readOnly\n     * @type {Array.<Object>}\n     */\n    areas: [],\n\n    /**\n     * Current activated brush type.\n     * If null, brush is inactived.\n     * see module:echarts/component/helper/BrushController\n     * @readOnly\n     * @type {string}\n     */\n    brushType: null,\n\n    /**\n     * Current brush opt.\n     * see module:echarts/component/helper/BrushController\n     * @readOnly\n     * @type {Object}\n     */\n    brushOption: {},\n\n    /**\n     * @readOnly\n     * @type {Array.<Object>}\n     */\n    coordInfoList: [],\n\n    optionUpdated: function (newOption, isInit) {\n        var thisOption = this.option;\n\n        !isInit && visualSolution.replaceVisualOption(\n            thisOption, newOption, ['inBrush', 'outOfBrush']\n        );\n\n        var inBrush = thisOption.inBrush = thisOption.inBrush || {};\n        // Always give default visual, consider setOption at the second time.\n        thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR};\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    /**\n     * If ranges is null/undefined, range state remain.\n     *\n     * @param {Array.<Object>} [ranges]\n     */\n    setAreas: function (areas) {\n        if (__DEV__) {\n            zrUtil.assert(zrUtil.isArray(areas));\n            zrUtil.each(areas, function (area) {\n                zrUtil.assert(area.brushType, 'Illegal areas');\n            });\n        }\n\n        // If ranges 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\n        this.areas = zrUtil.map(areas, function (area) {\n            return generateBrushOption(this.option, area);\n        }, this);\n    },\n\n    /**\n     * see module:echarts/component/helper/BrushController\n     * @param {Object} brushOption\n     */\n    setBrushOption: function (brushOption) {\n        this.brushOption = generateBrushOption(this.option, brushOption);\n        this.brushType = this.brushOption.brushType;\n    }\n\n});\n\nfunction generateBrushOption(option, brushOption) {\n    return zrUtil.merge(\n        {\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        },\n        brushOption,\n        true\n    );\n}\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport BrushController from '../helper/BrushController';\n\nexport default echarts.extendComponentView({\n\n    type: 'brush',\n\n    init: function (ecModel, api) {\n\n        /**\n         * @readOnly\n         * @type {module:echarts/model/Global}\n         */\n        this.ecModel = ecModel;\n\n        /**\n         * @readOnly\n         * @type {module:echarts/ExtensionAPI}\n         */\n        this.api = api;\n\n        /**\n         * @readOnly\n         * @type {module:echarts/component/brush/BrushModel}\n         */\n        this.model;\n\n        /**\n         * @private\n         * @type {module:echarts/component/helper/BrushController}\n         */\n        (this._brushController = new BrushController(api.getZr()))\n            .on('brush', zrUtil.bind(this._onBrush, this))\n            .mount();\n    },\n\n    /**\n     * @override\n     */\n    render: function (brushModel) {\n        this.model = brushModel;\n        return updateController.apply(this, arguments);\n    },\n\n    /**\n     * @override\n     */\n    updateTransform: updateController,\n\n    /**\n     * @override\n     */\n    updateView: updateController,\n\n    // /**\n    //  * @override\n    //  */\n    // updateLayout: updateController,\n\n    // /**\n    //  * @override\n    //  */\n    // updateVisual: updateController,\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        this._brushController.dispose();\n    },\n\n    /**\n     * @private\n     */\n    _onBrush: function (areas, opt) {\n        var modelId = this.model.id;\n\n        this.model.brushTargetManager.setOutputRanges(areas, this.ecModel);\n\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        (!opt.isEnd || opt.removeOnClick) && this.api.dispatchAction({\n            type: 'brush',\n            brushId: modelId,\n            areas: zrUtil.clone(areas),\n            $from: modelId\n        });\n    }\n\n});\n\nfunction updateController(brushModel, ecModel, api, payload) {\n    // Do not update controller when drawing.\n    (!payload || payload.$from !== brushModel.id) && this._brushController\n        .setPanels(brushModel.brushTargetManager.makePanelOpts(api))\n        .enableBrush(brushModel.brushOption)\n        .updateCovers(brushModel.areas.slice());\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\n\n/**\n * payload: {\n *      brushIndex: number, or,\n *      brushId: string, or,\n *      brushName: string,\n *      globalRanges: Array\n * }\n */\necharts.registerAction(\n        {type: 'brush', event: 'brush' /*, update: 'updateView' */},\n    function (payload, ecModel) {\n        ecModel.eachComponent({mainType: 'brush', query: payload}, function (brushModel) {\n            brushModel.setAreas(payload.areas);\n        });\n    }\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 */\necharts.registerAction(\n    {type: 'brushSelect', event: 'brushSelected', update: 'none'},\n    function () {}\n);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as featureManager from '../featureManager';\nimport lang from '../../../lang';\n\nvar brushLang = lang.toolbox.brush;\n\nfunction Brush(model, ecModel, api) {\n    this.model = model;\n    this.ecModel = ecModel;\n    this.api = api;\n\n    /**\n     * @private\n     * @type {string}\n     */\n    this._brushType;\n\n    /**\n     * @private\n     * @type {string}\n     */\n    this._brushMode;\n}\n\nBrush.defaultOption = {\n    show: true,\n    type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],\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', // jshint ignore:line\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', // jshint ignore:line\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', // jshint ignore:line\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', // jshint ignore:line\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', // jshint ignore:line\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: zrUtil.clone(brushLang.title)\n};\n\nvar proto = Brush.prototype;\n\n// proto.updateLayout = function (featureModel, ecModel, api) {\n/* eslint-disable */\nproto.render =\n/* eslint-enable */\nproto.updateView = function (featureModel, ecModel, api) {\n    var brushType;\n    var brushMode;\n    var isBrushed;\n\n    ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {\n        brushType = brushModel.brushType;\n        brushMode = brushModel.brushOption.brushMode || 'single';\n        isBrushed |= brushModel.areas.length;\n    });\n    this._brushType = brushType;\n    this._brushMode = brushMode;\n\n    zrUtil.each(featureModel.get('type', true), function (type) {\n        featureModel.setIconStatus(\n            type,\n            (\n                type === 'keep'\n                ? brushMode === 'multiple'\n                : type === 'clear'\n                ? isBrushed\n                : type === brushType\n            ) ? 'emphasis' : 'normal'\n        );\n    });\n};\n\nproto.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\nproto.onclick = function (ecModel, api, type) {\n    var brushType = this._brushType;\n    var brushMode = this._brushMode;\n\n    if (type === 'clear') {\n        // Trigger parallel action firstly\n        api.dispatchAction({\n            type: 'axisAreaSelect',\n            intervals: []\n        });\n\n        api.dispatchAction({\n            type: 'brush',\n            command: 'clear',\n            // Clear all areas of all brush components.\n            areas: []\n        });\n    }\n    else {\n        api.dispatchAction({\n            type: 'takeGlobalCursor',\n            key: 'brush',\n            brushOption: {\n                brushType: type === 'keep'\n                    ? brushType\n                    : (brushType === type ? false : type),\n                brushMode: type === 'keep'\n                    ? (brushMode === 'multiple' ? 'single' : 'multiple')\n                    : brushMode\n            }\n        });\n    }\n};\n\nfeatureManager.register('brush', Brush);\n\nexport default Brush;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Brush component entry\n */\n\nimport * as echarts from '../echarts';\nimport preprocessor from './brush/preprocessor';\n\nimport './brush/visualEncoding';\nimport './brush/BrushModel';\nimport './brush/BrushView';\nimport './brush/brushAction';\nimport './toolbox/feature/Brush';\n\necharts.registerPreprocessor(preprocessor);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as echarts from '../echarts';\nimport * as graphic from '../util/graphic';\nimport {getLayoutRect} from '../util/layout';\n\n// Model\necharts.extendComponentModel({\n\n    type: 'title',\n\n    layoutMode: {type: 'box', ignoreSize: true},\n\n    defaultOption: {\n        // 一级层叠\n        zlevel: 0,\n        // 二级层叠\n        z: 6,\n        show: true,\n\n        text: '',\n        // 超链接跳转\n        // link: null,\n        // 仅支持self | blank\n        target: 'blank',\n        subtext: '',\n\n        // 超链接跳转\n        // sublink: null,\n        // 仅支持self | blank\n        subtarget: 'blank',\n\n        // 'center' ¦ 'left' ¦ 'right'\n        // ¦ {number}（x坐标，单位px）\n        left: 0,\n        // 'top' ¦ 'bottom' ¦ 'center'\n        // ¦ {number}（y坐标，单位px）\n        top: 0,\n\n        // 水平对齐\n        // 'auto' | 'left' | 'right' | 'center'\n        // 默认根据 left 的位置判断是左对齐还是右对齐\n        // textAlign: null\n        //\n        // 垂直对齐\n        // 'auto' | 'top' | 'bottom' | 'middle'\n        // 默认根据 top 位置判断是上对齐还是下对齐\n        // textVerticalAlign: null\n        // textBaseline: null // The same as textVerticalAlign.\n\n        backgroundColor: 'rgba(0,0,0,0)',\n\n        // 标题边框颜色\n        borderColor: '#ccc',\n\n        // 标题边框线宽，单位px，默认为0（无边框）\n        borderWidth: 0,\n\n        // 标题内边距，单位px，默认各方向内边距为5，\n        // 接受数组分别设定上右下左边距，同css\n        padding: 5,\n\n        // 主副标题纵向间隔，单位px，默认为10，\n        itemGap: 10,\n        textStyle: {\n            fontSize: 18,\n            fontWeight: 'bolder',\n            color: '#333'\n        },\n        subtextStyle: {\n            color: '#aaa'\n        }\n    }\n});\n\n// View\necharts.extendComponentView({\n\n    type: 'title',\n\n    render: function (titleModel, ecModel, api) {\n        this.group.removeAll();\n\n        if (!titleModel.get('show')) {\n            return;\n        }\n\n        var group = this.group;\n\n        var textStyleModel = titleModel.getModel('textStyle');\n        var subtextStyleModel = titleModel.getModel('subtextStyle');\n\n        var textAlign = titleModel.get('textAlign');\n        var textVerticalAlign = zrUtil.retrieve2(\n            titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')\n        );\n\n        var textEl = new graphic.Text({\n            style: graphic.setTextStyle({}, textStyleModel, {\n                text: titleModel.get('text'),\n                textFill: textStyleModel.getTextColor()\n            }, {disableBox: true}),\n            z2: 10\n        });\n\n        var textRect = textEl.getBoundingRect();\n\n        var subText = titleModel.get('subtext');\n        var subTextEl = new graphic.Text({\n            style: graphic.setTextStyle({}, subtextStyleModel, {\n                text: subText,\n                textFill: subtextStyleModel.getTextColor(),\n                y: textRect.height + titleModel.get('itemGap'),\n                textVerticalAlign: 'top'\n            }, {disableBox: true}),\n            z2: 10\n        });\n\n        var link = titleModel.get('link');\n        var sublink = titleModel.get('sublink');\n        var triggerEvent = titleModel.get('triggerEvent', true);\n\n        textEl.silent = !link && !triggerEvent;\n        subTextEl.silent = !sublink && !triggerEvent;\n\n        if (link) {\n            textEl.on('click', function () {\n                window.open(link, '_' + titleModel.get('target'));\n            });\n        }\n        if (sublink) {\n            subTextEl.on('click', function () {\n                window.open(sublink, '_' + titleModel.get('subtarget'));\n            });\n        }\n\n        textEl.eventData = subTextEl.eventData = triggerEvent\n            ? {\n                componentType: 'title',\n                componentIndex: titleModel.componentIndex\n            }\n            : null;\n\n        group.add(textEl);\n        subText && group.add(subTextEl);\n        // If no subText, but add subTextEl, there will be an empty line.\n\n        var groupRect = group.getBoundingRect();\n        var layoutOption = titleModel.getBoxLayoutParams();\n        layoutOption.width = groupRect.width;\n        layoutOption.height = groupRect.height;\n        var layoutRect = getLayoutRect(\n            layoutOption, {\n                width: api.getWidth(),\n                height: api.getHeight()\n            }, titleModel.get('padding')\n        );\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            if (textAlign === 'middle') {\n                textAlign = 'center';\n            }\n            // Adjust layout by text align\n            if (textAlign === 'right') {\n                layoutRect.x += layoutRect.width;\n            }\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            if (textVerticalAlign === 'center') {\n                textVerticalAlign = 'middle';\n            }\n            if (textVerticalAlign === 'bottom') {\n                layoutRect.y += layoutRect.height;\n            }\n            else if (textVerticalAlign === 'middle') {\n                layoutRect.y += layoutRect.height / 2;\n            }\n\n            textVerticalAlign = textVerticalAlign || 'top';\n        }\n\n        group.attr('position', [layoutRect.x, layoutRect.y]);\n        var alignStyle = {\n            textAlign: textAlign,\n            textVerticalAlign: textVerticalAlign\n        };\n        textEl.setStyle(alignStyle);\n        subTextEl.setStyle(alignStyle);\n\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\n        group.add(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\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default function (option) {\n    var timelineOpt = option && option.timeline;\n\n    if (!zrUtil.isArray(timelineOpt)) {\n        timelineOpt = timelineOpt ? [timelineOpt] : [];\n    }\n\n    zrUtil.each(timelineOpt, function (opt) {\n        if (!opt) {\n            return;\n        }\n\n        compatibleEC2(opt);\n    });\n}\n\nfunction compatibleEC2(opt) {\n    var type = opt.type;\n\n    var ec2Types = {'number': 'value', 'time': 'time'};\n\n    // Compatible with ec2\n    if (ec2Types[type]) {\n        opt.axisType = ec2Types[type];\n        delete opt.type;\n    }\n\n    transferItem(opt);\n\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\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}\n\nfunction transferItem(opt) {\n    var itemStyle = opt.itemStyle || (opt.itemStyle = {});\n\n    var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {});\n\n    // Transfer label out\n    var label = opt.label || (opt.label || {});\n    var labelNormal = label.normal || (label.normal = {});\n    var excludeLabelAttr = {normal: 1, emphasis: 1};\n\n    zrUtil.each(label, function (value, name) {\n        if (!excludeLabelAttr[name] && !has(labelNormal, name)) {\n            labelNormal[name] = value;\n        }\n    });\n\n    if (itemStyleEmphasis.label && !has(label, 'emphasis')) {\n        label.emphasis = itemStyleEmphasis.label;\n        delete itemStyleEmphasis.label;\n    }\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\nimport Component from '../../model/Component';\n\nComponent.registerSubTypeDefaulter('timeline', function () {\n    // Only slider now.\n    return 'slider';\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\necharts.registerAction(\n\n    {type: 'timelineChange', event: 'timelineChanged', update: 'prepareAndUpdate'},\n\n    function (payload, ecModel) {\n\n        var timelineModel = ecModel.getComponent('timeline');\n        if (timelineModel && payload.currentIndex != null) {\n            timelineModel.setCurrentIndex(payload.currentIndex);\n\n            if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) {\n                timelineModel.setPlayState(false);\n            }\n        }\n\n        // Set normalized currentIndex to payload.\n        ecModel.resetOption('timeline');\n\n        return zrUtil.defaults({\n            currentIndex: timelineModel.option.currentIndex\n        }, payload);\n    }\n);\n\necharts.registerAction(\n\n    {type: 'timelinePlayChange', event: 'timelinePlayChanged', update: 'update'},\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport ComponentModel from '../../model/Component';\nimport List from '../../data/List';\nimport * as modelUtil from '../../util/model';\n\nvar TimelineModel = ComponentModel.extend({\n\n    type: 'timeline',\n\n    layoutMode: 'box',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n\n        zlevel: 0,                  // 一级层叠\n        z: 4,                       // 二级层叠\n        show: true,\n\n        axisType: 'time',  // 模式是时间类型，支持 value, category\n\n        realtime: true,\n\n        left: '20%',\n        top: null,\n        right: '20%',\n        bottom: 0,\n        width: null,\n        height: 40,\n        padding: 5,\n\n        controlPosition: 'left',           // 'left' 'right' 'top' 'bottom' 'none'\n        autoPlay: false,\n        rewind: false,                     // 反向播放\n        loop: true,\n        playInterval: 2000,                // 播放时间间隔，单位ms\n\n        currentIndex: 0,\n\n        itemStyle: {},\n        label: {\n            color: '#000'\n        },\n\n        data: []\n    },\n\n    /**\n     * @override\n     */\n    init: function (option, parentModel, ecModel) {\n\n        /**\n         * @private\n         * @type {module:echarts/data/List}\n         */\n        this._data;\n\n        /**\n         * @private\n         * @type {Array.<string>}\n         */\n        this._names;\n\n        this.mergeDefaultAndTheme(option, ecModel);\n        this._initData();\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function (option) {\n        TimelineModel.superApply(this, 'mergeOption', arguments);\n        this._initData();\n    },\n\n    /**\n     * @param {number} [currentIndex]\n     */\n    setCurrentIndex: function (currentIndex) {\n        if (currentIndex == null) {\n            currentIndex = this.option.currentIndex;\n        }\n        var count = this._data.count();\n\n        if (this.option.loop) {\n            currentIndex = (currentIndex % count + count) % count;\n        }\n        else {\n            currentIndex >= count && (currentIndex = count - 1);\n            currentIndex < 0 && (currentIndex = 0);\n        }\n\n        this.option.currentIndex = currentIndex;\n    },\n\n    /**\n     * @return {number} currentIndex\n     */\n    getCurrentIndex: function () {\n        return this.option.currentIndex;\n    },\n\n    /**\n     * @return {boolean}\n     */\n    isIndexMax: function () {\n        return this.getCurrentIndex() >= this._data.count() - 1;\n    },\n\n    /**\n     * @param {boolean} state true: play, false: stop\n     */\n    setPlayState: function (state) {\n        this.option.autoPlay = !!state;\n    },\n\n    /**\n     * @return {boolean} true: play, false: stop\n     */\n    getPlayState: function () {\n        return !!this.option.autoPlay;\n    },\n\n    /**\n     * @private\n     */\n    _initData: function () {\n        var thisOption = this.option;\n        var dataArr = thisOption.data || [];\n        var axisType = thisOption.axisType;\n        var names = this._names = [];\n\n        if (axisType === 'category') {\n            var idxArr = [];\n            zrUtil.each(dataArr, function (item, index) {\n                var value = modelUtil.getDataItemValue(item);\n                var newItem;\n\n                if (zrUtil.isObject(item)) {\n                    newItem = zrUtil.clone(item);\n                    newItem.value = index;\n                }\n                else {\n                    newItem = index;\n                }\n\n                idxArr.push(newItem);\n\n                if (!zrUtil.isString(value) && (value == null || isNaN(value))) {\n                    value = '';\n                }\n\n                names.push(value + '');\n            });\n            dataArr = idxArr;\n        }\n\n        var dimType = ({category: 'ordinal', time: 'time'})[axisType] || 'number';\n\n        var data = this._data = new List([{name: 'value', type: dimType}], this);\n\n        data.initData(dataArr, names);\n    },\n\n    getData: function () {\n        return this._data;\n    },\n\n    /**\n     * @public\n     * @return {Array.<string>} categoreis\n     */\n    getCategories: function () {\n        if (this.get('axisType') === 'category') {\n            return this._names.slice();\n        }\n    }\n\n});\n\nexport default TimelineModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport TimelineModel from './TimelineModel';\nimport dataFormatMixin from '../../model/mixin/dataFormat';\n\nvar SliderTimelineModel = TimelineModel.extend({\n\n    type: 'timeline.slider',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n\n        backgroundColor: 'rgba(0,0,0,0)',   // 时间轴背景颜色\n        borderColor: '#ccc',               // 时间轴边框颜色\n        borderWidth: 0,                    // 时间轴边框线宽，单位px，默认为0（无边框）\n\n        orient: 'horizontal',              // 'vertical'\n        inverse: false,\n\n        tooltip: {                          // boolean or Object\n            trigger: 'item'                 // data item may also have tootip attr.\n        },\n\n        symbol: 'emptyCircle',\n        symbolSize: 10,\n\n        lineStyle: {\n            show: true,\n            width: 2,\n            color: '#304654'\n        },\n        label: {                            // 文本标签\n            position: 'auto',           // auto left right top bottom\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            // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n            color: '#304654'\n        },\n        itemStyle: {\n            color: '#304654',\n            borderWidth: 1\n        },\n\n        checkpointStyle: {\n            symbol: 'circle',\n            symbolSize: 13,\n            color: '#c23531',\n            borderWidth: 5,\n            borderColor: 'rgba(194,53,49, 0.5)',\n            animation: true,\n            animationDuration: 300,\n            animationEasing: 'quinticInOut'\n        },\n\n        controlStyle: {\n            show: true,\n            showPlayBtn: true,\n            showPrevBtn: true,\n            showNextBtn: true,\n            itemSize: 22,\n            itemGap: 12,\n            position: 'left',  // 'left' 'right' 'top' 'bottom'\n            playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', // jshint ignore:line\n            stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', // jshint ignore:line\n            nextIcon: 'path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z', // jshint ignore:line\n            prevIcon: 'path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z', // jshint ignore:line\n\n            color: '#304654',\n            borderColor: '#304654',\n            borderWidth: 1\n        },\n\n        emphasis: {\n            label: {\n                show: true,\n                // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n                color: '#c23531'\n            },\n\n            itemStyle: {\n                color: '#c23531'\n            },\n\n            controlStyle: {\n                color: '#c23531',\n                borderColor: '#c23531',\n                borderWidth: 2\n            }\n        },\n        data: []\n    }\n\n});\n\nzrUtil.mixin(SliderTimelineModel, dataFormatMixin);\n\nexport default SliderTimelineModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport ComponentView from '../../view/Component';\n\nexport default ComponentView.extend({\n    type: 'timeline'\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport Axis from '../../coord/Axis';\n\n/**\n * Extend axis 2d\n * @constructor module:echarts/coord/cartesian/Axis2D\n * @extends {module:echarts/coord/cartesian/Axis}\n * @param {string} dim\n * @param {*} scale\n * @param {Array.<number>} coordExtent\n * @param {string} axisType\n * @param {string} position\n */\nvar TimelineAxis = function (dim, scale, coordExtent, axisType) {\n\n    Axis.call(this, dim, scale, coordExtent);\n\n    /**\n     * Axis type\n     *  - 'category'\n     *  - 'value'\n     *  - 'time'\n     *  - 'log'\n     * @type {string}\n     */\n    this.type = axisType || 'value';\n\n    /**\n     * Axis model\n     * @param {module:echarts/component/TimelineModel}\n     */\n    this.model = null;\n};\n\nTimelineAxis.prototype = {\n\n    constructor: TimelineAxis,\n\n    /**\n     * @override\n     */\n    getLabelModel: function () {\n        return this.model.getModel('label');\n    },\n\n    /**\n     * @override\n     */\n    isHorizontal: function () {\n        return this.model.get('orient') === 'horizontal';\n    }\n\n};\n\nzrUtil.inherits(TimelineAxis, Axis);\n\nexport default TimelineAxis;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport BoundingRect from 'zrender/src/core/BoundingRect';\nimport * as matrix from 'zrender/src/core/matrix';\nimport * as graphic from '../../util/graphic';\nimport * as layout from '../../util/layout';\nimport TimelineView from './TimelineView';\nimport TimelineAxis from './TimelineAxis';\nimport {createSymbol} from '../../util/symbol';\nimport * as axisHelper from '../../coord/axisHelper';\nimport * as numberUtil from '../../util/number';\nimport {encodeHTML} from '../../util/format';\n\nvar bind = zrUtil.bind;\nvar each = zrUtil.each;\n\nvar PI = Math.PI;\n\nexport default TimelineView.extend({\n\n    type: 'timeline.slider',\n\n    init: function (ecModel, api) {\n\n        this.api = api;\n\n        /**\n         * @private\n         * @type {module:echarts/component/timeline/TimelineAxis}\n         */\n        this._axis;\n\n        /**\n         * @private\n         * @type {module:zrender/core/BoundingRect}\n         */\n        this._viewRect;\n\n        /**\n         * @type {number}\n         */\n        this._timer;\n\n        /**\n         * @type {module:zrender/Element}\n         */\n        this._currentPointer;\n\n        /**\n         * @type {module:zrender/container/Group}\n         */\n        this._mainGroup;\n\n        /**\n         * @type {module:zrender/container/Group}\n         */\n        this._labelGroup;\n    },\n\n    /**\n     * @override\n     */\n    render: function (timelineModel, ecModel, api, payload) {\n        this.model = timelineModel;\n        this.api = api;\n        this.ecModel = ecModel;\n\n        this.group.removeAll();\n\n        if (timelineModel.get('show', true)) {\n\n            var layoutInfo = this._layout(timelineModel, api);\n            var mainGroup = this._createGroup('mainGroup');\n            var labelGroup = this._createGroup('labelGroup');\n\n            /**\n             * @private\n             * @type {module:echarts/component/timeline/TimelineAxis}\n             */\n            var axis = this._axis = this._createAxis(layoutInfo, timelineModel);\n\n            timelineModel.formatTooltip = function (dataIndex) {\n                return encodeHTML(axis.scale.getLabel(dataIndex));\n            };\n\n            each(\n                ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'],\n                function (name) {\n                    this['_render' + name](layoutInfo, mainGroup, axis, timelineModel);\n                },\n                this\n            );\n\n            this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel);\n            this._position(layoutInfo, timelineModel);\n        }\n\n        this._doPlayStop();\n    },\n\n    /**\n     * @override\n     */\n    remove: function () {\n        this._clearTimer();\n        this.group.removeAll();\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        this._clearTimer();\n    },\n\n    _layout: function (timelineModel, api) {\n        var labelPosOpt = timelineModel.get('label.position');\n        var orient = timelineModel.get('orient');\n        var viewRect = getViewRect(timelineModel, api);\n        // Auto label offset.\n        if (labelPosOpt == null || labelPosOpt === 'auto') {\n            labelPosOpt = orient === 'horizontal'\n                ? ((viewRect.y + viewRect.height / 2) < api.getHeight() / 2 ? '-' : '+')\n                : ((viewRect.x + viewRect.width / 2) < api.getWidth() / 2 ? '+' : '-');\n        }\n        else if (isNaN(labelPosOpt)) {\n            labelPosOpt = ({\n                horizontal: {top: '-', bottom: '+'},\n                vertical: {left: '-', right: '+'}\n            })[orient][labelPosOpt];\n        }\n\n        var labelAlignMap = {\n            horizontal: 'center',\n            vertical: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'left' : 'right'\n        };\n\n        var labelBaselineMap = {\n            horizontal: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'top' : 'bottom',\n            vertical: 'middle'\n        };\n        var rotationMap = {\n            horizontal: 0,\n            vertical: PI / 2\n        };\n\n        // Position\n        var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;\n\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\n        // Special label rotate.\n        var labelRotation = timelineModel.get('label.rotate') || 0;\n        labelRotation = labelRotation * PI / 180; // To radian.\n\n        var playPosition;\n        var prevBtnPosition;\n        var nextBtnPosition;\n        var axisExtent;\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\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        }\n        else { // '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        axisExtent = [xLeft, xRight];\n\n        if (timelineModel.get('inverse')) {\n            axisExtent.reverse();\n        }\n\n        return {\n            viewRect: viewRect,\n            mainLength: mainLength,\n            orient: orient,\n\n            rotation: rotationMap[orient],\n            labelRotation: labelRotation,\n            labelPosOpt: labelPosOpt,\n            labelAlign: timelineModel.get('label.align') || labelAlignMap[orient],\n            labelBaseline: timelineModel.get('label.verticalAlign')\n                || timelineModel.get('label.baseline')\n                || labelBaselineMap[orient],\n\n            // Based on mainGroup.\n            playPosition: playPosition,\n            prevBtnPosition: prevBtnPosition,\n            nextBtnPosition: nextBtnPosition,\n            axisExtent: axisExtent,\n\n            controlSize: controlSize,\n            controlGap: controlGap\n        };\n    },\n\n    _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\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\n        var mainGroup = this._mainGroup;\n        var labelGroup = this._labelGroup;\n\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\n        var viewBound = getBound(viewRect);\n        var mainBound = getBound(mainGroup.getBoundingRect());\n        var labelBound = getBound(labelGroup.getBoundingRect());\n\n        var mainPosition = mainGroup.position;\n        var labelsPosition = labelGroup.position;\n\n        labelsPosition[0] = mainPosition[0] = viewBound[0][0];\n\n        var labelPosOpt = layoutInfo.labelPosOpt;\n\n        if (isNaN(labelPosOpt)) { // '+' or '-'\n            var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;\n            toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n            toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);\n        }\n        else {\n            var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;\n            toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n            labelsPosition[1] = mainPosition[1] + labelPosOpt;\n        }\n\n        mainGroup.attr('position', mainPosition);\n        labelGroup.attr('position', labelsPosition);\n        mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;\n\n        setOrigin(mainGroup);\n        setOrigin(labelGroup);\n\n        function setOrigin(targetGroup) {\n            var pos = targetGroup.position;\n            targetGroup.origin = [\n                viewBound[0][0] - pos[0],\n                viewBound[1][0] - pos[1]\n            ];\n        }\n\n        function getBound(rect) {\n            // [[xmin, xmax], [ymin, ymax]]\n            return [\n                [rect.x, rect.x + rect.width],\n                [rect.y, rect.y + rect.height]\n            ];\n        }\n\n        function toBound(fromPos, from, to, dimIdx, boundIdx) {\n            fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];\n        }\n    },\n\n    _createAxis: function (layoutInfo, timelineModel) {\n        var data = timelineModel.getData();\n        var axisType = timelineModel.get('axisType');\n\n        var scale = axisHelper.createScaleByModel(timelineModel, axisType);\n\n        // Customize scale. The `tickValue` is `dataIndex`.\n        scale.getTicks = function () {\n            return data.mapArray(['value'], function (value) {\n                return value;\n            });\n        };\n\n        var dataExtent = data.getDataExtent('value');\n        scale.setExtent(dataExtent[0], dataExtent[1]);\n        scale.niceTicks();\n\n        var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);\n        axis.model = timelineModel;\n\n        return axis;\n    },\n\n    _createGroup: function (name) {\n        var newGroup = this['_' + name] = new graphic.Group();\n        this.group.add(newGroup);\n        return newGroup;\n    },\n\n    _renderAxisLine: function (layoutInfo, group, axis, timelineModel) {\n        var axisExtent = axis.getExtent();\n\n        if (!timelineModel.get('lineStyle.show')) {\n            return;\n        }\n\n        group.add(new graphic.Line({\n            shape: {\n                x1: axisExtent[0], y1: 0,\n                x2: axisExtent[1], y2: 0\n            },\n            style: zrUtil.extend(\n                {lineCap: 'round'},\n                timelineModel.getModel('lineStyle').getLineStyle()\n            ),\n            silent: true,\n            z2: 1\n        }));\n    },\n\n    /**\n     * @private\n     */\n    _renderAxisTick: function (layoutInfo, group, axis, timelineModel) {\n        var data = timelineModel.getData();\n        // Show all ticks, despite ignoring strategy.\n        var ticks = axis.scale.getTicks();\n\n        // The value is dataIndex, see the costomized scale.\n        each(ticks, function (value) {\n            var tickCoord = axis.dataToCoord(value);\n            var itemModel = data.getItemModel(value);\n            var itemStyleModel = itemModel.getModel('itemStyle');\n            var hoverStyleModel = itemModel.getModel('emphasis.itemStyle');\n            var symbolOpt = {\n                position: [tickCoord, 0],\n                onclick: bind(this._changeTimeline, this, value)\n            };\n            var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);\n            graphic.setHoverStyle(el, hoverStyleModel.getItemStyle());\n\n            if (itemModel.get('tooltip')) {\n                el.dataIndex = value;\n                el.dataModel = timelineModel;\n            }\n            else {\n                el.dataIndex = el.dataModel = null;\n            }\n\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) {\n        var labelModel = axis.getLabelModel();\n\n        if (!labelModel.get('show')) {\n            return;\n        }\n\n        var data = timelineModel.getData();\n        var labels = axis.getViewLabels();\n\n        each(labels, function (labelItem) {\n            // The tickValue is dataIndex, see the costomized scale.\n            var dataIndex = labelItem.tickValue;\n\n            var itemModel = data.getItemModel(dataIndex);\n            var normalLabelModel = itemModel.getModel('label');\n            var hoverLabelModel = itemModel.getModel('emphasis.label');\n            var tickCoord = axis.dataToCoord(labelItem.tickValue);\n            var textEl = new graphic.Text({\n                position: [tickCoord, 0],\n                rotation: layoutInfo.labelRotation - layoutInfo.rotation,\n                onclick: bind(this._changeTimeline, this, dataIndex),\n                silent: false\n            });\n            graphic.setTextStyle(textEl.style, normalLabelModel, {\n                text: labelItem.formattedLabel,\n                textAlign: layoutInfo.labelAlign,\n                textVerticalAlign: layoutInfo.labelBaseline\n            });\n\n            group.add(textEl);\n            graphic.setHoverStyle(\n                textEl, graphic.setTextStyle({}, hoverLabelModel)\n            );\n\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _renderControl: function (layoutInfo, group, axis, timelineModel) {\n        var controlSize = layoutInfo.controlSize;\n        var rotation = layoutInfo.rotation;\n\n        var itemStyle = timelineModel.getModel('controlStyle').getItemStyle();\n        var hoverStyle = timelineModel.getModel('emphasis.controlStyle').getItemStyle();\n        var rect = [0, -controlSize / 2, controlSize, controlSize];\n        var playState = timelineModel.getPlayState();\n        var inverse = timelineModel.get('inverse', true);\n\n        makeBtn(\n            layoutInfo.nextBtnPosition,\n            'controlStyle.nextIcon',\n            bind(this._changeTimeline, this, inverse ? '-' : '+')\n        );\n        makeBtn(\n            layoutInfo.prevBtnPosition,\n            'controlStyle.prevIcon',\n            bind(this._changeTimeline, this, inverse ? '+' : '-')\n        );\n        makeBtn(\n            layoutInfo.playPosition,\n            'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'),\n            bind(this._handlePlayClick, this, !playState),\n            true\n        );\n\n        function makeBtn(position, iconPath, onclick, willRotate) {\n            if (!position) {\n                return;\n            }\n            var opt = {\n                position: position,\n                origin: [controlSize / 2, 0],\n                rotation: willRotate ? -rotation : 0,\n                rectHover: true,\n                style: itemStyle,\n                onclick: onclick\n            };\n            var btn = makeIcon(timelineModel, iconPath, rect, opt);\n            group.add(btn);\n            graphic.setHoverStyle(btn, hoverStyle);\n        }\n    },\n\n    _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\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, currentIndex, axis, timelineModel, true);\n            },\n            onUpdate: function (pointer) {\n                pointerMoveTo(pointer, currentIndex, axis, timelineModel);\n            }\n        };\n\n        // Reuse when exists, for animation and drag.\n        this._currentPointer = giveSymbol(\n            pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback\n        );\n    },\n\n    _handlePlayClick: function (nextState) {\n        this._clearTimer();\n        this.api.dispatchAction({\n            type: 'timelinePlayChange',\n            playState: nextState,\n            from: this.uid\n        });\n    },\n\n    _handlePointerDrag: function (dx, dy, e) {\n        this._clearTimer();\n        this._pointerChangeTimeline([e.offsetX, e.offsetY]);\n    },\n\n    _handlePointerDragend: function (e) {\n        this._pointerChangeTimeline([e.offsetX, e.offsetY], true);\n    },\n\n    _pointerChangeTimeline: function (mousePos, trigger) {\n        var toCoord = this._toAxisCoord(mousePos)[0];\n\n        var axis = this._axis;\n        var axisExtent = numberUtil.asc(axis.getExtent().slice());\n\n        toCoord > axisExtent[1] && (toCoord = axisExtent[1]);\n        toCoord < axisExtent[0] && (toCoord = axisExtent[0]);\n\n        this._currentPointer.position[0] = toCoord;\n        this._currentPointer.dirty();\n\n        var targetDataIndex = this._findNearestTick(toCoord);\n        var timelineModel = this.model;\n\n        if (trigger || (\n            targetDataIndex !== timelineModel.getCurrentIndex()\n            && timelineModel.get('realtime')\n        )) {\n            this._changeTimeline(targetDataIndex);\n        }\n    },\n\n    _doPlayStop: function () {\n        this._clearTimer();\n\n        if (this.model.getPlayState()) {\n            this._timer = setTimeout(\n                bind(handleFrame, this),\n                this.model.get('playInterval')\n            );\n        }\n\n        function handleFrame() {\n            // Do not cache\n            var timelineModel = this.model;\n            this._changeTimeline(\n                timelineModel.getCurrentIndex()\n                + (timelineModel.get('rewind', true) ? -1 : 1)\n            );\n        }\n    },\n\n    _toAxisCoord: function (vertex) {\n        var trans = this._mainGroup.getLocalTransform();\n        return graphic.applyTransform(vertex, trans, true);\n    },\n\n    _findNearestTick: function (axisCoord) {\n        var data = this.model.getData();\n        var dist = Infinity;\n        var targetDataIndex;\n        var axis = this._axis;\n\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\n        return targetDataIndex;\n    },\n\n    _clearTimer: function () {\n        if (this._timer) {\n            clearTimeout(this._timer);\n            this._timer = null;\n        }\n    },\n\n    _changeTimeline: function (nextIndex) {\n        var currentIndex = this.model.getCurrentIndex();\n\n        if (nextIndex === '+') {\n            nextIndex = currentIndex + 1;\n        }\n        else if (nextIndex === '-') {\n            nextIndex = currentIndex - 1;\n        }\n\n        this.api.dispatchAction({\n            type: 'timelineChange',\n            currentIndex: nextIndex,\n            from: this.uid\n        });\n    }\n\n});\n\nfunction getViewRect(model, api) {\n    return layout.getLayoutRect(\n        model.getBoxLayoutParams(),\n        {\n            width: api.getWidth(),\n            height: api.getHeight()\n        },\n        model.get('padding')\n    );\n}\n\nfunction makeIcon(timelineModel, objPath, rect, opts) {\n    var icon = graphic.makePath(\n        timelineModel.get(objPath).replace(/^path:\\/\\//, ''),\n        zrUtil.clone(opts || {}),\n        new BoundingRect(rect[0], rect[1], rect[2], rect[3]),\n        'center'\n    );\n\n    return icon;\n}\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\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    }\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\n    // Style\n    var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);\n    symbol.setStyle(itemStyle);\n\n    // Transform and events.\n    opt = zrUtil.merge({\n        rectHover: true,\n        z2: 100\n    }, opt, true);\n\n    var symbolSize = hostModel.get('symbolSize');\n    symbolSize = symbolSize instanceof Array\n        ? symbolSize.slice()\n        : [+symbolSize, +symbolSize];\n    symbolSize[0] /= 2;\n    symbolSize[1] /= 2;\n    opt.scale = symbolSize;\n\n    var symbolOffset = hostModel.get('symbolOffset');\n    if (symbolOffset) {\n        var pos = opt.position = opt.position || [0, 0];\n        pos[0] += numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);\n        pos[1] += numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);\n    }\n\n    var symbolRotate = hostModel.get('symbolRotate');\n    opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n\n    symbol.attr(opt);\n\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\n    return symbol;\n}\n\nfunction pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) {\n    if (pointer.dragging) {\n        return;\n    }\n\n    var pointerModel = timelineModel.getModel('checkpointStyle');\n    var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex));\n\n    if (noAnimation || !pointerModel.get('animation', true)) {\n        pointer.attr({position: [toCoord, 0]});\n    }\n    else {\n        pointer.stopAnimation(true);\n        pointer.animateTo(\n            {position: [toCoord, 0]},\n            pointerModel.get('animationDuration', true),\n            pointerModel.get('animationEasing', 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 * DataZoom component entry\n */\n\nimport * as echarts from '../echarts';\nimport preprocessor from './timeline/preprocessor';\n\nimport './timeline/typeDefaulter';\nimport './timeline/timelineAction';\nimport './timeline/SliderTimelineModel';\nimport './timeline/SliderTimelineView';\n\necharts.registerPreprocessor(preprocessor);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport * as modelUtil from '../../util/model';\nimport * as formatUtil from '../../util/format';\nimport dataFormatMixin from '../../model/mixin/dataFormat';\n\nvar addCommas = formatUtil.addCommas;\nvar encodeHTML = formatUtil.encodeHTML;\n\nfunction fillLabel(opt) {\n    modelUtil.defaultEmphasis(opt, 'label', ['show']);\n}\nvar MarkerModel = echarts.extendComponentModel({\n\n    type: 'marker',\n\n    dependencies: ['series', 'grid', 'polar', 'geo'],\n\n    /**\n     * @overrite\n     */\n    init: function (option, parentModel, ecModel, extraOpt) {\n\n        if (__DEV__) {\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, extraOpt.createdBySelf, true);\n    },\n\n    /**\n     * @return {boolean}\n     */\n    isAnimationEnabled: function () {\n        if (env.node) {\n            return false;\n        }\n\n        var hostSeries = this.__hostSeries;\n        return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();\n    },\n\n    mergeOption: function (newOpt, ecModel, createdBySelf, isInit) {\n        var MarkerModel = this.constructor;\n        var modelPropName = this.mainType + 'Model';\n        if (!createdBySelf) {\n            ecModel.eachSeries(function (seriesModel) {\n\n                var markerOpt = seriesModel.get(this.mainType, true);\n\n                var markerModel = seriesModel[modelPropName];\n                if (!markerOpt || !markerOpt.data) {\n                    seriesModel[modelPropName] = 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                        }\n                        else {\n                            fillLabel(item);\n                        }\n                    });\n\n                    markerModel = new MarkerModel(\n                        markerOpt, this, ecModel\n                    );\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\n                    markerModel.__hostSeries = seriesModel;\n                }\n                else {\n                    markerModel.mergeOption(markerOpt, ecModel, true);\n                }\n                seriesModel[modelPropName] = markerModel;\n            }, this);\n        }\n    },\n\n    formatTooltip: function (dataIndex) {\n        var data = this.getData();\n        var value = this.getRawValue(dataIndex);\n        var formattedValue = zrUtil.isArray(value)\n            ? zrUtil.map(value, addCommas).join(', ') : addCommas(value);\n        var name = data.getName(dataIndex);\n        var html = encodeHTML(this.name);\n        if (value != null || name) {\n            html += '<br />';\n        }\n        if (name) {\n            html += encodeHTML(name);\n            if (value != null) {\n                html += ' : ';\n            }\n        }\n        if (value != null) {\n            html += encodeHTML(formattedValue);\n        }\n        return html;\n    },\n\n    getData: function () {\n        return this._data;\n    },\n\n    setData: function (data) {\n        this._data = data;\n    }\n});\n\nzrUtil.mixin(MarkerModel, dataFormatMixin);\n\nexport default MarkerModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport MarkerModel from './MarkerModel';\n\nexport default MarkerModel.extend({\n\n    type: 'markPoint',\n\n    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});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as numberUtil from '../../util/number';\nimport {isDimensionStacked} from '../../data/helper/dataStackHelper';\n\nvar indexOf = zrUtil.indexOf;\n\nfunction hasXOrY(item) {\n    return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y)));\n}\n\nfunction hasXAndY(item) {\n    return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y));\n}\n\n// Make it simple, do not visit all stacked value to count precision.\n// function getPrecision(data, valueAxisDim, dataIndex) {\n//     var precision = -1;\n//     var stackedDim = data.mapDimension(valueAxisDim);\n//     do {\n//         precision = Math.max(\n//             numberUtil.getPrecision(data.get(stackedDim, dataIndex)),\n//             precision\n//         );\n//         var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');\n//         if (stackedOnSeries) {\n//             var byValue = data.get(data.getCalculationInfo('stackedByDimension'), dataIndex);\n//             data = stackedOnSeries.getData();\n//             dataIndex = data.indexOf(data.getCalculationInfo('stackedByDimension'), byValue);\n//             stackedDim = data.getCalculationInfo('stackedDimension');\n//         }\n//         else {\n//             data = null;\n//         }\n//     } while (data);\n\n//     return precision;\n// }\n\nfunction markerTypeCalculatorWithExtent(\n    mlType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex\n) {\n    var coordArr = [];\n\n    var stacked = isDimensionStacked(data, targetDataDim /*, otherDataDim*/);\n    var calcDataDim = stacked\n        ? data.getCalculationInfo('stackResultDimension')\n        : targetDataDim;\n\n    var value = numCalculate(data, calcDataDim, mlType);\n\n    var dataIndex = data.indicesOfNearest(calcDataDim, value)[0];\n    coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex);\n    coordArr[targetCoordIndex] = data.get(targetDataDim, dataIndex);\n\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\n    return coordArr;\n}\n\nvar curry = zrUtil.curry;\n// TODO Specified percent\nvar markerTypeCalculator = {\n    /**\n     * @method\n     * @param {module:echarts/data/List} data\n     * @param {string} baseAxisDim\n     * @param {string} valueAxisDim\n     */\n    min: curry(markerTypeCalculatorWithExtent, 'min'),\n    /**\n     * @method\n     * @param {module:echarts/data/List} data\n     * @param {string} baseAxisDim\n     * @param {string} valueAxisDim\n     */\n    max: curry(markerTypeCalculatorWithExtent, 'max'),\n\n    /**\n     * @method\n     * @param {module:echarts/data/List} data\n     * @param {string} baseAxisDim\n     * @param {string} valueAxisDim\n     */\n    average: curry(markerTypeCalculatorWithExtent, 'average')\n};\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 * @param  {module:echarts/model/Series} seriesModel\n * @param  {module:echarts/coord/*} [coordSys]\n * @param  {Object} item\n * @return {Object}\n */\nexport function dataTransform(seriesModel, item) {\n    var data = seriesModel.getData();\n    var coordSys = seriesModel.coordinateSystem;\n\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\n    // parseFloat first because item.x and item.y can be percent string like '20%'\n    if (item && !hasXAndY(item) && !zrUtil.isArray(item.coord) && coordSys) {\n        var dims = coordSys.dimensions;\n        var axisInfo = getAxisInfo(item, data, coordSys, seriesModel);\n\n        // Clone the option\n        // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value\n        item = zrUtil.clone(item);\n\n        if (item.type\n            && markerTypeCalculator[item.type]\n            && axisInfo.baseAxis && axisInfo.valueAxis\n        ) {\n            var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim);\n            var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim);\n\n            item.coord = markerTypeCalculator[item.type](\n                data, axisInfo.baseDataDim, axisInfo.valueDataDim,\n                otherCoordIndex, targetCoordIndex\n            );\n            // Force to use the value of calculated value.\n            item.value = item.coord[targetCoordIndex];\n        }\n        else {\n            // FIXME Only has one of xAxis and yAxis.\n            var coord = [\n                item.xAxis != null ? item.xAxis : item.radiusAxis,\n                item.yAxis != null ? item.yAxis : item.angleAxis\n            ];\n            // Each coord support max, min, average\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            item.coord = coord;\n        }\n    }\n    return item;\n}\n\nexport function getAxisInfo(item, data, coordSys, seriesModel) {\n    var ret = {};\n\n    if (item.valueIndex != null || item.valueDim != null) {\n        ret.valueDataDim = item.valueIndex != null\n            ? 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    }\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\n    return ret;\n}\n\nfunction dataDimToCoordDim(seriesModel, dataDim) {\n    var data = seriesModel.getData();\n    var dimensions = data.dimensions;\n    dataDim = data.getDimension(dataDim);\n    for (var i = 0; i < dimensions.length; i++) {\n        var dimItem = data.getDimensionInfo(dimensions[i]);\n        if (dimItem.name === dataDim) {\n            return dimItem.coordDim;\n        }\n    }\n}\n\n/**\n * Filter data which is out of coordinateSystem range\n * [dataFilter description]\n * @param  {module:echarts/coord/*} [coordSys]\n * @param  {Object} item\n * @return {boolean}\n */\nexport function dataFilter(coordSys, item) {\n    // Alwalys return true if there is no coordSys\n    return (coordSys && coordSys.containData && item.coord && !hasXOrY(item))\n        ? coordSys.containData(item.coord) : true;\n}\n\nexport function dimValueGetter(item, dimName, dataIndex, dimIndex) {\n    // x, y, radius, angle\n    if (dimIndex < 2) {\n        return item.coord && item.coord[dimIndex];\n    }\n    return item.value;\n}\n\nexport function numCalculate(data, valueDataDim, type) {\n    if (type === 'average') {\n        var sum = 0;\n        var count = 0;\n        data.each(valueDataDim, function (val, idx) {\n            if (!isNaN(val)) {\n                sum += val;\n                count++;\n            }\n        });\n        return sum / count;\n    }\n    else if (type === 'median') {\n        return data.getMedian(valueDataDim);\n    }\n    else {\n        // max & min\n        return data.getDataExtent(valueDataDim, true)[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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nexport default echarts.extendComponentView({\n\n    type: 'marker',\n\n    init: function () {\n        /**\n         * Markline grouped by series\n         * @private\n         * @type {module:zrender/core/util.HashMap}\n         */\n        this.markerGroupMap = zrUtil.createHashMap();\n    },\n\n    render: function (markerModel, ecModel, api) {\n        var markerGroupMap = this.markerGroupMap;\n        markerGroupMap.each(function (item) {\n            item.__keep = false;\n        });\n\n        var markerModelKey = this.type + 'Model';\n        ecModel.eachSeries(function (seriesModel) {\n            var markerModel = seriesModel[markerModelKey];\n            markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api);\n        }, this);\n\n        markerGroupMap.each(function (item) {\n            !item.__keep && this.group.remove(item.group);\n        }, this);\n    },\n\n    renderSeries: function () {}\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport SymbolDraw from '../../chart/helper/SymbolDraw';\nimport * as numberUtil from '../../util/number';\nimport List from '../../data/List';\nimport * as markerHelper from './markerHelper';\nimport MarkerView from './MarkerView';\n\nfunction updateMarkerLayout(mpData, seriesModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    mpData.each(function (idx) {\n        var itemModel = mpData.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        }\n        // Chart like bar may have there own marker positioning logic\n        else if (seriesModel.getMarkerPosition) {\n            // Use the getMarkerPoisition\n            point = seriesModel.getMarkerPosition(\n                mpData.getValues(mpData.dimensions, idx)\n            );\n        }\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        }\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        mpData.setItemLayout(idx, point);\n    });\n}\n\nexport default MarkerView.extend({\n\n    type: 'markPoint',\n\n    // updateLayout: function (markPointModel, ecModel, api) {\n    //     ecModel.eachSeries(function (seriesModel) {\n    //         var mpModel = seriesModel.markPointModel;\n    //         if (mpModel) {\n    //             updateMarkerLayout(mpModel.getData(), seriesModel, api);\n    //             this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel);\n    //         }\n    //     }, this);\n    // },\n\n    updateTransform: function (markPointModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n            var mpModel = seriesModel.markPointModel;\n            if (mpModel) {\n                updateMarkerLayout(mpModel.getData(), seriesModel, api);\n                this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel);\n            }\n        }, this);\n    },\n\n    renderSeries: function (seriesModel, mpModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n\n        var symbolDrawMap = this.markerGroupMap;\n        var symbolDraw = symbolDrawMap.get(seriesId)\n            || symbolDrawMap.set(seriesId, new SymbolDraw());\n\n        var mpData = createList(coordSys, seriesModel, mpModel);\n\n        // FIXME\n        mpModel.setData(mpData);\n\n        updateMarkerLayout(mpModel.getData(), seriesModel, api);\n\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 isFnSymbol = zrUtil.isFunction(symbol);\n            var isFnSymbolSize = zrUtil.isFunction(symbolSize);\n\n            if (isFnSymbol || isFnSymbolSize) {\n                var rawIdx = mpModel.getRawValue(idx);\n                var dataParams = mpModel.getDataParams(idx);\n                if (isFnSymbol) {\n                    symbol = symbol(rawIdx, dataParams);\n                }\n                if (isFnSymbolSize) {\n                    // FIXME 这里不兼容 ECharts 2.x，2.x 貌似参数是整个数据？\n                    symbolSize = symbolSize(rawIdx, dataParams);\n                }\n            }\n\n            mpData.setItemVisual(idx, {\n                symbol: symbol,\n                symbolSize: symbolSize,\n                color: itemModel.get('itemStyle.color')\n                    || seriesData.getVisual('color')\n            });\n        });\n\n        // TODO Text are wrong\n        symbolDraw.updateData(mpData);\n        this.group.add(symbolDraw.group);\n\n        // Set host model for tooltip\n        // FIXME\n        mpData.eachItemGraphicEl(function (el) {\n            el.traverse(function (child) {\n                child.dataModel = mpModel;\n            });\n        });\n\n        symbolDraw.__keep = true;\n\n        symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');\n    }\n});\n\n/**\n * @inner\n * @param {module:echarts/coord/*} [coordSys]\n * @param {module:echarts/model/Series} seriesModel\n * @param {module:echarts/model/Model} mpModel\n */\nfunction createList(coordSys, seriesModel, mpModel) {\n    var coordDimsInfos;\n    if (coordSys) {\n        coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n            var info = seriesModel.getData().getDimensionInfo(\n                seriesModel.getData().mapDimension(coordDim)\n            ) || {};\n            // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n            return zrUtil.defaults({name: coordDim}, info);\n        });\n    }\n    else {\n        coordDimsInfos = [{\n            name: 'value',\n            type: 'float'\n        }];\n    }\n\n    var mpData = new List(coordDimsInfos, mpModel);\n    var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry(\n            markerHelper.dataTransform, seriesModel\n        ));\n    if (coordSys) {\n        dataOpt = zrUtil.filter(\n            dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys)\n        );\n    }\n\n    mpData.initData(dataOpt, null,\n        coordSys ? markerHelper.dimValueGetter : function (item) {\n            return item.value;\n        }\n    );\n\n    return mpData;\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n// HINT Markpoint can't be used too much\nimport * as echarts from '../echarts';\n\nimport './marker/MarkPointModel';\nimport './marker/MarkPointView';\n\necharts.registerPreprocessor(function (opt) {\n    // Make sure markPoint component is enabled\n    opt.markPoint = opt.markPoint || {};\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport MarkerModel from './MarkerModel';\n\nexport default MarkerModel.extend({\n\n    type: 'markLine',\n\n    defaultOption: {\n        zlevel: 0,\n        z: 5,\n\n        symbol: ['circle', 'arrow'],\n        symbolSize: [8, 16],\n\n        //symbolRotate: 0,\n\n        precision: 2,\n        tooltip: {\n            trigger: 'item'\n        },\n        label: {\n            show: true,\n            position: 'end'\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});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport List from '../../data/List';\nimport * as numberUtil from '../../util/number';\nimport * as markerHelper from './markerHelper';\nimport LineDraw from '../../chart/helper/LineDraw';\nimport MarkerView from './MarkerView';\nimport {getStackedDimension} from '../../data/helper/dataStackHelper';\n\nvar markLineTransform = function (seriesModel, coordSys, mlModel, item) {\n    var data = seriesModel.getData();\n    // Special type markLine like 'min', 'max', 'average', 'median'\n    var mlType = item.type;\n\n    if (!zrUtil.isArray(item)\n        && (\n            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        )\n    ) {\n        var valueAxis;\n        var value;\n\n        if (item.yAxis != null || item.xAxis != null) {\n            valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x');\n            value = zrUtil.retrieve(item.yAxis, item.xAxis);\n        }\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\n        var mlFrom = zrUtil.clone(item);\n        var mlTo = {};\n\n        mlFrom.type = null;\n\n        mlFrom.coord = [];\n        mlTo.coord = [];\n        mlFrom.coord[baseIndex] = -Infinity;\n        mlTo.coord[baseIndex] = Infinity;\n\n        var precision = mlModel.get('precision');\n        if (precision >= 0 && typeof value === 'number') {\n            value = +value.toFixed(Math.min(precision, 20));\n        }\n\n        mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;\n\n        item = [mlFrom, mlTo, { // Extra option for tooltip and label\n            type: mlType,\n            valueIndex: item.valueIndex,\n            // Force to use the value of calculated value.\n            value: value\n        }];\n    }\n\n    item = [\n        markerHelper.dataTransform(seriesModel, item[0]),\n        markerHelper.dataTransform(seriesModel, item[1]),\n        zrUtil.extend({}, item[2])\n    ];\n\n    // Avoid line data type is extended by from(to) data type\n    item[2].type = item[2].type || '';\n\n    // Merge from option and to option into line option\n    zrUtil.merge(item[2], item[0]);\n    zrUtil.merge(item[2], item[1]);\n\n    return item;\n};\n\nfunction isInifinity(val) {\n    return !isNaN(val) && !isFinite(val);\n}\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 isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex])\n        && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);\n}\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 (\n            fromCoord && toCoord\n            && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)\n            || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))\n        ) {\n            return true;\n        }\n    }\n    return markerHelper.dataFilter(coordSys, item[0])\n        && markerHelper.dataFilter(coordSys, item[1]);\n}\n\nfunction updateSingleMarkerEndLayout(\n    data, idx, isFrom, seriesModel, api\n) {\n    var coordSys = seriesModel.coordinateSystem;\n    var itemModel = data.getItemModel(idx);\n\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    }\n    else {\n        // Chart like bar may have there own marker positioning logic\n        if (seriesModel.getMarkerPosition) {\n            // Use the getMarkerPoisition\n            point = seriesModel.getMarkerPosition(\n                data.getValues(data.dimensions, idx)\n            );\n        }\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 (coordSys.type === 'cartesian2d') {\n            var xAxis = coordSys.getAxis('x');\n            var yAxis = coordSys.getAxis('y');\n            var dims = coordSys.dimensions;\n            if (isInifinity(data.get(dims[0], idx))) {\n                point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);\n            }\n            else if (isInifinity(data.get(dims[1], idx))) {\n                point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);\n            }\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\n    data.setItemLayout(idx, point);\n}\n\nexport default MarkerView.extend({\n\n    type: 'markLine',\n\n    // updateLayout: function (markLineModel, ecModel, api) {\n    //     ecModel.eachSeries(function (seriesModel) {\n    //         var mlModel = seriesModel.markLineModel;\n    //         if (mlModel) {\n    //             var mlData = mlModel.getData();\n    //             var fromData = mlModel.__from;\n    //             var toData = mlModel.__to;\n    //             // Update visual and layout of from symbol and to symbol\n    //             fromData.each(function (idx) {\n    //                 updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);\n    //                 updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);\n    //             });\n    //             // Update layout of line\n    //             mlData.each(function (idx) {\n    //                 mlData.setItemLayout(idx, [\n    //                     fromData.getItemLayout(idx),\n    //                     toData.getItemLayout(idx)\n    //                 ]);\n    //             });\n\n    //             this.markerGroupMap.get(seriesModel.id).updateLayout();\n\n    //         }\n    //     }, this);\n    // },\n\n    updateTransform: function (markLineModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n            var mlModel = seriesModel.markLineModel;\n            if (mlModel) {\n                var mlData = mlModel.getData();\n                var fromData = mlModel.__from;\n                var toData = mlModel.__to;\n                // Update visual and layout of from symbol and to symbol\n                fromData.each(function (idx) {\n                    updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);\n                    updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);\n                });\n                // Update layout of line\n                mlData.each(function (idx) {\n                    mlData.setItemLayout(idx, [\n                        fromData.getItemLayout(idx),\n                        toData.getItemLayout(idx)\n                    ]);\n                });\n\n                this.markerGroupMap.get(seriesModel.id).updateLayout();\n\n            }\n        }, this);\n    },\n\n    renderSeries: function (seriesModel, mlModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n\n        var lineDrawMap = this.markerGroupMap;\n        var lineDraw = lineDrawMap.get(seriesId)\n            || lineDrawMap.set(seriesId, new LineDraw());\n        this.group.add(lineDraw.group);\n\n        var mlData = createList(coordSys, seriesModel, mlModel);\n\n        var fromData = mlData.from;\n        var toData = mlData.to;\n        var lineData = mlData.line;\n\n        mlModel.__from = fromData;\n        mlModel.__to = toData;\n        // Line data for tooltip and formatter\n        mlModel.setData(lineData);\n\n        var symbolType = mlModel.get('symbol');\n        var symbolSize = mlModel.get('symbolSize');\n        if (!zrUtil.isArray(symbolType)) {\n            symbolType = [symbolType, symbolType];\n        }\n        if (typeof symbolSize === 'number') {\n            symbolSize = [symbolSize, symbolSize];\n        }\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\n        // Update visual and layout of line\n        lineData.each(function (idx) {\n            var lineColor = lineData.getItemModel(idx).get('lineStyle.color');\n            lineData.setItemVisual(idx, {\n                color: lineColor || fromData.getItemVisual(idx, 'color')\n            });\n            lineData.setItemLayout(idx, [\n                fromData.getItemLayout(idx),\n                toData.getItemLayout(idx)\n            ]);\n\n            lineData.setItemVisual(idx, {\n                'fromSymbolSize': fromData.getItemVisual(idx, 'symbolSize'),\n                'fromSymbol': fromData.getItemVisual(idx, 'symbol'),\n                'toSymbolSize': toData.getItemVisual(idx, 'symbolSize'),\n                'toSymbol': toData.getItemVisual(idx, 'symbol')\n            });\n        });\n\n        lineDraw.updateData(lineData);\n\n        // Set host model for tooltip\n        // FIXME\n        mlData.line.eachItemGraphicEl(function (el, idx) {\n            el.traverse(function (child) {\n                child.dataModel = mlModel;\n            });\n        });\n\n        function updateDataVisualAndLayout(data, idx, isFrom) {\n            var itemModel = data.getItemModel(idx);\n\n            updateSingleMarkerEndLayout(\n                data, idx, isFrom, seriesModel, api\n            );\n\n            data.setItemVisual(idx, {\n                symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1],\n                symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1],\n                color: itemModel.get('itemStyle.color') || seriesData.getVisual('color')\n            });\n        }\n\n        lineDraw.__keep = true;\n\n        lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');\n    }\n});\n\n/**\n * @inner\n * @param {module:echarts/coord/*} coordSys\n * @param {module:echarts/model/Series} seriesModel\n * @param {module:echarts/model/Model} mpModel\n */\nfunction createList(coordSys, seriesModel, mlModel) {\n\n    var coordDimsInfos;\n    if (coordSys) {\n        coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n            var info = seriesModel.getData().getDimensionInfo(\n                seriesModel.getData().mapDimension(coordDim)\n            ) || {};\n            // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n            return zrUtil.defaults({name: coordDim}, info);\n        });\n    }\n    else {\n        coordDimsInfos = [{\n            name: 'value',\n            type: 'float'\n        }];\n    }\n\n    var fromData = new List(coordDimsInfos, mlModel);\n    var toData = new List(coordDimsInfos, mlModel);\n    // No dimensions\n    var lineData = new List([], mlModel);\n\n    var optData = zrUtil.map(mlModel.get('data'), zrUtil.curry(\n        markLineTransform, seriesModel, coordSys, mlModel\n    ));\n    if (coordSys) {\n        optData = zrUtil.filter(\n            optData, zrUtil.curry(markLineFilter, coordSys)\n        );\n    }\n    var dimValueGetter = coordSys ? markerHelper.dimValueGetter : function (item) {\n        return item.value;\n    };\n    fromData.initData(\n        zrUtil.map(optData, function (item) {\n            return item[0];\n        }),\n        null,\n        dimValueGetter\n    );\n    toData.initData(\n        zrUtil.map(optData, function (item) {\n            return item[1];\n        }),\n        null,\n        dimValueGetter\n    );\n    lineData.initData(\n        zrUtil.map(optData, function (item) {\n            return item[2];\n        })\n    );\n    lineData.hasItemOption = true;\n\n    return {\n        from: fromData,\n        to: toData,\n        line: lineData\n    };\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './marker/MarkLineModel';\nimport './marker/MarkLineView';\n\necharts.registerPreprocessor(function (opt) {\n    // Make sure markLine component is enabled\n    opt.markLine = opt.markLine || {};\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport MarkerModel from './MarkerModel';\n\nexport default MarkerModel.extend({\n\n    type: 'markArea',\n\n    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\n        emphasis: {\n            label: {\n                show: true,\n                position: 'top'\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// TODO Better on polar\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as colorUtil from 'zrender/src/tool/color';\nimport List from '../../data/List';\nimport * as numberUtil from '../../util/number';\nimport * as graphic from '../../util/graphic';\nimport * as markerHelper from './markerHelper';\nimport MarkerView from './MarkerView';\n\n\nvar markAreaTransform = function (seriesModel, coordSys, maModel, item) {\n    var lt = markerHelper.dataTransform(seriesModel, item[0]);\n    var rb = markerHelper.dataTransform(seriesModel, item[1]);\n    var retrieve = zrUtil.retrieve;\n\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\n    rbCoord[0] = retrieve(rbCoord[0], Infinity);\n    rbCoord[1] = retrieve(rbCoord[1], Infinity);\n\n    // Merge option into one\n    var result = zrUtil.mergeAll([{}, lt, rb]);\n\n    result.coord = [\n        lt.coord, rb.coord\n    ];\n    result.x0 = lt.x;\n    result.y0 = lt.y;\n    result.x1 = rb.x;\n    result.y1 = rb.y;\n    return result;\n};\n\nfunction isInifinity(val) {\n    return !isNaN(val) && !isFinite(val);\n}\n\n// If a markArea has one dim\nfunction ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n    var otherDimIndex = 1 - dimIndex;\n    return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]);\n}\n\nfunction markAreaFilter(coordSys, item) {\n    var fromCoord = item.coord[0];\n    var toCoord = item.coord[1];\n    if (coordSys.type === 'cartesian2d') {\n        // In case\n        // {\n        //  markArea: {\n        //    data: [{ yAxis: 2 }]\n        //  }\n        // }\n        if (\n            fromCoord && toCoord\n            && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)\n            || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))\n        ) {\n            return true;\n        }\n    }\n    return markerHelper.dataFilter(coordSys, {\n            coord: fromCoord,\n            x: item.x0,\n            y: item.y0\n        })\n        || markerHelper.dataFilter(coordSys, {\n            coord: toCoord,\n            x: item.x1,\n            y: item.y1\n        });\n}\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\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    }\n    else {\n        // Chart like bar may have there own marker positioning logic\n        if (seriesModel.getMarkerPosition) {\n            // Use the getMarkerPoisition\n            point = seriesModel.getMarkerPosition(\n                data.getValues(dims, idx)\n            );\n        }\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 (coordSys.type === 'cartesian2d') {\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 (isInifinity(x)) {\n                point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);\n            }\n            else if (isInifinity(y)) {\n                point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);\n            }\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\n    return point;\n}\n\nvar dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];\n\nMarkerView.extend({\n\n    type: 'markArea',\n\n    // updateLayout: function (markAreaModel, ecModel, api) {\n    //     ecModel.eachSeries(function (seriesModel) {\n    //         var maModel = seriesModel.markAreaModel;\n    //         if (maModel) {\n    //             var areaData = maModel.getData();\n    //             areaData.each(function (idx) {\n    //                 var points = zrUtil.map(dimPermutations, function (dim) {\n    //                     return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n    //                 });\n    //                 // Layout\n    //                 areaData.setItemLayout(idx, points);\n    //                 var el = areaData.getItemGraphicEl(idx);\n    //                 el.setShape('points', points);\n    //             });\n    //         }\n    //     }, this);\n    // },\n\n    updateTransform: function (markAreaModel, ecModel, api) {\n        ecModel.eachSeries(function (seriesModel) {\n            var maModel = seriesModel.markAreaModel;\n            if (maModel) {\n                var areaData = maModel.getData();\n                areaData.each(function (idx) {\n                    var points = zrUtil.map(dimPermutations, function (dim) {\n                        return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n                    });\n                    // Layout\n                    areaData.setItemLayout(idx, points);\n                    var el = areaData.getItemGraphicEl(idx);\n                    el.setShape('points', points);\n                });\n            }\n        }, this);\n    },\n\n    renderSeries: function (seriesModel, maModel, ecModel, api) {\n        var coordSys = seriesModel.coordinateSystem;\n        var seriesId = seriesModel.id;\n        var seriesData = seriesModel.getData();\n\n        var areaGroupMap = this.markerGroupMap;\n        var polygonGroup = areaGroupMap.get(seriesId)\n            || areaGroupMap.set(seriesId, {group: new graphic.Group()});\n\n        this.group.add(polygonGroup.group);\n        polygonGroup.__keep = true;\n\n        var areaData = createList(coordSys, seriesModel, maModel);\n\n        // Line data for tooltip and formatter\n        maModel.setData(areaData);\n\n        // Update visual and layout of line\n        areaData.each(function (idx) {\n            // Layout\n            areaData.setItemLayout(idx, zrUtil.map(dimPermutations, function (dim) {\n                return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n            }));\n\n            // Visual\n            areaData.setItemVisual(idx, {\n                color: seriesData.getVisual('color')\n            });\n        });\n\n\n        areaData.diff(polygonGroup.__data)\n            .add(function (idx) {\n                var polygon = new graphic.Polygon({\n                    shape: {\n                        points: areaData.getItemLayout(idx)\n                    }\n                });\n                areaData.setItemGraphicEl(idx, polygon);\n                polygonGroup.group.add(polygon);\n            })\n            .update(function (newIdx, oldIdx) {\n                var polygon = polygonGroup.__data.getItemGraphicEl(oldIdx);\n                graphic.updateProps(polygon, {\n                    shape: {\n                        points: areaData.getItemLayout(newIdx)\n                    }\n                }, maModel, newIdx);\n                polygonGroup.group.add(polygon);\n                areaData.setItemGraphicEl(newIdx, polygon);\n            })\n            .remove(function (idx) {\n                var polygon = polygonGroup.__data.getItemGraphicEl(idx);\n                polygonGroup.group.remove(polygon);\n            })\n            .execute();\n\n        areaData.eachItemGraphicEl(function (polygon, idx) {\n            var itemModel = areaData.getItemModel(idx);\n            var labelModel = itemModel.getModel('label');\n            var labelHoverModel = itemModel.getModel('emphasis.label');\n            var color = areaData.getItemVisual(idx, 'color');\n            polygon.useStyle(\n                zrUtil.defaults(\n                    itemModel.getModel('itemStyle').getItemStyle(),\n                    {\n                        fill: colorUtil.modifyAlpha(color, 0.4),\n                        stroke: color\n                    }\n                )\n            );\n\n            polygon.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();\n\n            graphic.setLabelStyle(\n                polygon.style, polygon.hoverStyle, labelModel, labelHoverModel,\n                {\n                    labelFetcher: maModel,\n                    labelDataIndex: idx,\n                    defaultText: areaData.getName(idx) || '',\n                    isRectText: true,\n                    autoColor: color\n                }\n            );\n\n            graphic.setHoverStyle(polygon, {});\n\n            polygon.dataModel = maModel;\n        });\n\n        polygonGroup.__data = areaData;\n\n        polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');\n    }\n});\n\n/**\n * @inner\n * @param {module:echarts/coord/*} coordSys\n * @param {module:echarts/model/Series} seriesModel\n * @param {module:echarts/model/Model} mpModel\n */\nfunction createList(coordSys, seriesModel, maModel) {\n\n    var coordDimsInfos;\n    var areaData;\n    var dims = ['x0', 'y0', 'x1', 'y1'];\n    if (coordSys) {\n        coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n            var data = seriesModel.getData();\n            var info = data.getDimensionInfo(\n                data.mapDimension(coordDim)\n            ) || {};\n            // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n            return zrUtil.defaults({name: coordDim}, info);\n        });\n        areaData = new List(zrUtil.map(dims, function (dim, idx) {\n            return {\n                name: dim,\n                type: coordDimsInfos[idx % 2].type\n            };\n        }), maModel);\n    }\n    else {\n        coordDimsInfos = [{\n            name: 'value',\n            type: 'float'\n        }];\n        areaData = new List(coordDimsInfos, maModel);\n    }\n\n    var optData = zrUtil.map(maModel.get('data'), zrUtil.curry(\n        markAreaTransform, seriesModel, coordSys, maModel\n    ));\n    if (coordSys) {\n        optData = zrUtil.filter(\n            optData, zrUtil.curry(markAreaFilter, coordSys)\n        );\n    }\n\n    var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) {\n        return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];\n    } : function (item) {\n        return item.value;\n    };\n    areaData.initData(optData, null, dimValueGetter);\n    areaData.hasItemOption = true;\n    return areaData;\n}","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../echarts';\n\nimport './marker/MarkAreaModel';\nimport './marker/MarkAreaView';\n\necharts.registerPreprocessor(function (opt) {\n    // Make sure markArea component is enabled\n    opt.markArea = opt.markArea || {};\n});","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport Model from '../../model/Model';\nimport {isNameSpecified} from '../../util/model';\n\nvar LegendModel = echarts.extendComponentModel({\n\n    type: 'legend.plain',\n\n    dependencies: ['series'],\n\n    layoutMode: {\n        type: 'box',\n        // legend.width/height are maxWidth/maxHeight actually,\n        // whereas realy 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\n    init: function (option, parentModel, ecModel) {\n        this.mergeDefaultAndTheme(option, ecModel);\n\n        option.selected = option.selected || {};\n    },\n\n    mergeOption: function (option) {\n        LegendModel.superCall(this, 'mergeOption', option);\n    },\n\n    optionUpdated: function () {\n        this._updateData(this.ecModel);\n\n        var legendData = this._data;\n\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 = legendData[i].get('name');\n                if (this.isSelected(name)) {\n                    // Force to unselect others\n                    this.select(name);\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\n    _updateData: function (ecModel) {\n        var potentialData = [];\n        var availableNames = [];\n\n        ecModel.eachRawSeries(function (seriesModel) {\n            var seriesName = seriesModel.name;\n            availableNames.push(seriesName);\n            var isPotential;\n\n            if (seriesModel.legendDataProvider) {\n                var data = seriesModel.legendDataProvider();\n                var names = data.mapArray(data.getName);\n\n                if (!ecModel.isSeriesFiltered(seriesModel)) {\n                    availableNames = availableNames.concat(names);\n                }\n\n                if (names.length) {\n                    potentialData = potentialData.concat(names);\n                }\n                else {\n                    isPotential = true;\n                }\n            }\n            else {\n                isPotential = true;\n            }\n\n            if (isPotential && isNameSpecified(seriesModel)) {\n                potentialData.push(seriesModel.name);\n            }\n        });\n\n        /**\n         * @type {Array.<string>}\n         * @private\n         */\n        this._availableNames = availableNames;\n\n        // If legend.data not specified in option, use availableNames as data,\n        // which is convinient for user preparing option.\n        var rawData = this.get('data') || potentialData;\n\n        var legendData = zrUtil.map(rawData, function (dataItem) {\n            // Can be string or number\n            if (typeof dataItem === 'string' || typeof dataItem === 'number') {\n                dataItem = {\n                    name: dataItem\n                };\n            }\n            return new Model(dataItem, this, this.ecModel);\n        }, this);\n\n        /**\n         * @type {Array.<module:echarts/model/Model>}\n         * @private\n         */\n        this._data = legendData;\n    },\n\n    /**\n     * @return {Array.<module:echarts/model/Model>}\n     */\n    getData: function () {\n        return this._data;\n    },\n\n    /**\n     * @param {string} name\n     */\n    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\n    /**\n     * @param {string} name\n     */\n    unSelect: function (name) {\n        if (this.get('selectedMode') !== 'single') {\n            this.option.selected[name] = false;\n        }\n    },\n\n    /**\n     * @param {string} name\n     */\n    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\n    /**\n     * @param {string} name\n     */\n    isSelected: function (name) {\n        var selected = this.option.selected;\n        return !(selected.hasOwnProperty(name) && !selected[name])\n            && zrUtil.indexOf(this._availableNames, name) >= 0;\n    },\n\n    defaultOption: {\n        // 一级层叠\n        zlevel: 0,\n        // 二级层叠\n        z: 4,\n        show: true,\n\n        // 布局方式，默认为水平布局，可选为：\n        // 'horizontal' | 'vertical'\n        orient: 'horizontal',\n\n        left: 'center',\n        // right: 'center',\n\n        top: 0,\n        // bottom: null,\n\n        // 水平对齐\n        // 'auto' | 'left' | 'right'\n        // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐\n        align: 'auto',\n\n        backgroundColor: 'rgba(0,0,0,0)',\n        // 图例边框颜色\n        borderColor: '#ccc',\n        borderRadius: 0,\n        // 图例边框线宽，单位px，默认为0（无边框）\n        borderWidth: 0,\n        // 图例内边距，单位px，默认各方向内边距为5，\n        // 接受数组分别设定上右下左边距，同css\n        padding: 5,\n        // 各个item之间的间隔，单位px，默认为10，\n        // 横向布局时为水平间隔，纵向布局时为纵向间隔\n        itemGap: 10,\n        // 图例图形宽度\n        itemWidth: 25,\n        // 图例图形高度\n        itemHeight: 14,\n\n        // 图例关闭时候的颜色\n        inactiveColor: '#ccc',\n\n        textStyle: {\n            // 图例文字颜色\n            color: '#333'\n        },\n        // formatter: '',\n        // 选择模式，默认开启图例开关\n        selectedMode: true,\n        // 配置默认选中状态，可配合LEGEND.SELECTED事件做动态数据载入\n        // selected: null,\n        // 图例内容（详见legend.data，数组中每一项代表一个item\n        // data: [],\n\n        // Tooltip 相关配置\n        tooltip: {\n            show: false\n        }\n    }\n});\n\nexport default LegendModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\n\nfunction legendSelectActionHandler(methodName, payload, ecModel) {\n    var selectedMap = {};\n    var isToggleSelect = methodName === 'toggleSelected';\n    var isSelected;\n    // Update all legend components\n    ecModel.eachComponent('legend', function (legendModel) {\n        if (isToggleSelect && isSelected != null) {\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'](payload.name);\n        }\n        else {\n            legendModel[methodName](payload.name);\n            isSelected = legendModel.isSelected(payload.name);\n        }\n        var legendData = legendModel.getData();\n        zrUtil.each(legendData, 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 (selectedMap.hasOwnProperty(name)) {\n                // Unselected if any legend is unselected\n                selectedMap[name] = selectedMap[name] && isItemSelected;\n            }\n            else {\n                selectedMap[name] = isItemSelected;\n            }\n        });\n    });\n    // Return the event explicitly\n    return {\n        name: payload.name,\n        selected: selectedMap\n    };\n}\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 */\necharts.registerAction(\n    'legendToggleSelect', 'legendselectchanged',\n    zrUtil.curry(legendSelectActionHandler, 'toggleSelected')\n);\n\n/**\n * @event legendSelect\n * @type {Object}\n * @property {string} type 'legendSelect'\n * @property {string} name Series name or data item name\n */\necharts.registerAction(\n    'legendSelect', 'legendselected',\n    zrUtil.curry(legendSelectActionHandler, 'select')\n);\n\n/**\n * @event legendUnSelect\n * @type {Object}\n * @property {string} type 'legendUnSelect'\n * @property {string} name Series name or data item name\n */\necharts.registerAction(\n    'legendUnSelect', 'legendunselected',\n    zrUtil.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\nimport {__DEV__} from '../../config';\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport {createSymbol} from '../../util/symbol';\nimport * as graphic from '../../util/graphic';\nimport {makeBackground} from '../helper/listComponent';\nimport * as layoutUtil from '../../util/layout';\n\nvar curry = zrUtil.curry;\nvar each = zrUtil.each;\nvar Group = graphic.Group;\n\nexport default echarts.extendComponentView({\n\n    type: 'legend.plain',\n\n    newlineDisabled: false,\n\n    /**\n     * @override\n     */\n    init: function () {\n\n        /**\n         * @private\n         * @type {module:zrender/container/Group}\n         */\n        this.group.add(this._contentGroup = new Group());\n\n        /**\n         * @private\n         * @type {module:zrender/Element}\n         */\n        this._backgroundEl;\n\n        /**\n         * If first rendering, `contentGroup.position` is [0, 0], which\n         * does not make sense and may cause unexepcted animation if adopted.\n         * @private\n         * @type {boolean}\n         */\n        this._isFirstRender = true;\n    },\n\n    /**\n     * @protected\n     */\n    getContentGroup: function () {\n        return this._contentGroup;\n    },\n\n    /**\n     * @override\n     */\n    render: function (legendModel, ecModel, api) {\n        var isFirstRender = this._isFirstRender;\n        this._isFirstRender = false;\n\n        this.resetInner();\n\n        if (!legendModel.get('show', true)) {\n            return;\n        }\n\n        var itemAlign = legendModel.get('align');\n        if (!itemAlign || itemAlign === 'auto') {\n            itemAlign = (\n                legendModel.get('left') === 'right'\n                && legendModel.get('orient') === 'vertical'\n            ) ? 'right' : 'left';\n        }\n\n        this.renderInner(itemAlign, legendModel, ecModel, api);\n\n        // Perform layout.\n        var positionInfo = legendModel.getBoxLayoutParams();\n        var viewportSize = {width: api.getWidth(), height: api.getHeight()};\n        var padding = legendModel.get('padding');\n\n        var maxSize = layoutUtil.getLayoutRect(positionInfo, viewportSize, padding);\n\n        var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender);\n\n        // Place mainGroup, based on the calculated `mainRect`.\n        var layoutRect = layoutUtil.getLayoutRect(\n            zrUtil.defaults({width: mainRect.width, height: mainRect.height}, positionInfo),\n            viewportSize,\n            padding\n        );\n        this.group.attr('position', [layoutRect.x - mainRect.x, layoutRect.y - mainRect.y]);\n\n        // Render background after group is layout.\n        this.group.add(\n            this._backgroundEl = makeBackground(mainRect, legendModel)\n        );\n    },\n\n    /**\n     * @protected\n     */\n    resetInner: function () {\n        this.getContentGroup().removeAll();\n        this._backgroundEl && this.group.remove(this._backgroundEl);\n    },\n\n    /**\n     * @protected\n     */\n    renderInner: function (itemAlign, legendModel, ecModel, api) {\n        var contentGroup = this.getContentGroup();\n        var legendDrawnMap = zrUtil.createHashMap();\n        var selectMode = legendModel.get('selectedMode');\n\n        var excludeSeriesId = [];\n        ecModel.eachRawSeries(function (seriesModel) {\n            !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id);\n        });\n\n        each(legendModel.getData(), function (itemModel, dataIndex) {\n            var name = itemModel.get('name');\n\n            // Use empty string or \\n as a newline string\n            if (!this.newlineDisabled && (name === '' || name === '\\n')) {\n                contentGroup.add(new Group({\n                    newline: true\n                }));\n                return;\n            }\n\n            // Representitive series.\n            var seriesModel = ecModel.getSeriesByName(name)[0];\n\n            if (legendDrawnMap.get(name)) {\n                // Have been drawed\n                return;\n            }\n\n            // Series legend\n            if (seriesModel) {\n                var data = seriesModel.getData();\n                var color = data.getVisual('color');\n\n                // If color is a callback function\n                if (typeof color === 'function') {\n                    // Use the first data\n                    color = color(seriesModel.getDataParams(0));\n                }\n\n                // Using rect symbol defaultly\n                var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect';\n                var symbolType = data.getVisual('symbol');\n\n                var itemGroup = this._createItem(\n                    name, dataIndex, itemModel, legendModel,\n                    legendSymbolType, symbolType,\n                    itemAlign, color,\n                    selectMode\n                );\n\n                itemGroup.on('click', curry(dispatchSelectAction, name, api))\n                    .on('mouseover', curry(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId))\n                    .on('mouseout', curry(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId));\n\n                legendDrawnMap.set(name, true);\n            }\n            else {\n                // Data legend of pie, funnel\n                ecModel.eachRawSeries(function (seriesModel) {\n                    // In case multiple series has same data name\n                    if (legendDrawnMap.get(name)) {\n                        return;\n                    }\n\n                    if (seriesModel.legendDataProvider) {\n                        var data = seriesModel.legendDataProvider();\n                        var idx = data.indexOfName(name);\n                        if (idx < 0) {\n                            return;\n                        }\n\n                        var color = data.getItemVisual(idx, 'color');\n\n                        var legendSymbolType = 'roundRect';\n\n                        var itemGroup = this._createItem(\n                            name, dataIndex, itemModel, legendModel,\n                            legendSymbolType, null,\n                            itemAlign, color,\n                            selectMode\n                        );\n\n                        // FIXME: consider different series has items with the same name.\n                        itemGroup.on('click', curry(dispatchSelectAction, name, api))\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))\n                            .on('mouseout', curry(dispatchDownplayAction, null, name, api, excludeSeriesId));\n\n                        legendDrawnMap.set(name, true);\n                    }\n\n                }, this);\n            }\n\n            if (__DEV__) {\n                if (!legendDrawnMap.get(name)) {\n                    console.warn(\n                        name + ' series not exists. Legend data should be same with series name or data name.'\n                    );\n                }\n            }\n        }, this);\n    },\n\n    _createItem: function (\n        name, dataIndex, itemModel, legendModel,\n        legendSymbolType, symbolType,\n        itemAlign, color, selectMode\n    ) {\n        var itemWidth = legendModel.get('itemWidth');\n        var itemHeight = legendModel.get('itemHeight');\n        var inactiveColor = legendModel.get('inactiveColor');\n        var symbolKeepAspect = legendModel.get('symbolKeepAspect');\n\n        var isSelected = legendModel.isSelected(name);\n        var itemGroup = new Group();\n\n        var textStyleModel = itemModel.getModel('textStyle');\n\n        var itemIcon = itemModel.get('icon');\n\n        var tooltipModel = itemModel.getModel('tooltip');\n        var legendGlobalTooltipModel = tooltipModel.parentModel;\n\n        // Use user given icon first\n        legendSymbolType = itemIcon || legendSymbolType;\n        itemGroup.add(createSymbol(\n            legendSymbolType,\n            0,\n            0,\n            itemWidth,\n            itemHeight,\n            isSelected ? color : inactiveColor,\n            // symbolKeepAspect default true for legend\n            symbolKeepAspect == null ? true : symbolKeepAspect\n        ));\n\n        // Compose symbols\n        // PENDING\n        if (!itemIcon && symbolType\n            // At least show one symbol, can't be all none\n            && ((symbolType !== legendSymbolType) || symbolType === 'none')\n        ) {\n            var size = itemHeight * 0.8;\n            if (symbolType === 'none') {\n                symbolType = 'circle';\n            }\n            // Put symbol in the center\n            itemGroup.add(createSymbol(\n                symbolType,\n                (itemWidth - size) / 2,\n                (itemHeight - size) / 2,\n                size,\n                size,\n                isSelected ? color : inactiveColor,\n                // symbolKeepAspect default true for legend\n                symbolKeepAspect == null ? true : symbolKeepAspect\n            ));\n        }\n\n        var textX = itemAlign === 'left' ? itemWidth + 5 : -5;\n        var textAlign = itemAlign;\n\n        var formatter = legendModel.get('formatter');\n        var content = name;\n        if (typeof formatter === 'string' && formatter) {\n            content = formatter.replace('{name}', name != null ? name : '');\n        }\n        else if (typeof formatter === 'function') {\n            content = formatter(name);\n        }\n\n        itemGroup.add(new graphic.Text({\n            style: graphic.setTextStyle({}, textStyleModel, {\n                text: content,\n                x: textX,\n                y: itemHeight / 2,\n                textFill: isSelected ? textStyleModel.getTextColor() : inactiveColor,\n                textAlign: textAlign,\n                textVerticalAlign: 'middle'\n            })\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            invisible: true,\n            tooltip: tooltipModel.get('show') ? zrUtil.extend({\n                content: name,\n                // Defaul formatter\n                formatter: legendGlobalTooltipModel.get('formatter', true) || function () {\n                    return name;\n                },\n                formatterParams: {\n                    componentType: 'legend',\n                    legendIndex: legendModel.componentIndex,\n                    name: name,\n                    $vars: ['name']\n                }\n            }, tooltipModel.option) : null\n        });\n        itemGroup.add(hitRect);\n\n        itemGroup.eachChild(function (child) {\n            child.silent = true;\n        });\n\n        hitRect.silent = !selectMode;\n\n        this.getContentGroup().add(itemGroup);\n\n        graphic.setHoverStyle(itemGroup);\n\n        itemGroup.__legendDataIndex = dataIndex;\n\n        return itemGroup;\n    },\n\n    /**\n     * @protected\n     */\n    layoutInner: function (legendModel, itemAlign, maxSize) {\n        var contentGroup = this.getContentGroup();\n\n        // Place items in contentGroup.\n        layoutUtil.box(\n            legendModel.get('orient'),\n            contentGroup,\n            legendModel.get('itemGap'),\n            maxSize.width,\n            maxSize.height\n        );\n\n        var contentRect = contentGroup.getBoundingRect();\n        contentGroup.attr('position', [-contentRect.x, -contentRect.y]);\n\n        return this.group.getBoundingRect();\n    },\n\n    /**\n     * @protected\n     */\n    remove: function () {\n        this.getContentGroup().removeAll();\n        this._isFirstRender = true;\n    }\n\n});\n\nfunction dispatchSelectAction(name, api) {\n    api.dispatchAction({\n        type: 'legendToggleSelect',\n        name: name\n    });\n}\n\nfunction dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) {\n    // If element hover will move to a hoverLayer.\n    var el = api.getZr().storage.getDisplayList()[0];\n    if (!(el && el.useHoverLayer)) {\n        api.dispatchAction({\n            type: 'highlight',\n            seriesName: seriesName,\n            name: dataName,\n            excludeSeriesId: excludeSeriesId\n        });\n    }\n}\n\nfunction dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) {\n    // If element hover will move to a hoverLayer.\n    var el = api.getZr().storage.getDisplayList()[0];\n    if (!(el && el.useHoverLayer)) {\n        api.dispatchAction({\n            type: 'downplay',\n            seriesName: seriesName,\n            name: dataName,\n            excludeSeriesId: excludeSeriesId\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\nexport default function (ecModel) {\n\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// Do not contain scrollable legend, for sake of file size.\n\nimport * as echarts from '../echarts';\n\nimport './legend/LegendModel';\nimport './legend/legendAction';\nimport './legend/LegendView';\n\nimport legendFilter from './legend/legendFilter';\nimport Component from '../model/Component';\n\n// Series Filter\necharts.registerProcessor(legendFilter);\n\nComponent.registerSubTypeDefaulter('legend', function () {\n    // Default 'plain' when no type specified.\n    return 'plain';\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport LegendModel from './LegendModel';\nimport {\n    mergeLayoutParam,\n    getLayoutParams\n} from '../../util/layout';\n\nvar ScrollableLegendModel = LegendModel.extend({\n\n    type: 'legend.scroll',\n\n    /**\n     * @param {number} scrollDataIndex\n     */\n    setScrollDataIndex: function (scrollDataIndex) {\n        this.option.scrollDataIndex = scrollDataIndex;\n    },\n\n    defaultOption: {\n        scrollDataIndex: 0,\n        pageButtonItemGap: 5,\n        pageButtonGap: null,\n        pageButtonPosition: 'end', // 'start' or 'end'\n        pageFormatter: '{current}/{total}', // If null/undefined, do not show page.\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: '#2f4554',\n        pageIconInactiveColor: '#aaa',\n        pageIconSize: 15, // Can be [10, 3], which represents [width, height]\n        pageTextStyle: {\n            color: '#333'\n        },\n\n        animationDurationUpdate: 800\n    },\n\n    /**\n     * @override\n     */\n    init: function (option, parentModel, ecModel, extraOpt) {\n        var inputPositionParams = getLayoutParams(option);\n\n        ScrollableLegendModel.superCall(this, 'init', option, parentModel, ecModel, extraOpt);\n\n        mergeAndNormalizeLayoutParams(this, option, inputPositionParams);\n    },\n\n    /**\n     * @override\n     */\n    mergeOption: function (option, extraOpt) {\n        ScrollableLegendModel.superCall(this, 'mergeOption', option, extraOpt);\n\n        mergeAndNormalizeLayoutParams(this, this.option, option);\n    },\n\n    getOrient: function () {\n        return this.get('orient') === 'vertical'\n            ? {index: 1, name: 'vertical'}\n            : {index: 0, name: 'horizontal'};\n    }\n\n});\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', ignoreSize: ignoreSize\n    });\n}\n\nexport default ScrollableLegendModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * Separate legend and scrollable legend to reduce package size.\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport * as layoutUtil from '../../util/layout';\nimport LegendView from './LegendView';\n\nvar Group = graphic.Group;\n\nvar WH = ['width', 'height'];\nvar XY = ['x', 'y'];\n\nvar ScrollableLegendView = LegendView.extend({\n\n    type: 'legend.scroll',\n\n    newlineDisabled: true,\n\n    init: function () {\n\n        ScrollableLegendView.superCall(this, 'init');\n\n        /**\n         * @private\n         * @type {number} For `scroll`.\n         */\n        this._currentIndex = 0;\n\n        /**\n         * @private\n         * @type {module:zrender/container/Group}\n         */\n        this.group.add(this._containerGroup = new Group());\n        this._containerGroup.add(this.getContentGroup());\n\n        /**\n         * @private\n         * @type {module:zrender/container/Group}\n         */\n        this.group.add(this._controllerGroup = new Group());\n\n        /**\n         *\n         * @private\n         */\n        this._showController;\n    },\n\n    /**\n     * @override\n     */\n    resetInner: function () {\n        ScrollableLegendView.superCall(this, 'resetInner');\n\n        this._controllerGroup.removeAll();\n        this._containerGroup.removeClipPath();\n        this._containerGroup.__rectSize = null;\n    },\n\n    /**\n     * @override\n     */\n    renderInner: function (itemAlign, legendModel, ecModel, api) {\n        var me = this;\n\n        // Render content items.\n        ScrollableLegendView.superCall(this, 'renderInner', itemAlign, legendModel, ecModel, api);\n\n        var controllerGroup = this._controllerGroup;\n\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        if (!zrUtil.isArray(pageIconSize)) {\n            pageIconSize = [pageIconSize, pageIconSize];\n        }\n\n        createPageButton('pagePrev', 0);\n\n        var pageTextStyleModel = legendModel.getModel('pageTextStyle');\n        controllerGroup.add(new graphic.Text({\n            name: 'pageText',\n            style: {\n                textFill: pageTextStyleModel.getTextColor(),\n                font: pageTextStyleModel.getFont(),\n                textVerticalAlign: 'middle',\n                textAlign: 'center'\n            },\n            silent: true\n        }));\n\n        createPageButton('pageNext', 1);\n\n        function createPageButton(name, iconIdx) {\n            var pageDataIndexName = name + 'DataIndex';\n            var icon = graphic.createIcon(\n                legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx],\n                {\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(\n                        me._pageGo, me, pageDataIndexName, legendModel, api\n                    )\n                },\n                {\n                    x: -pageIconSize[0] / 2,\n                    y: -pageIconSize[1] / 2,\n                    width: pageIconSize[0],\n                    height: pageIconSize[1]\n                }\n            );\n            icon.name = name;\n            controllerGroup.add(icon);\n        }\n    },\n\n    /**\n     * @override\n     */\n    layoutInner: function (legendModel, itemAlign, maxSize, isFirstRender) {\n        var contentGroup = this.getContentGroup();\n        var containerGroup = this._containerGroup;\n        var controllerGroup = this._controllerGroup;\n\n        var orientIdx = legendModel.getOrient().index;\n        var wh = WH[orientIdx];\n        var hw = WH[1 - orientIdx];\n        var yx = XY[1 - orientIdx];\n\n        // Place items in contentGroup.\n        layoutUtil.box(\n            legendModel.get('orient'),\n            contentGroup,\n            legendModel.get('itemGap'),\n            !orientIdx ? null : maxSize.width,\n            orientIdx ? null : maxSize.height\n        );\n\n        layoutUtil.box(\n            // Buttons in controller are layout always horizontally.\n            'horizontal',\n            controllerGroup,\n            legendModel.get('pageButtonItemGap', true)\n        );\n\n        var contentRect = contentGroup.getBoundingRect();\n        var controllerRect = controllerGroup.getBoundingRect();\n        var showController = this._showController = contentRect[wh] > maxSize[wh];\n\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.position[orientIdx];\n        }\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(\n            legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)\n        );\n\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\n        // Always align controller to content as 'middle'.\n        controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2;\n\n        contentGroup.attr('position', contentPos);\n        containerGroup.attr('position', containerPos);\n        controllerGroup.attr('position', controllerPos);\n\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 = this.group.getBoundingRect();\n        var mainRect = {x: 0, y: 0};\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\n        containerGroup.__rectSize = maxSize[wh];\n        if (showController) {\n            var clipShape = {x: 0, y: 0};\n            clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0);\n            clipShape[hw] = mainRect[hw];\n            containerGroup.setClipPath(new graphic.Rect({shape: clipShape}));\n            // Consider content may be larger than container, container rect\n            // can not be obtained from `containerGroup.getBoundingRect()`.\n            containerGroup.__rectSize = clipShape[wh];\n        }\n        else {\n            // Do not remove or ignore controller. Keep them set as place holders.\n            controllerGroup.eachChild(function (child) {\n                child.attr({invisible: true, silent: true});\n            });\n        }\n\n        // Content translate animation.\n        var pageInfo = this._getPageInfo(legendModel);\n        pageInfo.pageIndex != null && graphic.updateProps(\n            contentGroup,\n            {position: pageInfo.contentPosition},\n            // When switch from \"show controller\" to \"not show controller\", view should be\n            // updated immediately without animation, otherwise causes weird efffect.\n            showController ? legendModel : false\n        );\n\n        this._updatePageInfoView(legendModel, pageInfo);\n\n        return mainRect;\n    },\n\n    _pageGo: function (to, legendModel, api) {\n        var scrollDataIndex = this._getPageInfo(legendModel)[to];\n\n        scrollDataIndex != null && api.dispatchAction({\n            type: 'legendScroll',\n            scrollDataIndex: scrollDataIndex,\n            legendId: legendModel.id\n        });\n    },\n\n    _updatePageInfoView: function (legendModel, pageInfo) {\n        var controllerGroup = this._controllerGroup;\n\n        zrUtil.each(['pagePrev', 'pageNext'], function (name) {\n            var canJump = pageInfo[name + 'DataIndex'] != null;\n            var icon = controllerGroup.childOfName(name);\n            if (icon) {\n                icon.setStyle(\n                    'fill',\n                    canJump\n                        ? legendModel.get('pageIconColor', true)\n                        : legendModel.get('pageIconInactiveColor', true)\n                );\n                icon.cursor = canJump ? 'pointer' : 'default';\n            }\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\n        pageText && pageFormatter && pageText.setStyle(\n            'text',\n            zrUtil.isString(pageFormatter)\n                ? pageFormatter.replace('{current}', current).replace('{total}', total)\n                : pageFormatter({current: current, total: total})\n        );\n    },\n\n    /**\n     * @param {module:echarts/model/Model} legendModel\n     * @return {Object} {\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 next page.\n     *  pageNextDataIndex: number, null when no previous page.\n     * }\n     */\n    _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\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\n        var result = {\n            contentPosition: contentGroup.position.slice(),\n            pageCount: pCount,\n            pageIndex: pCount - 1,\n            pagePrevDataIndex: null,\n            pageNextDataIndex: null\n        };\n\n        if (!targetItem) {\n            return result;\n        }\n\n        var targetItemInfo = getItemInfo(targetItem);\n        result.contentPosition[orientIdx] = -targetItemInfo.s;\n\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\n        for (var i = targetItemIndex + 1,\n            winStartItemInfo = targetItemInfo,\n            winEndItemInfo = targetItemInfo,\n            currItemInfo = null;\n            i <= itemCount;\n            ++i\n        ) {\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            ) {\n                if (winEndItemInfo.i > winStartItemInfo.i) {\n                    winStartItemInfo = winEndItemInfo;\n                }\n                else { // 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\n        for (var i = targetItemIndex - 1,\n            winStartItemInfo = targetItemInfo,\n            winEndItemInfo = targetItemInfo,\n            currItemInfo = null;\n            i >= -1;\n            --i\n        ) {\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            ) {\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\n        return result;\n\n        function getItemInfo(el) {\n            if (el) {\n                var itemRect = el.getBoundingRect();\n                var start = itemRect[xy] + el.position[orientIdx];\n                return {\n                    s: start,\n                    e: start + itemRect[wh],\n                    i: el.__legendDataIndex\n                };\n            }\n        }\n\n        function intersect(itemInfo, winStart) {\n            return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize;\n        }\n    },\n\n    _findTargetItemIndex: function (targetDataIndex) {\n        var index;\n        var contentGroup = this.getContentGroup();\n        var defaultIndex;\n\n        if (this._showController) {\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 defualtIndex. 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        }\n\n        return index != null ? index : defaultIndex;\n    }\n\n});\n\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\nimport * as echarts from '../../echarts';\n\n/**\n * @event legendScroll\n * @type {Object}\n * @property {string} type 'legendScroll'\n * @property {string} scrollDataIndex\n */\necharts.registerAction(\n    'legendScroll', 'legendscroll',\n    function (payload, ecModel) {\n        var scrollDataIndex = payload.scrollDataIndex;\n\n        scrollDataIndex != null && ecModel.eachComponent(\n            {mainType: 'legend', subType: 'scroll', 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 * Legend component entry file8\n */\n\nimport './legend';\nimport './legend/ScrollableLegendModel';\nimport './legend/ScrollableLegendView';\nimport './legend/scrollableLegendAction';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport DataZoomModel from './DataZoomModel';\n\nvar SliderZoomModel = DataZoomModel.extend({\n\n    type: 'dataZoom.slider',\n\n    layoutMode: 'box',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        show: true,\n\n        // ph => placeholder. Using placehoder here because\n        // deault value can only be drived in view stage.\n        right: 'ph',  // Default align to grid rect.\n        top: 'ph',    // Default align to grid rect.\n        width: 'ph',  // Default align to grid rect.\n        height: 'ph', // Default align to grid rect.\n        left: null,   // Default align to grid rect.\n        bottom: null, // Default align to grid rect.\n\n        backgroundColor: 'rgba(47,69,84,0)',    // Background of slider zoom component.\n        // dataBackgroundColor: '#ddd',         // Background coor of data shadow and border of box,\n                                                // highest priority, remain for compatibility of\n                                                // previous version, but not recommended any more.\n        dataBackground: {\n            lineStyle: {\n                color: '#2f4554',\n                width: 0.5,\n                opacity: 0.3\n            },\n            areaStyle: {\n                color: 'rgba(47,69,84,0.3)',\n                opacity: 0.3\n            }\n        },\n        borderColor: '#ddd',                    // border color of the box. For compatibility,\n                                                // if dataBackgroundColor is set, borderColor\n                                                // is ignored.\n\n        fillerColor: 'rgba(167,183,204,0.4)',     // Color of selected area.\n        // handleColor: 'rgba(89,170,216,0.95)',     // Color of handle.\n        // handleIcon: 'path://M4.9,17.8c0-1.4,4.5-10.5,5.5-12.4c0-0.1,0.6-1.1,0.9-1.1c0.4,0,0.9,1,0.9,1.1c1.1,2.2,5.4,11,5.4,12.4v17.8c0,1.5-0.6,2.1-1.3,2.1H6.1c-0.7,0-1.3-0.6-1.3-2.1V17.8z',\n        /* eslint-disable */\n        handleIcon: 'M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z',\n        /* eslint-enable */\n        // Percent of the slider height\n        handleSize: '100%',\n\n        handleStyle: {\n            color: '#a7b7cc'\n        },\n\n        labelPrecision: null,\n        labelFormatter: null,\n        showDetail: true,\n        showDataShadow: 'auto',                 // Default auto decision.\n        realtime: true,\n        zoomLock: false,                        // Whether disable zoom.\n        textStyle: {\n            color: '#333'\n        }\n    }\n\n});\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as eventTool from 'zrender/src/core/event';\nimport * as graphic from '../../util/graphic';\nimport * as throttle from '../../util/throttle';\nimport DataZoomView from './DataZoomView';\nimport * as numberUtil from '../../util/number';\nimport * as layout from '../../util/layout';\nimport sliderMove from '../helper/sliderMove';\n\nvar Rect = graphic.Rect;\nvar linearMap = numberUtil.linearMap;\nvar asc = numberUtil.asc;\nvar bind = zrUtil.bind;\nvar each = zrUtil.each;\n\n// Constants\nvar DEFAULT_LOCATION_EDGE_GAP = 7;\nvar DEFAULT_FRAME_BORDER_WIDTH = 1;\nvar DEFAULT_FILLER_SIZE = 30;\nvar HORIZONTAL = 'horizontal';\nvar VERTICAL = 'vertical';\nvar LABEL_GAP = 5;\nvar SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];\n\nvar SliderZoomView = DataZoomView.extend({\n\n    type: 'dataZoom.slider',\n\n    init: function (ecModel, api) {\n\n        /**\n         * @private\n         * @type {Object}\n         */\n        this._displayables = {};\n\n        /**\n         * @private\n         * @type {string}\n         */\n        this._orient;\n\n        /**\n         * [0, 100]\n         * @private\n         */\n        this._range;\n\n        /**\n         * [coord of the first handle, coord of the second handle]\n         * @private\n         */\n        this._handleEnds;\n\n        /**\n         * [length, thick]\n         * @private\n         * @type {Array.<number>}\n         */\n        this._size;\n\n        /**\n         * @private\n         * @type {number}\n         */\n        this._handleWidth;\n\n        /**\n         * @private\n         * @type {number}\n         */\n        this._handleHeight;\n\n        /**\n         * @private\n         */\n        this._location;\n\n        /**\n         * @private\n         */\n        this._dragging;\n\n        /**\n         * @private\n         */\n        this._dataShadowInfo;\n\n        this.api = api;\n    },\n\n    /**\n     * @override\n     */\n    render: function (dataZoomModel, ecModel, api, payload) {\n        SliderZoomView.superApply(this, 'render', arguments);\n\n        throttle.createOrUpdate(\n            this,\n            '_dispatchZoomAction',\n            this.dataZoomModel.get('throttle'),\n            'fixRate'\n        );\n\n        this._orient = dataZoomModel.get('orient');\n\n        if (this.dataZoomModel.get('show') === false) {\n            this.group.removeAll();\n            return;\n        }\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\n        this._updateView();\n    },\n\n    /**\n     * @override\n     */\n    remove: function () {\n        SliderZoomView.superApply(this, 'remove', arguments);\n        throttle.clear(this, '_dispatchZoomAction');\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        SliderZoomView.superApply(this, 'dispose', arguments);\n        throttle.clear(this, '_dispatchZoomAction');\n    },\n\n    _buildView: function () {\n        var thisGroup = this.group;\n\n        thisGroup.removeAll();\n\n        this._resetLocation();\n        this._resetInterval();\n\n        var barGroup = this._displayables.barGroup = new graphic.Group();\n\n        this._renderBackground();\n\n        this._renderHandle();\n\n        this._renderDataShadow();\n\n        thisGroup.add(barGroup);\n\n        this._positionGroup();\n    },\n\n    /**\n     * @private\n     */\n    _resetLocation: function () {\n        var dataZoomModel = this.dataZoomModel;\n        var api = this.api;\n\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 ecSize = {width: api.getWidth(), height: api.getHeight()};\n        // Default align by coordinate system rect.\n        var positionInfo = this._orient === HORIZONTAL\n            ? {\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: ecSize.width - coordRect.x - coordRect.width,\n                top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP),\n                width: coordRect.width,\n                height: DEFAULT_FILLER_SIZE\n            }\n            : { // vertical\n                right: DEFAULT_LOCATION_EDGE_GAP,\n                top: coordRect.y,\n                width: DEFAULT_FILLER_SIZE,\n                height: coordRect.height\n            };\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\n        // Replace the placeholder value.\n        zrUtil.each(['right', 'top', 'width', 'height'], function (name) {\n            if (layoutParams[name] === 'ph') {\n                layoutParams[name] = positionInfo[name];\n            }\n        });\n\n        var layoutRect = layout.getLayoutRect(\n            layoutParams,\n            ecSize,\n            dataZoomModel.padding\n        );\n\n        this._location = {x: layoutRect.x, y: layoutRect.y};\n        this._size = [layoutRect.width, layoutRect.height];\n        this._orient === VERTICAL && this._size.reverse();\n    },\n\n    /**\n     * @private\n     */\n    _positionGroup: function () {\n        var thisGroup = this.group;\n        var location = this._location;\n        var orient = this._orient;\n\n        // Just use the first axis to determine mapping.\n        var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();\n        var inverse = targetAxisModel && targetAxisModel.get('inverse');\n\n        var barGroup = this._displayables.barGroup;\n        var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse;\n\n        // Transform barGroup.\n        barGroup.attr(\n            (orient === HORIZONTAL && !inverse)\n            ? {scale: otherAxisInverse ? [1, 1] : [1, -1]}\n            : (orient === HORIZONTAL && inverse)\n            ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]}\n            : (orient === VERTICAL && !inverse)\n            ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2}\n            // Dont use Math.PI, considering shadow direction.\n            : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2}\n        );\n\n        // Position barGroup\n        var rect = thisGroup.getBoundingRect([barGroup]);\n        thisGroup.attr('position', [location.x - rect.x, location.y - rect.y]);\n    },\n\n    /**\n     * @private\n     */\n    _getViewExtent: function () {\n        return [0, this._size[0]];\n    },\n\n    _renderBackground: function () {\n        var dataZoomModel = this.dataZoomModel;\n        var size = this._size;\n        var barGroup = this._displayables.barGroup;\n\n        barGroup.add(new Rect({\n            silent: true,\n            shape: {\n                x: 0, y: 0, width: size[0], height: size[1]\n            },\n            style: {\n                fill: dataZoomModel.get('backgroundColor')\n            },\n            z2: -40\n        }));\n\n        // Click panel, over shadow, below handles.\n        barGroup.add(new Rect({\n            shape: {\n                x: 0, y: 0, width: size[0], height: size[1]\n            },\n            style: {\n                fill: 'transparent'\n            },\n            z2: 0,\n            onclick: zrUtil.bind(this._onClickPanelClick, this)\n        }));\n    },\n\n    _renderDataShadow: function () {\n        var info = this._dataShadowInfo = this._prepareDataShadowInfo();\n\n        if (!info) {\n            return;\n        }\n\n        var size = this._size;\n        var seriesModel = info.series;\n        var data = seriesModel.getRawData();\n\n        var otherDim = seriesModel.getShadowDim\n            ? seriesModel.getShadowDim() // @see candlestick\n            : info.otherDim;\n\n        if (otherDim == null) {\n            return;\n        }\n\n        var otherDataExtent = data.getDataExtent(otherDim);\n        // Nice extent.\n        var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3;\n        otherDataExtent = [\n            otherDataExtent[0] - otherOffset,\n            otherDataExtent[1] + otherOffset\n        ];\n        var otherShadowExtent = [0, size[1]];\n\n        var thisShadowExtent = [0, size[0]];\n\n        var areaPoints = [[size[0], 0], [0, 0]];\n        var linePoints = [];\n        var step = thisShadowExtent[1] / (data.count() - 1);\n        var thisCoord = 0;\n\n        // Optimize for large data shadow\n        var stride = Math.round(data.count() / size[0]);\n        var lastIsEmpty;\n        data.each([otherDim], function (value, index) {\n            if (stride > 0 && (index % stride)) {\n                thisCoord += step;\n                return;\n            }\n\n            // FIXME\n            // Should consider axis.min/axis.max when drawing dataShadow.\n\n            // FIXME\n            // 应该使用统一的空判断？还是在list里进行空判断？\n            var isEmpty = value == null || isNaN(value) || value === '';\n            // See #4235.\n            var otherCoord = isEmpty\n                ? 0 : linearMap(value, otherDataExtent, otherShadowExtent, true);\n\n            // Attempt to draw data shadow precisely when there are empty value.\n            if (isEmpty && !lastIsEmpty && index) {\n                areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]);\n                linePoints.push([linePoints[linePoints.length - 1][0], 0]);\n            }\n            else if (!isEmpty && lastIsEmpty) {\n                areaPoints.push([thisCoord, 0]);\n                linePoints.push([thisCoord, 0]);\n            }\n\n            areaPoints.push([thisCoord, otherCoord]);\n            linePoints.push([thisCoord, otherCoord]);\n\n            thisCoord += step;\n            lastIsEmpty = isEmpty;\n        });\n\n        var dataZoomModel = this.dataZoomModel;\n        // var dataBackgroundModel = dataZoomModel.getModel('dataBackground');\n        this._displayables.barGroup.add(new graphic.Polygon({\n            shape: {points: areaPoints},\n            style: zrUtil.defaults(\n                {fill: dataZoomModel.get('dataBackgroundColor')},\n                dataZoomModel.getModel('dataBackground.areaStyle').getAreaStyle()\n            ),\n            silent: true,\n            z2: -20\n        }));\n        this._displayables.barGroup.add(new graphic.Polyline({\n            shape: {points: linePoints},\n            style: dataZoomModel.getModel('dataBackground.lineStyle').getLineStyle(),\n            silent: true,\n            z2: -19\n        }));\n    },\n\n    _prepareDataShadowInfo: function () {\n        var dataZoomModel = this.dataZoomModel;\n        var showDataShadow = dataZoomModel.get('showDataShadow');\n\n        if (showDataShadow === false) {\n            return;\n        }\n\n        // Find a representative series.\n        var result;\n        var ecModel = this.ecModel;\n\n        dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {\n            var seriesModels = dataZoomModel\n                .getAxisProxy(dimNames.name, axisIndex)\n                .getTargetSeriesModels();\n\n            zrUtil.each(seriesModels, function (seriesModel) {\n                if (result) {\n                    return;\n                }\n\n                if (showDataShadow !== true && zrUtil.indexOf(\n                        SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')\n                    ) < 0\n                ) {\n                    return;\n                }\n\n                var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis;\n                var otherDim = getOtherDim(dimNames.name);\n                var otherAxisInverse;\n                var coordSys = seriesModel.coordinateSystem;\n\n                if (otherDim != null && coordSys.getOtherAxis) {\n                    otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;\n                }\n\n                otherDim = seriesModel.getData().mapDimension(otherDim);\n\n                result = {\n                    thisAxis: thisAxis,\n                    series: seriesModel,\n                    thisDim: dimNames.name,\n                    otherDim: otherDim,\n                    otherAxisInverse: otherAxisInverse\n                };\n\n            }, this);\n\n        }, this);\n\n        return result;\n    },\n\n    _renderHandle: function () {\n        var displaybles = this._displayables;\n        var handles = displaybles.handles = [];\n        var handleLabels = displaybles.handleLabels = [];\n        var barGroup = this._displayables.barGroup;\n        var size = this._size;\n        var dataZoomModel = this.dataZoomModel;\n\n        barGroup.add(displaybles.filler = new Rect({\n            draggable: true,\n            cursor: getCursor(this._orient),\n            drift: bind(this._onDragMove, this, 'all'),\n            onmousemove: function (e) {\n                // Fot mobile devicem, prevent screen slider on the button.\n                eventTool.stop(e.event);\n            },\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            style: {\n                fill: dataZoomModel.get('fillerColor'),\n                textPosition: 'inside'\n            }\n        }));\n\n        // Frame border.\n        barGroup.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            },\n            style: {\n                stroke: dataZoomModel.get('dataBackgroundColor')\n                    || dataZoomModel.get('borderColor'),\n                lineWidth: DEFAULT_FRAME_BORDER_WIDTH,\n                fill: 'rgba(0,0,0,0)'\n            }\n        }));\n\n        each([0, 1], function (handleIndex) {\n            var path = graphic.createIcon(\n                dataZoomModel.get('handleIcon'),\n                {\n                    cursor: getCursor(this._orient),\n                    draggable: true,\n                    drift: bind(this._onDragMove, this, handleIndex),\n                    onmousemove: function (e) {\n                        // Fot mobile devicem, prevent screen slider on the button.\n                        eventTool.stop(e.event);\n                    },\n                    ondragend: bind(this._onDragEnd, this),\n                    onmouseover: bind(this._showDataInfo, this, true),\n                    onmouseout: bind(this._showDataInfo, this, false)\n                },\n                {x: -1, y: 0, width: 2, height: 2}\n            );\n\n            var bRect = path.getBoundingRect();\n            this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);\n            this._handleWidth = bRect.width / bRect.height * this._handleHeight;\n\n            path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());\n            var handleColor = dataZoomModel.get('handleColor');\n            // Compatitable with previous version\n            if (handleColor != null) {\n                path.style.fill = handleColor;\n            }\n\n            barGroup.add(handles[handleIndex] = path);\n\n            var textStyleModel = dataZoomModel.textStyleModel;\n\n            this.group.add(\n                handleLabels[handleIndex] = new graphic.Text({\n                silent: true,\n                invisible: true,\n                style: {\n                    x: 0, y: 0, text: '',\n                    textVerticalAlign: 'middle',\n                    textAlign: 'center',\n                    textFill: textStyleModel.getTextColor(),\n                    textFont: textStyleModel.getFont()\n                },\n                z2: 10\n            }));\n\n        }, this);\n    },\n\n    /**\n     * @private\n     */\n    _resetInterval: function () {\n        var range = this._range = this.dataZoomModel.getPercentRange();\n        var viewExtent = this._getViewExtent();\n\n        this._handleEnds = [\n            linearMap(range[0], [0, 100], viewExtent, true),\n            linearMap(range[1], [0, 100], viewExtent, true)\n        ];\n    },\n\n    /**\n     * @private\n     * @param {(number|string)} handleIndex 0 or 1 or 'all'\n     * @param {number} delta\n     * @return {boolean} changed\n     */\n    _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\n        sliderMove(\n            delta,\n            handleEnds,\n            viewExtend,\n            dataZoomModel.get('zoomLock') ? 'all' : handleIndex,\n            minMaxSpan.minSpan != null\n                ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null,\n            minMaxSpan.maxSpan != null\n                ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null\n        );\n\n        var lastRange = this._range;\n        var range = this._range = asc([\n            linearMap(handleEnds[0], viewExtend, percentExtent, true),\n            linearMap(handleEnds[1], viewExtend, percentExtent, true)\n        ]);\n\n        return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];\n    },\n\n    /**\n     * @private\n     */\n    _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\n        each([0, 1], function (handleIndex) {\n            // Handles\n            var handle = displaybles.handles[handleIndex];\n            var handleHeight = this._handleHeight;\n            handle.attr({\n                scale: [handleHeight / 2, handleHeight / 2],\n                position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]\n            });\n        }, this);\n\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\n        this._updateDataInfo(nonRealtime);\n    },\n\n    /**\n     * @private\n     */\n    _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\n        // FIXME\n        // date型，支持formatter，autoformatter（ec2 date.getAutoFormatter）\n        if (dataZoomModel.get('showDetail')) {\n            var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n\n            if (axisProxy) {\n                var axis = axisProxy.getAxisModel().axis;\n                var range = this._range;\n\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], end: range[1]\n                    }).valueWindow\n                    : axisProxy.getDataValueWindow();\n\n                labelTexts = [\n                    this._formatLabel(dataInterval[0], axis),\n                    this._formatLabel(dataInterval[1], axis)\n                ];\n            }\n        }\n\n        var orderedHandleEnds = asc(this._handleEnds.slice());\n\n        setLabel.call(this, 0);\n        setLabel.call(this, 1);\n\n        function setLabel(handleIndex) {\n            // Label\n            // Text should not transform by barGroup.\n            // Ignore handlers transform\n            var barTransform = graphic.getTransform(\n                displaybles.handles[handleIndex].parent, this.group\n            );\n            var direction = graphic.transformDirection(\n                handleIndex === 0 ? 'right' : 'left', barTransform\n            );\n            var offset = this._handleWidth / 2 + LABEL_GAP;\n            var textPoint = graphic.applyTransform(\n                [\n                    orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset),\n                    this._size[1] / 2\n                ],\n                barTransform\n            );\n            handleLabels[handleIndex].setStyle({\n                x: textPoint[0],\n                y: textPoint[1],\n                textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction,\n                textAlign: orient === HORIZONTAL ? direction : 'center',\n                text: labelTexts[handleIndex]\n            });\n        }\n    },\n\n    /**\n     * @private\n     */\n    _formatLabel: function (value, axis) {\n        var dataZoomModel = this.dataZoomModel;\n        var labelFormatter = dataZoomModel.get('labelFormatter');\n\n        var labelPrecision = dataZoomModel.get('labelPrecision');\n        if (labelPrecision == null || labelPrecision === 'auto') {\n            labelPrecision = axis.getPixelPrecision();\n        }\n\n        var valueStr = (value == null || isNaN(value))\n            ? ''\n            // FIXME Glue code\n            : (axis.type === 'category' || axis.type === 'time')\n                ? axis.scale.getLabel(Math.round(value))\n                // param of toFixed should less then 20.\n                : value.toFixed(Math.min(labelPrecision, 20));\n\n        return zrUtil.isFunction(labelFormatter)\n            ? labelFormatter(value, valueStr)\n            : zrUtil.isString(labelFormatter)\n            ? labelFormatter.replace('{value}', valueStr)\n            : valueStr;\n    },\n\n    /**\n     * @private\n     * @param {boolean} showOrHide true: show, false: hide\n     */\n    _showDataInfo: function (showOrHide) {\n        // Always show when drgging.\n        showOrHide = this._dragging || showOrHide;\n\n        var handleLabels = this._displayables.handleLabels;\n        handleLabels[0].attr('invisible', !showOrHide);\n        handleLabels[1].attr('invisible', !showOrHide);\n    },\n\n    _onDragMove: function (handleIndex, dx, dy) {\n        this._dragging = true;\n\n        // Transform dx, dy to bar coordination.\n        var barTransform = this._displayables.barGroup.getLocalTransform();\n        var vertex = graphic.applyTransform([dx, dy], barTransform, true);\n\n        var changed = this._updateInterval(handleIndex, vertex[0]);\n\n        var realtime = this.dataZoomModel.get('realtime');\n\n        this._updateView(!realtime);\n\n        // Avoid dispatch dataZoom repeatly but range not changed,\n        // which cause bad visual effect when progressive enabled.\n        changed && realtime && this._dispatchZoomAction();\n    },\n\n    _onDragEnd: function () {\n        this._dragging = false;\n        this._showDataInfo(false);\n\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();\n    },\n\n    _onClickPanelClick: function (e) {\n        var size = this._size;\n        var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY);\n\n        if (localPoint[0] < 0 || localPoint[0] > size[0]\n            || localPoint[1] < 0 || localPoint[1] > size[1]\n        ) {\n            return;\n        }\n\n        var handleEnds = this._handleEnds;\n        var center = (handleEnds[0] + handleEnds[1]) / 2;\n\n        var changed = this._updateInterval('all', localPoint[0] - center);\n        this._updateView();\n        changed && this._dispatchZoomAction();\n    },\n\n    /**\n     * This action will be throttled.\n     * @private\n     */\n    _dispatchZoomAction: function () {\n        var range = this._range;\n\n        this.api.dispatchAction({\n            type: 'dataZoom',\n            from: this.uid,\n            dataZoomId: this.dataZoomModel.id,\n            start: range[0],\n            end: range[1]\n        });\n    },\n\n    /**\n     * @private\n     */\n    _findCoordRect: function () {\n        // Find the grid coresponding to the first axis referred by dataZoom.\n        var rect;\n        each(this.getTargetCoordInfo(), function (coordInfoList) {\n            if (!rect && coordInfoList.length) {\n                var coordSys = coordInfoList[0].model.coordinateSystem;\n                rect = coordSys.getRect && coordSys.getRect();\n            }\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\n        return rect;\n    }\n\n});\n\nfunction getOtherDim(thisDim) {\n    // FIXME\n    // 这个逻辑和getOtherAxis里一致，但是写在这里是否不好\n    var map = {x: 'y', y: 'x', radius: 'angle', angle: 'radius'};\n    return map[thisDim];\n}\n\nfunction getCursor(orient) {\n    return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n}\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\nimport './dataZoom/typeDefaulter';\n\nimport './dataZoom/DataZoomModel';\nimport './dataZoom/DataZoomView';\n\nimport './dataZoom/SliderZoomModel';\nimport './dataZoom/SliderZoomView';\n\nimport './dataZoom/dataZoomProcessor';\nimport './dataZoom/dataZoomAction';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport DataZoomModel from './DataZoomModel';\n\nexport default DataZoomModel.extend({\n\n    type: 'dataZoom.inside',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        disabled: false,   // Whether disable this inside zoom.\n        zoomLock: false,   // Whether disable zoom but only pan.\n        zoomOnMouseWheel: true, // Can be: true / false / 'shift' / 'ctrl' / 'alt'.\n        moveOnMouseMove: true,   // Can be: true / false / 'shift' / 'ctrl' / 'alt'.\n        moveOnMouseWheel: false, // Can be: true / false / 'shift' / 'ctrl' / 'alt'.\n        preventDefaultMouseMove: 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// 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.\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport RoamController from '../../component/helper/RoamController';\nimport * as throttleUtil from '../../util/throttle';\n\n\nvar ATTR = '\\0_ec_dataZoom_roams';\n\n\n/**\n * @public\n * @param {module:echarts/ExtensionAPI} api\n * @param {Object} dataZoomInfo\n * @param {string} dataZoomInfo.coordId\n * @param {Function} dataZoomInfo.containsPoint\n * @param {Array.<string>} dataZoomInfo.allCoordIds\n * @param {string} dataZoomInfo.dataZoomId\n * @param {Object} dataZoomInfo.getRange\n * @param {Function} dataZoomInfo.getRange.pan\n * @param {Function} dataZoomInfo.getRange.zoom\n * @param {Function} dataZoomInfo.getRange.scrollMove\n * @param {boolean} dataZoomInfo.dataZoomModel\n */\nexport function register(api, dataZoomInfo) {\n    var store = giveStore(api);\n    var theDataZoomId = dataZoomInfo.dataZoomId;\n    var theCoordId = dataZoomInfo.coordId;\n\n    // Do clean when a dataZoom changes its target coordnate system.\n    // Avoid memory leak, dispose all not-used-registered.\n    zrUtil.each(store, function (record, coordId) {\n        var dataZoomInfos = record.dataZoomInfos;\n        if (dataZoomInfos[theDataZoomId]\n            && zrUtil.indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0\n        ) {\n            delete dataZoomInfos[theDataZoomId];\n            record.count--;\n        }\n    });\n\n    cleanStore(store);\n\n    var record = store[theCoordId];\n    // Create if needed.\n    if (!record) {\n        record = store[theCoordId] = {\n            coordId: theCoordId,\n            dataZoomInfos: {},\n            count: 0\n        };\n        record.controller = createController(api, record);\n        record.dispatchAction = zrUtil.curry(dispatchAction, api);\n    }\n\n    // Update reference of dataZoom.\n    !(record.dataZoomInfos[theDataZoomId]) && record.count++;\n    record.dataZoomInfos[theDataZoomId] = dataZoomInfo;\n\n    var controllerParams = mergeControllerParams(record.dataZoomInfos);\n    record.controller.enable(controllerParams.controlType, controllerParams.opt);\n\n    // Consider resize, area should be always updated.\n    record.controller.setPointerChecker(dataZoomInfo.containsPoint);\n\n    // Update throttle.\n    throttleUtil.createOrUpdate(\n        record,\n        'dispatchAction',\n        dataZoomInfo.dataZoomModel.get('throttle', true),\n        'fixRate'\n    );\n}\n\n/**\n * @public\n * @param {module:echarts/ExtensionAPI} api\n * @param {string} dataZoomId\n */\nexport function unregister(api, dataZoomId) {\n    var store = giveStore(api);\n\n    zrUtil.each(store, function (record) {\n        record.controller.dispose();\n        var dataZoomInfos = record.dataZoomInfos;\n        if (dataZoomInfos[dataZoomId]) {\n            delete dataZoomInfos[dataZoomId];\n            record.count--;\n        }\n    });\n\n    cleanStore(store);\n}\n\n/**\n * @public\n */\nexport function generateCoordId(coordModel) {\n    return coordModel.type + '\\0_' + coordModel.id;\n}\n\n/**\n * Key: coordId, value: {dataZoomInfos: [], count, controller}\n * @type {Array.<Object>}\n */\nfunction giveStore(api) {\n    // Mount store on zrender instance, so that we do not\n    // need to worry about dispose.\n    var zr = api.getZr();\n    return zr[ATTR] || (zr[ATTR] = {});\n}\n\nfunction createController(api, newRecord) {\n    var controller = new RoamController(api.getZr());\n\n    zrUtil.each(['pan', 'zoom', 'scrollMove'], function (eventName) {\n        controller.on(eventName, function (event) {\n            var batch = [];\n\n            zrUtil.each(newRecord.dataZoomInfos, function (info) {\n                // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove,\n                // moveOnMouseWheel, ...) enabled.\n                if (!event.isAvailableBehavior(info.dataZoomModel.option)) {\n                    return;\n                }\n\n                var method = (info.getRange || {})[eventName];\n                var range = method && method(newRecord.controller, event);\n\n                !info.dataZoomModel.get('disabled', true) && range && batch.push({\n                    dataZoomId: info.dataZoomId,\n                    start: range[0],\n                    end: range[1]\n                });\n            });\n\n            batch.length && newRecord.dispatchAction(batch);\n        });\n    });\n\n    return controller;\n}\n\nfunction cleanStore(store) {\n    zrUtil.each(store, function (record, coordId) {\n        if (!record.count) {\n            record.controller.dispose();\n            delete store[coordId];\n        }\n    });\n}\n\n/**\n * This action will be throttled.\n */\nfunction dispatchAction(api, batch) {\n    api.dispatchAction({\n        type: 'dataZoom',\n        batch: batch\n    });\n}\n\n/**\n * Merge roamController settings when multiple dataZooms share one roamController.\n */\nfunction mergeControllerParams(dataZoomInfos) {\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\n    zrUtil.each(dataZoomInfos, function (dataZoomInfo) {\n        var dataZoomModel = dataZoomInfo.dataZoomModel;\n        var oneType = dataZoomModel.get('disabled', true)\n            ? false\n            : dataZoomModel.get('zoomLock', true)\n            ? 'move'\n            : true;\n        if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) {\n            controlType = oneType;\n        }\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 &= dataZoomModel.get('preventDefaultMouseMove', true);\n    });\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        }\n    };\n}\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport DataZoomView from './DataZoomView';\nimport sliderMove from '../helper/sliderMove';\nimport * as roams from './roams';\n\nvar bind = zrUtil.bind;\n\nvar InsideZoomView = DataZoomView.extend({\n\n    type: 'dataZoom.inside',\n\n    /**\n     * @override\n     */\n    init: function (ecModel, api) {\n        /**\n         * 'throttle' is used in this.dispatchAction, so we save range\n         * to avoid missing some 'pan' info.\n         * @private\n         * @type {Array.<number>}\n         */\n        this._range;\n    },\n\n    /**\n     * @override\n     */\n    render: function (dataZoomModel, ecModel, api, payload) {\n        InsideZoomView.superApply(this, 'render', arguments);\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\n        // Reset controllers.\n        zrUtil.each(this.getTargetCoordInfo(), function (coordInfoList, coordSysName) {\n\n            var allCoordIds = zrUtil.map(coordInfoList, function (coordInfo) {\n                return roams.generateCoordId(coordInfo.model);\n            });\n\n            zrUtil.each(coordInfoList, function (coordInfo) {\n                var coordModel = coordInfo.model;\n\n                var getRange = {};\n                zrUtil.each(['pan', 'zoom', 'scrollMove'], function (eventName) {\n                    getRange[eventName] = bind(roamHandlers[eventName], this, coordInfo, coordSysName);\n                }, this);\n\n                roams.register(\n                    api,\n                    {\n                        coordId: roams.generateCoordId(coordModel),\n                        allCoordIds: allCoordIds,\n                        containsPoint: function (e, x, y) {\n                            return coordModel.coordinateSystem.containPoint([x, y]);\n                        },\n                        dataZoomId: dataZoomModel.id,\n                        dataZoomModel: dataZoomModel,\n                        getRange: getRange\n                    }\n                );\n            }, this);\n\n        }, this);\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        roams.unregister(this.api, this.dataZoomModel.id);\n        InsideZoomView.superApply(this, 'dispose', arguments);\n        this._range = null;\n    }\n\n});\n\nvar roamHandlers = {\n\n    /**\n     * @this {module:echarts/component/dataZoom/InsideZoomView}\n     */\n    zoom: function (coordInfo, coordSysName, controller, e) {\n        var lastRange = this._range;\n        var range = lastRange.slice();\n\n        // Calculate transform by the first axis.\n        var axisModel = coordInfo.axisModels[0];\n        if (!axisModel) {\n            return;\n        }\n\n        var directionInfo = getDirectionInfo[coordSysName](\n            null, [e.originX, e.originY], axisModel, controller, coordInfo\n        );\n        var percentPoint = (\n            directionInfo.signal > 0\n                ? (directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel)\n                : (directionInfo.pixel - directionInfo.pixelStart)\n            ) / directionInfo.pixelLength * (range[1] - range[0]) + range[0];\n\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\n        // Restrict range.\n        var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n\n        sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);\n\n        this._range = range;\n\n        if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n            return range;\n        }\n    },\n\n    /**\n     * @this {module:echarts/component/dataZoom/InsideZoomView}\n     */\n    pan: makeMover(function (range, axisModel, coordInfo, coordSysName, controller, e) {\n        var directionInfo = getDirectionInfo[coordSysName](\n            [e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordInfo\n        );\n\n        return directionInfo.signal\n            * (range[1] - range[0])\n            * directionInfo.pixel / directionInfo.pixelLength;\n    }),\n\n    /**\n     * @this {module:echarts/component/dataZoom/InsideZoomView}\n     */\n    scrollMove: makeMover(function (range, axisModel, coordInfo, coordSysName, controller, e) {\n        var directionInfo = getDirectionInfo[coordSysName](\n            [0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordInfo\n        );\n        return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta;\n    })\n};\n\nfunction makeMover(getPercentDelta) {\n    return function (coordInfo, coordSysName, controller, e) {\n        var lastRange = this._range;\n        var range = lastRange.slice();\n\n        // Calculate transform by the first axis.\n        var axisModel = coordInfo.axisModels[0];\n        if (!axisModel) {\n            return;\n        }\n\n        var percentDelta = getPercentDelta(\n            range, axisModel, coordInfo, coordSysName, controller, e\n        );\n\n        sliderMove(percentDelta, range, [0, 100], 'all');\n\n        this._range = range;\n\n        if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n            return range;\n        }\n    };\n}\n\nvar getDirectionInfo = {\n\n    grid: function (oldPoint, newPoint, axisModel, controller, coordInfo) {\n        var axis = axisModel.axis;\n        var ret = {};\n        var rect = coordInfo.model.coordinateSystem.getRect();\n        oldPoint = oldPoint || [0, 0];\n\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        }\n        else { // 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\n        return ret;\n    },\n\n    polar: function (oldPoint, newPoint, axisModel, controller, coordInfo) {\n        var axis = axisModel.axis;\n        var ret = {};\n        var polar = coordInfo.model.coordinateSystem;\n        var radiusExtent = polar.getRadiusAxis().getExtent();\n        var angleExtent = polar.getAngleAxis().getExtent();\n\n        oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];\n        newPoint = polar.pointToCoord(newPoint);\n\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        }\n        else { // '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\n        return ret;\n    },\n\n    singleAxis: function (oldPoint, newPoint, axisModel, controller, coordInfo) {\n        var axis = axisModel.axis;\n        var rect = coordInfo.model.coordinateSystem.getRect();\n        var ret = {};\n\n        oldPoint = oldPoint || [0, 0];\n\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        }\n        else { // '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\n        return ret;\n    }\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\nimport './dataZoom/typeDefaulter';\n\nimport './dataZoom/DataZoomModel';\nimport './dataZoom/DataZoomView';\n\nimport './dataZoom/InsideZoomModel';\nimport './dataZoom/InsideZoomView';\n\nimport './dataZoom/dataZoomProcessor';\nimport './dataZoom/dataZoomAction';\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport './dataZoomSlider';\nimport './dataZoomInside';\n\n// Do not include './dataZoomSelect',\n// since it only work for toolbox dataZoom.\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar each = zrUtil.each;\n\nexport default function (option) {\n    var visualMap = option && option.visualMap;\n\n    if (!zrUtil.isArray(visualMap)) {\n        visualMap = visualMap ? [visualMap] : [];\n    }\n\n    each(visualMap, function (opt) {\n        if (!opt) {\n            return;\n        }\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\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}\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\nimport Component from '../../model/Component';\n\nComponent.registerSubTypeDefaulter('visualMap', function (option) {\n    // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.\n    return (\n            !option.categories\n            && (\n                !(\n                    option.pieces\n                        ? option.pieces.length > 0\n                        : option.splitNumber > 0\n                )\n                || option.calculable\n            )\n        )\n        ? 'continuous' : 'piecewise';\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as visualSolution from '../../visual/visualSolution';\nimport VisualMapping from '../../visual/VisualMapping';\n\nvar VISUAL_PRIORITY = echarts.PRIORITY.VISUAL.COMPONENT;\n\necharts.registerVisual(VISUAL_PRIORITY, {\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)\n                || (pipelineContext && pipelineContext.large)\n            ) {\n                return;\n            }\n\n            resetDefines.push(visualSolution.incrementalApplyVisual(\n                visualMapModel.stateList,\n                visualMapModel.targetVisuals,\n                zrUtil.bind(visualMapModel.getValueState, visualMapModel),\n                visualMapModel.getDataDimension(seriesModel.getData())\n            ));\n        });\n\n        return resetDefines;\n    }\n});\n\n// Only support color.\necharts.registerVisual(VISUAL_PRIORITY, {\n    createOnAllSeries: true,\n    reset: function (seriesModel, ecModel) {\n        var data = seriesModel.getData();\n        var visualMetaList = [];\n\n        ecModel.eachComponent('visualMap', function (visualMapModel) {\n            if (visualMapModel.isTargetSeries(seriesModel)) {\n                var visualMeta = visualMapModel.getVisualMeta(\n                    zrUtil.bind(getColorVisual, null, seriesModel, visualMapModel)\n                ) || {stops: [], outerColors: []};\n\n                var concreteDim = visualMapModel.getDataDimension(data);\n                var dimInfo = data.getDimensionInfo(concreteDim);\n                if (dimInfo != null) {\n                    // visualMeta.dimension should be dimension index, but not concrete dimension.\n                    visualMeta.dimension = dimInfo.index;\n                    visualMetaList.push(visualMeta);\n                }\n            }\n        });\n\n        // console.log(JSON.stringify(visualMetaList.map(a => a.stops)));\n        seriesModel.getData().setVisual('visualMeta', visualMetaList);\n    }\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: seriesModel.getData().getVisual('color') // default color.\n    };\n\n    for (var i = 0, len = visualTypes.length; i < len; i++) {\n        var type = visualTypes[i];\n        var mapping = mappings[\n            type === 'opacity' ? '__alphaForOpacity' : type\n        ];\n        mapping && mapping.applyVisual(value, getVisual, setVisual);\n    }\n\n    return resultVisual.color;\n\n    function getVisual(key) {\n        return resultVisual[key];\n    }\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 * @file Visual mapping.\n */\n\nimport * as zrUtil from 'zrender/src/core/util';\n\nvar visualDefault = {\n\n    /**\n     * @public\n     */\n    get: function (visualType, key, isCategory) {\n        var value = zrUtil.clone(\n            (defaultOption[visualType] || {})[key]\n        );\n\n        return isCategory\n            ? (zrUtil.isArray(value) ? value[value.length - 1] : value)\n            : value;\n    }\n\n};\n\nvar defaultOption = {\n\n    color: {\n        active: ['#006edd', '#e0ffff'],\n        inactive: ['rgba(0,0,0,0)']\n    },\n\n    colorHue: {\n        active: [0, 360],\n        inactive: [0, 0]\n    },\n\n    colorSaturation: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n    },\n\n    colorLightness: {\n        active: [0.9, 0.5],\n        inactive: [0, 0]\n    },\n\n    colorAlpha: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n    },\n\n    opacity: {\n        active: [0.3, 1],\n        inactive: [0, 0]\n    },\n\n    symbol: {\n        active: ['circle', 'roundRect', 'diamond'],\n        inactive: ['none']\n    },\n\n    symbolSize: {\n        active: [10, 50],\n        inactive: [0, 0]\n    }\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport env from 'zrender/src/core/env';\nimport visualDefault from '../../visual/visualDefault';\nimport VisualMapping from '../../visual/VisualMapping';\nimport * as visualSolution from '../../visual/visualSolution';\nimport * as modelUtil from '../../util/model';\nimport * as numberUtil from '../../util/number';\n\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 noop = zrUtil.noop;\n\nvar VisualMapModel = echarts.extendComponentModel({\n\n    type: 'visualMap',\n\n    dependencies: ['series'],\n\n    /**\n     * @readOnly\n     * @type {Array.<string>}\n     */\n    stateList: ['inRange', 'outOfRange'],\n\n    /**\n     * @readOnly\n     * @type {Array.<string>}\n     */\n    replacableOptionKeys: [\n        'inRange', 'outOfRange', 'target', 'controller', 'color'\n    ],\n\n    /**\n     * [lowerBound, upperBound]\n     *\n     * @readOnly\n     * @type {Array.<number>}\n     */\n    dataBound: [-Infinity, Infinity],\n\n    /**\n     * @readOnly\n     * @type {string|Object}\n     */\n    layoutMode: {type: 'box', ignoreSize: true},\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        show: true,\n\n        zlevel: 0,\n        z: 4,\n\n        seriesIndex: 'all',     // 'all' or null/undefined: all series.\n                                // A number or an array of number: the specified series.\n\n                                // set min: 0, max: 200, only for campatible with ec2.\n                                // In fact min max should not have default value.\n        min: 0,                 // min value, must specified if pieces is not specified.\n        max: 200,               // max value, must specified if pieces is not specified.\n\n        dimension: null,\n        inRange: null,          // 'color', 'colorHue', 'colorSaturation', 'colorLightness', 'colorAlpha',\n                                // 'symbol', 'symbolSize'\n        outOfRange: null,       // 'color', 'colorHue', 'colorSaturation',\n                                // 'colorLightness', 'colorAlpha',\n                                // 'symbol', 'symbolSize'\n\n        left: 0,                // 'center' ¦ 'left' ¦ 'right' ¦ {number} (px)\n        right: null,            // The same as left.\n        top: null,              // 'top' ¦ 'bottom' ¦ 'center' ¦ {number} (px)\n        bottom: 0,              // The same as top.\n\n        itemWidth: null,\n        itemHeight: null,\n        inverse: false,\n        orient: 'vertical',        // 'horizontal' ¦ 'vertical'\n\n        backgroundColor: 'rgba(0,0,0,0)',\n        borderColor: '#ccc',       // 值域边框颜色\n        contentColor: '#5793f3',\n        inactiveColor: '#aaa',\n        borderWidth: 0,            // 值域边框线宽，单位px，默认为0（无边框）\n        padding: 5,                // 值域内边距，单位px，默认各方向内边距为5，\n                                    // 接受数组分别设定上右下左边距，同css\n        textGap: 10,               //\n        precision: 0,              // 小数精度，默认为0，无小数点\n        color: null,               //颜色（deprecated，兼容ec2，顺序同pieces，不同于inRange/outOfRange）\n\n        formatter: null,\n        text: null,                // 文本，如['高', '低']，兼容ec2，text[0]对应高值，text[1]对应低值\n        textStyle: {\n            color: '#333'          // 值域文字颜色\n        }\n    },\n\n    /**\n     * @protected\n     */\n    init: function (option, parentModel, ecModel) {\n\n        /**\n         * @private\n         * @type {Array.<number>}\n         */\n        this._dataExtent;\n\n        /**\n         * @readOnly\n         */\n        this.targetVisuals = {};\n\n        /**\n         * @readOnly\n         */\n        this.controllerVisuals = {};\n\n        /**\n         * @readOnly\n         */\n        this.textStyleModel;\n\n        /**\n         * [width, height]\n         * @readOnly\n         * @type {Array.<number>}\n         */\n        this.itemSize;\n\n        this.mergeDefaultAndTheme(option, ecModel);\n    },\n\n    /**\n     * @protected\n     */\n    optionUpdated: function (newOption, isInit) {\n        var thisOption = this.option;\n\n        // FIXME\n        // necessary?\n        // Disable realtime view update if canvas is not supported.\n        if (!env.canvasSupported) {\n            thisOption.realtime = false;\n        }\n\n        !isInit && visualSolution.replaceVisualOption(\n            thisOption, newOption, this.replacableOptionKeys\n        );\n\n        this.textStyleModel = this.getModel('textStyle');\n\n        this.resetItemSize();\n\n        this.completeVisualOption();\n    },\n\n    /**\n     * @protected\n     */\n    resetVisual: function (supplementVisualOption) {\n        var stateList = this.stateList;\n        supplementVisualOption = zrUtil.bind(supplementVisualOption, this);\n\n        this.controllerVisuals = visualSolution.createVisualMappings(\n            this.option.controller, stateList, supplementVisualOption\n        );\n        this.targetVisuals = visualSolution.createVisualMappings(\n            this.option.target, stateList, supplementVisualOption\n        );\n    },\n\n    /**\n     * @protected\n     * @return {Array.<number>} An array of series indices.\n     */\n    getTargetSeriesIndices: function () {\n        var optionSeriesIndex = this.option.seriesIndex;\n        var seriesIndices = [];\n\n        if (optionSeriesIndex == null || optionSeriesIndex === 'all') {\n            this.ecModel.eachSeries(function (seriesModel, index) {\n                seriesIndices.push(index);\n            });\n        }\n        else {\n            seriesIndices = modelUtil.normalizeToArray(optionSeriesIndex);\n        }\n\n        return seriesIndices;\n    },\n\n    /**\n     * @public\n     */\n    eachTargetSeries: function (callback, context) {\n        zrUtil.each(this.getTargetSeriesIndices(), function (seriesIndex) {\n            callback.call(context, this.ecModel.getSeriesByIndex(seriesIndex));\n        }, this);\n    },\n\n    /**\n     * @pubilc\n     */\n    isTargetSeries: function (seriesModel) {\n        var is = false;\n        this.eachTargetSeries(function (model) {\n            model === seriesModel && (is = true);\n        });\n        return is;\n    },\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 {number|Array.<number>} value Real value, or this.dataBound[0 or 1].\n     * @param {boolean} [isCategory=false] Only available when value is number.\n     * @param {Array.<string>} edgeSymbols Open-close symbol when value is interval.\n     * @return {string}\n     * @protected\n     */\n    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        var textValue;\n        edgeSymbols = edgeSymbols || ['<', '>'];\n\n        if (zrUtil.isArray(value)) {\n            value = value.slice();\n            isMinMax = true;\n        }\n\n        textValue = isCategory\n            ? value\n            : (isMinMax\n                ? [toFixed(value[0]), toFixed(value[1])]\n                : toFixed(value)\n            );\n\n        if (zrUtil.isString(formatter)) {\n            return formatter\n                .replace('{value}', isMinMax ? textValue[0] : textValue)\n                .replace('{value2}', isMinMax ? textValue[1] : textValue);\n        }\n        else if (zrUtil.isFunction(formatter)) {\n            return isMinMax\n                ? formatter(value[0], value[1])\n                : formatter(value);\n        }\n\n        if (isMinMax) {\n            if (value[0] === dataBound[0]) {\n                return edgeSymbols[0] + ' ' + textValue[1];\n            }\n            else if (value[1] === dataBound[1]) {\n                return edgeSymbols[1] + ' ' + textValue[0];\n            }\n            else {\n                return textValue[0] + ' - ' + textValue[1];\n            }\n        }\n        else { // Format single value (includes category case).\n            return textValue;\n        }\n\n        function toFixed(val) {\n            return val === dataBound[0]\n                ? 'min'\n                : val === dataBound[1]\n                ? 'max'\n                : (+val).toFixed(Math.min(precision, 20));\n        }\n    },\n\n    /**\n     * @protected\n     */\n    resetExtent: function () {\n        var thisOption = this.option;\n\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\n        var extent = asc([thisOption.min, thisOption.max]);\n\n        this._dataExtent = extent;\n    },\n\n    /**\n     * @public\n     * @param {module:echarts/data/List} list\n     * @return {string} Concrete dimention. If return null/undefined,\n     *                  no dimension used.\n     */\n    getDataDimension: function (list) {\n        var optDim = this.option.dimension;\n        var listDimensions = list.dimensions;\n        if (optDim == null && !listDimensions.length) {\n            return;\n        }\n\n        if (optDim != null) {\n            return list.getDimension(optDim);\n        }\n\n        var dimNames = list.dimensions;\n        for (var i = dimNames.length - 1; i >= 0; i--) {\n            var dimName = dimNames[i];\n            var dimInfo = list.getDimensionInfo(dimName);\n            if (!dimInfo.isCalculationCoord) {\n                return dimName;\n            }\n        }\n    },\n\n    /**\n     * @public\n     * @override\n     */\n    getExtent: function () {\n        return this._dataExtent.slice();\n    },\n\n    /**\n     * @protected\n     */\n    completeVisualOption: function () {\n        var ecModel = this.ecModel;\n        var thisOption = this.option;\n        var base = {inRange: thisOption.inRange, outOfRange: thisOption.outOfRange};\n\n        var target = thisOption.target || (thisOption.target = {});\n        var controller = thisOption.controller || (thisOption.controller = {});\n\n        zrUtil.merge(target, base); // Do not override\n        zrUtil.merge(controller, base); // Do not override\n\n        var isCategory = this.isCategory();\n\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\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            ) {\n                base.inRange = {color: thisOption.color.slice().reverse()};\n            }\n\n            // Compatible with previous logic, always give a defautl 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 defualt color, set inRange: {color: null}.\n            base.inRange = base.inRange || {color: ecModel.get('gradientColor')};\n\n            // If using shortcut like: {inRange: 'symbol'}, complete default value.\n            each(this.stateList, function (state) {\n                var visualType = base[state];\n\n                if (zrUtil.isString(visualType)) {\n                    var defa = visualDefault.get(visualType, 'active', isCategory);\n                    if (defa) {\n                        base[state] = {};\n                        base[state][visualType] = defa;\n                    }\n                    else {\n                        // Mark as not specified.\n                        delete base[state];\n                    }\n                }\n            }, this);\n        }\n\n        function completeInactive(base, stateExist, stateAbsent) {\n            var optExist = base[stateExist];\n            var optAbsent = base[stateAbsent];\n\n            if (optExist && !optAbsent) {\n                optAbsent = base[stateAbsent] = {};\n                each(optExist, function (visualData, visualType) {\n                    if (!VisualMapping.isValidType(visualType)) {\n                        return;\n                    }\n\n                    var defa = visualDefault.get(visualType, 'inactive', isCategory);\n\n                    if (defa != null) {\n                        optAbsent[visualType] = defa;\n\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'\n                            && !optAbsent.hasOwnProperty('opacity')\n                            && !optAbsent.hasOwnProperty('colorAlpha')\n                        ) {\n                            optAbsent.opacity = [0, 0];\n                        }\n                    }\n                });\n            }\n        }\n\n        function completeController(controller) {\n            var symbolExists = (controller.inRange || {}).symbol\n                || (controller.outOfRange || {}).symbol;\n            var symbolSizeExists = (controller.inRange || {}).symbolSize\n                || (controller.outOfRange || {}).symbolSize;\n            var inactiveColor = this.get('inactiveColor');\n\n            each(this.stateList, function (state) {\n\n                var itemSize = this.itemSize;\n                var visuals = controller[state];\n\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\n                // Consistent symbol and symbolSize if not specified.\n                if (visuals.symbol == null) {\n                    visuals.symbol = symbolExists\n                        && zrUtil.clone(symbolExists)\n                        || (isCategory ? 'roundRect' : ['roundRect']);\n                }\n                if (visuals.symbolSize == null) {\n                    visuals.symbolSize = symbolSizeExists\n                        && zrUtil.clone(symbolSizeExists)\n                        || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]);\n                }\n\n                // Filter square and none.\n                visuals.symbol = mapVisual(visuals.symbol, function (symbol) {\n                    return (symbol === 'none' || symbol === 'square') ? 'roundRect' : symbol;\n                });\n\n                // Normalize symbolSize\n                var symbolSize = visuals.symbolSize;\n\n                if (symbolSize != null) {\n                    var max = -Infinity;\n                    // symbolSize can be object when categories defined.\n                    eachVisual(symbolSize, function (value) {\n                        value > max && (max = value);\n                    });\n                    visuals.symbolSize = mapVisual(symbolSize, function (value) {\n                        return linearMap(value, [0, max], [0, itemSize[0]], true);\n                    });\n                }\n\n            }, this);\n        }\n    },\n\n    /**\n     * @protected\n     */\n    resetItemSize: function () {\n        this.itemSize = [\n            parseFloat(this.get('itemWidth')),\n            parseFloat(this.get('itemHeight'))\n        ];\n    },\n\n    /**\n     * @public\n     */\n    isCategory: function () {\n        return !!this.option.categories;\n    },\n\n    /**\n     * @public\n     * @abstract\n     */\n    setSelected: noop,\n\n    /**\n     * @public\n     * @abstract\n     * @param {*|module:echarts/data/List} valueOrData\n     * @param {number} dataIndex\n     * @return {string} state See this.stateList\n     */\n    getValueState: noop,\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 {Function} getColorVisual\n     *        params: value, valueState\n     *        return: color\n     * @return {Object} visualMeta\n     *        should includes {stops, outerColors}\n     *        outerColor means [colorBeyondMinValue, colorBeyondMaxValue]\n     */\n    getVisualMeta: noop\n\n});\n\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport VisualMapModel from './VisualMapModel';\nimport * as numberUtil from '../../util/number';\n\n// Constant\nvar DEFAULT_BAR_BOUND = [20, 140];\n\nvar ContinuousModel = VisualMapModel.extend({\n\n    type: 'visualMap.continuous',\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        align: 'auto',           // 'auto', 'left', 'right', 'top', 'bottom'\n        calculable: false,       // This prop effect default component type determine,\n                                 // See echarts/component/visualMap/typeDefaulter.\n        range: null,             // selected range. In default case `range` is [min, max]\n                                 // and can auto change along with modification of min max,\n                                 // util use specifid a range.\n        realtime: true,          // Whether realtime update.\n        itemHeight: null,        // The length of the range control edge.\n        itemWidth: null,         // The length of the other side.\n        hoverLink: true,         // Enable hover highlight.\n        hoverLinkDataSize: null, // The size of hovered data.\n        hoverLinkOnHandle: null  // Whether trigger hoverLink when hover handle.\n                                 // If not specified, follow the value of `realtime`.\n    },\n\n    /**\n     * @override\n     */\n    optionUpdated: function (newOption, isInit) {\n        ContinuousModel.superApply(this, 'optionUpdated', arguments);\n\n        this.resetExtent();\n\n        this.resetVisual(function (mappingOption) {\n            mappingOption.mappingMethod = 'linear';\n            mappingOption.dataExtent = this.getExtent();\n        });\n\n        this._resetRange();\n    },\n\n    /**\n     * @protected\n     * @override\n     */\n    resetItemSize: function () {\n        ContinuousModel.superApply(this, 'resetItemSize', arguments);\n\n        var itemSize = this.itemSize;\n\n        this._orient === 'horizontal' && itemSize.reverse();\n\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    /**\n     * @private\n     */\n    _resetRange: function () {\n        var dataExtent = this.getExtent();\n        var range = this.option.range;\n\n        if (!range || range.auto) {\n            // `range` should always be array (so we dont use other\n            // value like 'auto') for user-friend. (consider getOption).\n            dataExtent.auto = 1;\n            this.option.range = dataExtent;\n        }\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    /**\n     * @protected\n     * @override\n     */\n    completeVisualOption: function () {\n        VisualMapModel.prototype.completeVisualOption.apply(this, arguments);\n\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] = 0; // For good looking.\n            }\n        }, this);\n    },\n\n    /**\n     * @override\n     */\n    setSelected: function (selected) {\n        this.option.range = selected.slice();\n        this._resetRange();\n    },\n\n    /**\n     * @public\n     */\n    getSelected: function () {\n        var dataExtent = this.getExtent();\n\n        var dataInterval = numberUtil.asc(\n            (this.get('range') || []).slice()\n        );\n\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\n        return dataInterval;\n    },\n\n    /**\n     * @override\n     */\n    getValueState: function (value) {\n        var range = this.option.range;\n        var dataExtent = this.getExtent();\n\n        // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.\n        // range[1] is processed likewise.\n        return (\n            (range[0] <= dataExtent[0] || range[0] <= value)\n            && (range[1] >= dataExtent[1] || value <= range[1])\n        ) ? 'inRange' : 'outOfRange';\n    },\n\n    /**\n     * @params {Array.<number>} range target value: range[0] <= value && value <= range[1]\n     * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...]\n     */\n    findTargetDataIndices: function (range) {\n        var result = [];\n\n        this.eachTargetSeries(function (seriesModel) {\n            var dataIndices = [];\n            var data = seriesModel.getData();\n\n            data.each(this.getDataDimension(data), function (value, dataIndex) {\n                range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);\n            }, this);\n\n            result.push({seriesId: seriesModel.id, dataIndex: dataIndices});\n        }, this);\n\n        return result;\n    },\n\n    /**\n     * @implement\n     */\n    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\n        function setStop(value, valueState) {\n            stops.push({\n                value: value,\n                color: getColorVisual(value, valueState)\n            });\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\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\n        var stopsLen = stops.length;\n\n        return {\n            stops: stops,\n            outerColors: [\n                stopsLen ? stops[0].color : 'transparent',\n                stopsLen ? stops[stopsLen - 1].color : 'transparent'\n            ]\n        };\n    }\n\n});\n\nfunction getColorStopValues(visualMapModel, valueState, dataExtent) {\n    if (dataExtent[0] === dataExtent[1]) {\n        return dataExtent.slice();\n    }\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\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\n    return stopValues;\n}\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\nimport * as echarts from '../../echarts';\nimport * as zrUtil from 'zrender/src/core/util';\nimport * as graphic from '../../util/graphic';\nimport * as formatUtil from '../../util/format';\nimport * as layout from '../../util/layout';\nimport VisualMapping from '../../visual/VisualMapping';\n\nexport default echarts.extendComponentView({\n\n    type: 'visualMap',\n\n    /**\n     * @readOnly\n     * @type {Object}\n     */\n    autoPositionValues: {left: 1, right: 1, top: 1, bottom: 1},\n\n    init: function (ecModel, api) {\n        /**\n         * @readOnly\n         * @type {module:echarts/model/Global}\n         */\n        this.ecModel = ecModel;\n\n        /**\n         * @readOnly\n         * @type {module:echarts/ExtensionAPI}\n         */\n        this.api = api;\n\n        /**\n         * @readOnly\n         * @type {module:echarts/component/visualMap/visualMapModel}\n         */\n        this.visualMapModel;\n    },\n\n    /**\n     * @protected\n     */\n    render: function (visualMapModel, ecModel, api, payload) {\n        this.visualMapModel = visualMapModel;\n\n        if (visualMapModel.get('show') === false) {\n            this.group.removeAll();\n            return;\n        }\n\n        this.doRender.apply(this, arguments);\n    },\n\n    /**\n     * @protected\n     */\n    renderBackground: function (group) {\n        var visualMapModel = this.visualMapModel;\n        var padding = formatUtil.normalizeCssArray(visualMapModel.get('padding') || 0);\n        var rect = group.getBoundingRect();\n\n        group.add(new graphic.Rect({\n            z2: -1, // Lay background rect on the lowest layer.\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    /**\n     * @protected\n     * @param {number} targetValue can be Infinity or -Infinity\n     * @param {string=} visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize'\n     * @param {Object} [opts]\n     * @param {string=} [opts.forceState] Specify state, instead of using getValueState method.\n     * @param {string=} [opts.convertOpacityToAlpha=false] For color gradient in controller widget.\n     * @return {*} Visual value.\n     */\n    getControllerVisual: function (targetValue, visualCluster, opts) {\n        opts = opts || {};\n\n        var forceState = opts.forceState;\n        var visualMapModel = this.visualMapModel;\n        var visualObj = {};\n\n        // Default values.\n        if (visualCluster === 'symbol') {\n            visualObj.symbol = visualMapModel.get('itemSymbol');\n        }\n        if (visualCluster === 'color') {\n            var defaultColor = visualMapModel.get('contentColor');\n            visualObj.color = defaultColor;\n        }\n\n        function getter(key) {\n            return visualObj[key];\n        }\n\n        function setter(key, value) {\n            visualObj[key] = value;\n        }\n\n        var mappings = visualMapModel.controllerVisuals[\n            forceState || visualMapModel.getValueState(targetValue)\n        ];\n        var visualTypes = VisualMapping.prepareVisualTypes(mappings);\n\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(\n                    targetValue, getter, setter\n                );\n            }\n        });\n\n        return visualObj[visualCluster];\n    },\n\n    /**\n     * @protected\n     */\n    positionGroup: function (group) {\n        var model = this.visualMapModel;\n        var api = this.api;\n\n        layout.positionElement(\n            group,\n            model.getBoxLayoutParams(),\n            {width: api.getWidth(), height: api.getHeight()}\n        );\n    },\n\n    /**\n     * @protected\n     * @abstract\n     */\n    doRender: zrUtil.noop\n\n});\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport {getLayoutRect} from '../../util/layout';\n\n/**\n * @param {module:echarts/component/visualMap/VisualMapModel} visualMapModel\\\n * @param {module:echarts/ExtensionAPI} api\n * @param {Array.<number>} 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\n    if (itemAlign != null && itemAlign !== 'auto') {\n        return itemAlign;\n    }\n\n    // Auto decision align.\n    var ecSize = {width: api.getWidth(), height: api.getHeight()};\n    var realIndex = modelOption.orient === 'horizontal' ? 1 : 0;\n\n    var paramsSet = [\n        ['left', 'right', 'width'],\n        ['top', 'bottom', 'height']\n    ];\n    var reals = paramsSet[realIndex];\n    var fakeValue = [0, null, 10];\n\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\n    var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex];\n    var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding);\n\n    return reals[\n        (rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5\n            < ecSize[rParam[1]] * 0.5 ? 0 : 1\n    ];\n}\n\n/**\n * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and\n * dataIndexInside means filtered index.\n */\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\nimport * as zrUtil from 'zrender/src/core/util';\nimport LinearGradient from 'zrender/src/graphic/LinearGradient';\nimport * as eventTool from 'zrender/src/core/event';\nimport VisualMapView from './VisualMapView';\nimport * as graphic from '../../util/graphic';\nimport * as numberUtil from '../../util/number';\nimport sliderMove from '../helper/sliderMove';\nimport * as helper from './helper';\nimport * as modelUtil from '../../util/model';\n\nvar linearMap = numberUtil.linearMap;\nvar each = zrUtil.each;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\n\n// Arbitrary value\nvar HOVER_LINK_SIZE = 12;\nvar HOVER_LINK_OUT = 6;\n\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.\n\nvar ContinuousView = VisualMapView.extend({\n\n    type: 'visualMap.continuous',\n\n    /**\n     * @override\n     */\n    init: function () {\n\n        ContinuousView.superApply(this, 'init', arguments);\n\n        /**\n         * @private\n         */\n        this._shapes = {};\n\n        /**\n         * @private\n         */\n        this._dataInterval = [];\n\n        /**\n         * @private\n         */\n        this._handleEnds = [];\n\n        /**\n         * @private\n         */\n        this._orient;\n\n        /**\n         * @private\n         */\n        this._useHandle;\n\n        /**\n         * @private\n         */\n        this._hoverLinkDataIndices = [];\n\n        /**\n         * @private\n         */\n        this._dragging;\n\n        /**\n         * @private\n         */\n        this._hovering;\n    },\n\n    /**\n     * @protected\n     * @override\n     */\n    doRender: function (visualMapModel, ecModel, api, payload) {\n        if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {\n            this._buildView();\n        }\n    },\n\n    /**\n     * @private\n     */\n    _buildView: function () {\n        this.group.removeAll();\n\n        var visualMapModel = this.visualMapModel;\n        var thisGroup = this.group;\n\n        this._orient = visualMapModel.get('orient');\n        this._useHandle = visualMapModel.get('calculable');\n\n        this._resetInterval();\n\n        this._renderBar(thisGroup);\n\n        var dataRangeText = visualMapModel.get('text');\n        this._renderEndsText(thisGroup, dataRangeText, 0);\n        this._renderEndsText(thisGroup, dataRangeText, 1);\n\n        // Do this for background size calculation.\n        this._updateView(true);\n\n        // After updating view, inner shapes is built completely,\n        // and then background can be rendered.\n        this.renderBackground(thisGroup);\n\n        // Real update view\n        this._updateView();\n\n        this._enableHoverLinkToSeries();\n        this._enableHoverLinkFromSeries();\n\n        this.positionGroup(thisGroup);\n    },\n\n    /**\n     * @private\n     */\n    _renderEndsText: function (group, dataRangeText, endsIndex) {\n        if (!dataRangeText) {\n            return;\n        }\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\n        var visualMapModel = this.visualMapModel;\n        var textGap = visualMapModel.get('textGap');\n        var itemSize = visualMapModel.itemSize;\n\n        var barGroup = this._shapes.barGroup;\n        var position = this._applyTransform(\n            [\n                itemSize[0] / 2,\n                endsIndex === 0 ? -textGap : itemSize[1] + textGap\n            ],\n            barGroup\n        );\n        var align = this._applyTransform(\n            endsIndex === 0 ? 'bottom' : 'top',\n            barGroup\n        );\n        var orient = this._orient;\n        var textStyleModel = this.visualMapModel.textStyleModel;\n\n        this.group.add(new graphic.Text({\n            style: {\n                x: position[0],\n                y: position[1],\n                textVerticalAlign: orient === 'horizontal' ? 'middle' : align,\n                textAlign: orient === 'horizontal' ? align : 'center',\n                text: text,\n                textFont: textStyleModel.getFont(),\n                textFill: textStyleModel.getTextColor()\n            }\n        }));\n    },\n\n    /**\n     * @private\n     */\n    _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 barGroup = shapes.barGroup = this._createBarGroup(itemAlign);\n\n        // Bar\n        barGroup.add(shapes.outOfRange = createPolygon());\n        barGroup.add(shapes.inRange = createPolygon(\n            null,\n            useHandle ? getCursor(this._orient) : null,\n            zrUtil.bind(this._dragHandle, this, 'all', false),\n            zrUtil.bind(this._dragHandle, this, 'all', true)\n        ));\n\n        var textRect = visualMapModel.textStyleModel.getTextRect('国');\n        var textSize = mathMax(textRect.width, textRect.height);\n\n        // Handle\n        if (useHandle) {\n            shapes.handleThumbs = [];\n            shapes.handleLabels = [];\n            shapes.handleLabelPoints = [];\n\n            this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign);\n            this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign);\n        }\n\n        this._createIndicator(barGroup, itemSize, textSize, orient);\n\n        targetGroup.add(barGroup);\n    },\n\n    /**\n     * @private\n     */\n    _createHandle: function (barGroup, 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 handleThumb = createPolygon(\n            createHandlePoints(handleIndex, textSize),\n            getCursor(this._orient),\n            onDrift,\n            onDragEnd\n        );\n        handleThumb.position[0] = itemSize[0];\n        barGroup.add(handleThumb);\n\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            draggable: true,\n            drift: onDrift,\n            onmousemove: function (e) {\n                // Fot mobile devicem, prevent screen slider on the button.\n                eventTool.stop(e.event);\n            },\n            ondragend: onDragEnd,\n            style: {\n                x: 0, y: 0, text: '',\n                textFont: textStyleModel.getFont(),\n                textFill: textStyleModel.getTextColor()\n            }\n        });\n        this.group.add(handleLabel);\n\n        var handleLabelPoint = [\n            orient === 'horizontal'\n                ? textSize / 2\n                : textSize * 1.5,\n            orient === 'horizontal'\n                ? (handleIndex === 0 ? -(textSize * 1.5) : (textSize * 1.5))\n                : (handleIndex === 0 ? -textSize / 2 : textSize / 2)\n        ];\n\n        var shapes = this._shapes;\n        shapes.handleThumbs[handleIndex] = handleThumb;\n        shapes.handleLabelPoints[handleIndex] = handleLabelPoint;\n        shapes.handleLabels[handleIndex] = handleLabel;\n    },\n\n    /**\n     * @private\n     */\n    _createIndicator: function (barGroup, itemSize, textSize, orient) {\n        var indicator = createPolygon([[0, 0]], 'move');\n        indicator.position[0] = itemSize[0];\n        indicator.attr({invisible: true, silent: true});\n        barGroup.add(indicator);\n\n        var textStyleModel = this.visualMapModel.textStyleModel;\n        var indicatorLabel = new graphic.Text({\n            silent: true,\n            invisible: true,\n            style: {\n                x: 0, y: 0, text: '',\n                textFont: textStyleModel.getFont(),\n                textFill: textStyleModel.getTextColor()\n            }\n        });\n        this.group.add(indicatorLabel);\n\n        var indicatorLabelPoint = [\n            orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT + 3,\n            0\n        ];\n\n        var shapes = this._shapes;\n        shapes.indicator = indicator;\n        shapes.indicatorLabel = indicatorLabel;\n        shapes.indicatorLabelPoint = indicatorLabelPoint;\n    },\n\n    /**\n     * @private\n     */\n    _dragHandle: function (handleIndex, isEnd, dx, dy) {\n        if (!this._useHandle) {\n            return;\n        }\n\n        this._dragging = !isEnd;\n\n        if (!isEnd) {\n            // Transform dx, dy to bar coordination.\n            var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true);\n            this._updateInterval(handleIndex, vertex[1]);\n\n            // Considering realtime, update view should be executed\n            // before dispatch action.\n            this._updateView();\n        }\n\n        // dragEnd do not dispatch action when realtime.\n        if (isEnd === !this.visualMapModel.get('realtime')) { // 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\n        if (isEnd) {\n            !this._hovering && this._clearHoverLinkToSeries();\n        }\n        else if (useHoverLinkOnHandle(this.visualMapModel)) {\n            this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);\n        }\n    },\n\n    /**\n     * @private\n     */\n    _resetInterval: function () {\n        var visualMapModel = this.visualMapModel;\n\n        var dataInterval = this._dataInterval = visualMapModel.getSelected();\n        var dataExtent = visualMapModel.getExtent();\n        var sizeExtent = [0, visualMapModel.itemSize[1]];\n\n        this._handleEnds = [\n            linearMap(dataInterval[0], dataExtent, sizeExtent, true),\n            linearMap(dataInterval[1], dataExtent, sizeExtent, true)\n        ];\n    },\n\n    /**\n     * @private\n     * @param {(number|string)} handleIndex 0 or 1 or 'all'\n     * @param {number} dx\n     * @param {number} dy\n     */\n    _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\n        sliderMove(\n            delta,\n            handleEnds,\n            sizeExtent,\n            handleIndex,\n            // cross is forbiden\n            0\n        );\n\n        var dataExtent = visualMapModel.getExtent();\n        // Update data interval.\n        this._dataInterval = [\n            linearMap(handleEnds[0], sizeExtent, dataExtent, true),\n            linearMap(handleEnds[1], sizeExtent, dataExtent, true)\n        ];\n    },\n\n    /**\n     * @private\n     */\n    _updateView: function (forSketch) {\n        var visualMapModel = this.visualMapModel;\n        var dataExtent = visualMapModel.getExtent();\n        var shapes = this._shapes;\n\n        var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];\n        var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;\n\n        var visualInRange = this._createBarVisual(\n            this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'\n        );\n        var visualOutOfRange = this._createBarVisual(\n            dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'\n        );\n\n        shapes.inRange\n            .setStyle({\n                fill: visualInRange.barColor,\n                opacity: visualInRange.opacity\n            })\n            .setShape('points', visualInRange.barPoints);\n        shapes.outOfRange\n            .setStyle({\n                fill: visualOutOfRange.barColor,\n                opacity: visualOutOfRange.opacity\n            })\n            .setShape('points', visualOutOfRange.barPoints);\n\n        this._updateHandle(inRangeHandleEnds, visualInRange);\n    },\n\n    /**\n     * @private\n     */\n    _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) {\n        var opts = {\n            forceState: forceState,\n            convertOpacityToAlpha: true\n        };\n        var colorStops = this._makeColorGradient(dataInterval, opts);\n\n        var symbolSizes = [\n            this.getControllerVisual(dataInterval[0], 'symbolSize', opts),\n            this.getControllerVisual(dataInterval[1], 'symbolSize', opts)\n        ];\n        var barPoints = this._createBarPoints(handleEnds, symbolSizes);\n\n        return {\n            barColor: new LinearGradient(0, 0, 0, 1, colorStops),\n            barPoints: barPoints,\n            handlesColor: [\n                colorStops[0].color,\n                colorStops[colorStops.length - 1].color\n            ]\n        };\n    },\n\n    /**\n     * @private\n     */\n    _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 caculate head\n        // and tail.\n        var sampleNumber = 100; // Arbitrary value.\n        var colorStops = [];\n        var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;\n\n        colorStops.push({\n            color: this.getControllerVisual(dataInterval[0], 'color', opts),\n            offset: 0\n        });\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\n        colorStops.push({\n            color: this.getControllerVisual(dataInterval[1], 'color', opts),\n            offset: 1\n        });\n\n        return colorStops;\n    },\n\n    /**\n     * @private\n     */\n    _createBarPoints: function (handleEnds, symbolSizes) {\n        var itemSize = this.visualMapModel.itemSize;\n\n        return [\n            [itemSize[0] - symbolSizes[0], handleEnds[0]],\n            [itemSize[0], handleEnds[0]],\n            [itemSize[0], handleEnds[1]],\n            [itemSize[0] - symbolSizes[1], handleEnds[1]]\n        ];\n    },\n\n    /**\n     * @private\n     */\n    _createBarGroup: function (itemAlign) {\n        var orient = this._orient;\n        var inverse = this.visualMapModel.get('inverse');\n\n        return new graphic.Group(\n            (orient === 'horizontal' && !inverse)\n            ? {scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1], rotation: Math.PI / 2}\n            : (orient === 'horizontal' && inverse)\n            ? {scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1], rotation: -Math.PI / 2}\n            : (orient === 'vertical' && !inverse)\n            ? {scale: itemAlign === 'left' ? [1, -1] : [-1, -1]}\n            : {scale: itemAlign === 'left' ? [1, 1] : [-1, 1]}\n        );\n    },\n\n    /**\n     * @private\n     */\n    _updateHandle: function (handleEnds, visualInRange) {\n        if (!this._useHandle) {\n            return;\n        }\n\n        var shapes = this._shapes;\n        var visualMapModel = this.visualMapModel;\n        var handleThumbs = shapes.handleThumbs;\n        var handleLabels = shapes.handleLabels;\n\n        each([0, 1], function (handleIndex) {\n            var handleThumb = handleThumbs[handleIndex];\n            handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);\n            handleThumb.position[1] = handleEnds[handleIndex];\n\n            // Update handle label position.\n            var textPoint = graphic.applyTransform(\n                shapes.handleLabelPoints[handleIndex],\n                graphic.getTransform(handleThumb, this.group)\n            );\n            handleLabels[handleIndex].setStyle({\n                x: textPoint[0],\n                y: textPoint[1],\n                text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),\n                textVerticalAlign: 'middle',\n                textAlign: this._applyTransform(\n                    this._orient === 'horizontal'\n                        ? (handleIndex === 0 ? 'bottom' : 'top')\n                        : 'left',\n                    shapes.barGroup\n                )\n            });\n        }, this);\n    },\n\n    /**\n     * @private\n     * @param {number} cursorValue\n     * @param {number} textValue\n     * @param {string} [rangeSymbol]\n     * @param {number} [halfHoverLinkSize]\n     */\n    _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 pos = linearMap(cursorValue, dataExtent, sizeExtent, true);\n\n        var shapes = this._shapes;\n        var indicator = shapes.indicator;\n        if (!indicator) {\n            return;\n        }\n\n        indicator.position[1] = pos;\n        indicator.attr('invisible', false);\n        indicator.setShape('points', createIndicatorPoints(\n            !!rangeSymbol, halfHoverLinkSize, pos, itemSize[1]\n        ));\n\n        var opts = {convertOpacityToAlpha: true};\n        var color = this.getControllerVisual(cursorValue, 'color', opts);\n        indicator.setStyle('fill', color);\n\n        // Update handle label position.\n        var textPoint = graphic.applyTransform(\n            shapes.indicatorLabelPoint,\n            graphic.getTransform(indicator, this.group)\n        );\n\n        var indicatorLabel = shapes.indicatorLabel;\n        indicatorLabel.attr('invisible', false);\n        var align = this._applyTransform('left', shapes.barGroup);\n        var orient = this._orient;\n        indicatorLabel.setStyle({\n            text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),\n            textVerticalAlign: orient === 'horizontal' ? align : 'middle',\n            textAlign: orient === 'horizontal' ? 'center' : align,\n            x: textPoint[0],\n            y: textPoint[1]\n        });\n    },\n\n    /**\n     * @private\n     */\n    _enableHoverLinkToSeries: function () {\n        var self = this;\n        this._shapes.barGroup\n\n            .on('mousemove', function (e) {\n                self._hovering = true;\n\n                if (!self._dragging) {\n                    var itemSize = self.visualMapModel.itemSize;\n                    var pos = self._applyTransform(\n                        [e.offsetX, e.offsetY], self._shapes.barGroup, true, true\n                    );\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(\n                        pos[1],\n                        0 <= pos[0] && pos[0] <= itemSize[0]\n                    );\n                }\n            })\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\n    /**\n     * @private\n     */\n    _enableHoverLinkFromSeries: function () {\n        var zr = this.api.getZr();\n\n        if (this.visualMapModel.option.hoverLink) {\n            zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);\n            zr.on('mouseout', this._hideIndicator, this);\n        }\n        else {\n            this._clearHoverLinkFromSeries();\n        }\n    },\n\n    /**\n     * @private\n     */\n    _doHoverLinkToSeries: function (cursorPos, hoverOnBar) {\n        var visualMapModel = this.visualMapModel;\n        var itemSize = visualMapModel.itemSize;\n\n        if (!visualMapModel.option.hoverLink) {\n            return;\n        }\n\n        var sizeExtent = [0, itemSize[1]];\n        var dataExtent = visualMapModel.getExtent();\n\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\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 = [\n            linearMap(hoverRange[0], sizeExtent, dataExtent, true),\n            linearMap(hoverRange[1], sizeExtent, dataExtent, true)\n        ];\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\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            }\n            else if (valueRange[1] === Infinity) {\n                this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);\n            }\n            else {\n                this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize);\n            }\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\n        var resultBatches = modelUtil.compressBatches(oldBatch, newBatch);\n\n        this._dispatchHighDown('downplay', helper.makeHighDownBatch(resultBatches[0], visualMapModel));\n        this._dispatchHighDown('highlight', helper.makeHighDownBatch(resultBatches[1], visualMapModel));\n    },\n\n    /**\n     * @private\n     */\n    _hoverLinkFromSeriesMouseOver: function (e) {\n        var el = e.target;\n        var visualMapModel = this.visualMapModel;\n\n        if (!el || el.dataIndex == null) {\n            return;\n        }\n\n        var dataModel = this.ecModel.getSeriesByIndex(el.seriesIndex);\n\n        if (!visualMapModel.isTargetSeries(dataModel)) {\n            return;\n        }\n\n        var data = dataModel.getData(el.dataType);\n        var value = data.get(visualMapModel.getDataDimension(data), el.dataIndex, true);\n\n        if (!isNaN(value)) {\n            this._showIndicator(value, value);\n        }\n    },\n\n    /**\n     * @private\n     */\n    _hideIndicator: function () {\n        var shapes = this._shapes;\n        shapes.indicator && shapes.indicator.attr('invisible', true);\n        shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);\n    },\n\n    /**\n     * @private\n     */\n    _clearHoverLinkToSeries: function () {\n        this._hideIndicator();\n\n        var indices = this._hoverLinkDataIndices;\n        this._dispatchHighDown('downplay', helper.makeHighDownBatch(indices, this.visualMapModel));\n\n        indices.length = 0;\n    },\n\n    /**\n     * @private\n     */\n    _clearHoverLinkFromSeries: function () {\n        this._hideIndicator();\n\n        var zr = this.api.getZr();\n        zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);\n        zr.off('mouseout', this._hideIndicator);\n    },\n\n    /**\n     * @private\n     */\n    _applyTransform: function (vertex, element, inverse, global) {\n        var transform = graphic.getTransform(element, global ? null : this.group);\n\n        return graphic[\n            zrUtil.isArray(vertex) ? 'applyTransform' : 'transformDirection'\n        ](vertex, transform, inverse);\n    },\n\n    /**\n     * @private\n     */\n    _dispatchHighDown: function (type, batch) {\n        batch && batch.length && this.api.dispatchAction({\n            type: type,\n            batch: batch\n        });\n    },\n\n    /**\n     * @override\n     */\n    dispose: function () {\n        this._clearHoverLinkFromSeries();\n        this._clearHoverLinkToSeries();\n    },\n\n    /**\n     * @override\n     */\n    remove: function () {\n        this._clearHoverLinkFromSeries();\n        this._clearHoverLinkToSeries();\n    }\n\n});\n\nfunction createPolygon(points, cursor, onDrift, onDragEnd) {\n    return new graphic.Polygon({\n        shape: {points: points},\n        draggable: !!onDrift,\n        cursor: cursor,\n        drift: onDrift,\n        onmousemove: function (e) {\n            // Fot mobile devicem, prevent screen slider on the button.\n            eventTool.stop(e.event);\n        },\n        ondragend: onDragEnd\n    });\n}\n\nfunction createHandlePoints(handleIndex, textSize) {\n    return handleIndex === 0\n        ? [[0, 0], [textSize, 0], [textSize, -textSize]]\n        : [[0, 0], [textSize, 0], [textSize, textSize]];\n}\n\nfunction createIndicatorPoints(isRange, halfHoverLinkSize, pos, extentMax) {\n    return isRange\n        ? [ // indicate range\n            [0, -mathMin(halfHoverLinkSize, mathMax(pos, 0))],\n            [HOVER_LINK_OUT, 0],\n            [0, mathMin(halfHoverLinkSize, mathMax(extentMax - pos, 0))]\n        ]\n        : [ // indicate single value\n            [0, 0], [5, -5], [5, 5]\n        ];\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}\n\nfunction useHoverLinkOnHandle(visualMapModel) {\n    var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle');\n    return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle);\n}\n\nfunction getCursor(orient) {\n    return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n}\n\nexport default ContinuousView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as echarts from '../../echarts';\n\nvar actionInfo = {\n    type: 'selectDataRange',\n    event: 'dataRangeSelected',\n    // FIXME use updateView appears wrong\n    update: 'update'\n};\n\necharts.registerAction(actionInfo, function (payload, ecModel) {\n\n    ecModel.eachComponent({mainType: 'visualMap', query: payload}, function (model) {\n        model.setSelected(payload.selected);\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 * DataZoom component entry\n */\n\nimport * as echarts from '../echarts';\nimport preprocessor from './visualMap/preprocessor';\n\nimport './visualMap/typeDefaulter';\nimport './visualMap/visualEncoding';\nimport './visualMap/ContinuousModel';\nimport './visualMap/ContinuousView';\nimport './visualMap/visualMapAction';\n\necharts.registerPreprocessor(preprocessor);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport {__DEV__} from '../../config';\nimport * as zrUtil from 'zrender/src/core/util';\nimport VisualMapModel from './VisualMapModel';\nimport VisualMapping from '../../visual/VisualMapping';\nimport visualDefault from '../../visual/visualDefault';\nimport {reformIntervals} from '../../util/number';\n\nvar PiecewiseModel = VisualMapModel.extend({\n\n    type: 'visualMap.piecewise',\n\n    /**\n     * Order Rule:\n     *\n     * option.categories / option.pieces / option.text / option.selected:\n     *     If !option.inverse,\n     *     Order when vertical: ['top', ..., 'bottom'].\n     *     Order when horizontal: ['left', ..., 'right'].\n     *     If option.inverse, the meaning of\n     *     the order should be reversed.\n     *\n     * this._pieceList:\n     *     The order is always [low, ..., high].\n     *\n     * Mapping from location to low-high:\n     *     If !option.inverse\n     *     When vertical, top is high.\n     *     When horizontal, right is high.\n     *     If option.inverse, reverse.\n     */\n\n    /**\n     * @protected\n     */\n    defaultOption: {\n        selected: null,             // Object. If not specified, means selected.\n                                    // When pieces and splitNumber: {'0': true, '5': true}\n                                    // When categories: {'cate1': false, 'cate3': true}\n                                    // When selected === false, means all unselected.\n\n        minOpen: false,             // Whether include values that smaller than `min`.\n        maxOpen: false,             // Whether include values that bigger than `max`.\n\n        align: 'auto',              // 'auto', 'left', 'right'\n        itemWidth: 20,              // When put the controller vertically, it is the length of\n                                    // horizontal side of each item. Otherwise, vertical side.\n        itemHeight: 14,             // When put the controller vertically, it is the length of\n                                    // vertical side of each item. Otherwise, horizontal side.\n        itemSymbol: 'roundRect',\n        pieceList: null,            // Each item is Object, with some of those attrs:\n                                    // {min, max, lt, gt, lte, gte, value,\n                                    // color, colorSaturation, colorAlpha, opacity,\n                                    // symbol, symbolSize}, which customize the range or visual\n                                    // coding of the certain piece. Besides, see \"Order Rule\".\n        categories: null,           // category names, like: ['some1', 'some2', 'some3'].\n                                    // Attr min/max are ignored when categories set. See \"Order Rule\"\n        splitNumber: 5,             // If set to 5, auto split five pieces equally.\n                                    // If set to 0 and component type not set, component type will be\n                                    // determined as \"continuous\". (It is less reasonable but for ec2\n                                    // compatibility, see echarts/component/visualMap/typeDefaulter)\n        selectedMode: 'multiple',   // Can be 'multiple' or 'single'.\n        itemGap: 10,                // The gap between two items, in px.\n        hoverLink: true,            // Enable hover highlight.\n\n        showLabel: null             // By default, when text is used, label will hide (the logic\n                                    // is remained for compatibility reason)\n    },\n\n    /**\n     * @override\n     */\n    optionUpdated: function (newOption, isInit) {\n        PiecewiseModel.superApply(this, 'optionUpdated', arguments);\n\n        /**\n         * The order is always [low, ..., high].\n         * [{text: string, interval: Array.<number>}, ...]\n         * @private\n         * @type {Array.<Object>}\n         */\n        this._pieceList = [];\n\n        this.resetExtent();\n\n        /**\n         * 'pieces', 'categories', 'splitNumber'\n         * @type {string}\n         */\n        var mode = this._mode = this._determineMode();\n\n        resetMethods[this._mode].call(this);\n\n        this._resetSelected(newOption, isInit);\n\n        var categories = this.option.categories;\n\n        this.resetVisual(function (mappingOption, state) {\n            if (mode === 'categories') {\n                mappingOption.mappingMethod = 'category';\n                mappingOption.categories = zrUtil.clone(categories);\n            }\n            else {\n                mappingOption.dataExtent = this.getExtent();\n                mappingOption.mappingMethod = 'piecewise';\n                mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) {\n                    var 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    /**\n     * @protected\n     * @override\n     */\n    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\n        var option = this.option;\n        var visualTypesInPieces = {};\n        var visualTypes = VisualMapping.listVisualTypes();\n        var isCategory = this.isCategory();\n\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\n        zrUtil.each(visualTypesInPieces, function (v, visualType) {\n            var exists = 0;\n            zrUtil.each(this.stateList, function (state) {\n                exists |= has(option, state, visualType)\n                    || has(option.target, state, visualType);\n            }, this);\n\n            !exists && zrUtil.each(this.stateList, function (state) {\n                (option[state] || (option[state] = {}))[visualType] = visualDefault.get(\n                    visualType, state === 'inRange' ? 'active' : 'inactive', isCategory\n                );\n            });\n        }, this);\n\n        function has(obj, state, visualType) {\n            return obj && obj[state] && (\n                zrUtil.isObject(obj[state])\n                    ? obj[state].hasOwnProperty(visualType)\n                    : obj[state] === visualType // e.g., inRange: 'symbol'\n            );\n        }\n\n        VisualMapModel.prototype.completeVisualOption.apply(this, arguments);\n    },\n\n    _resetSelected: function (newOption, isInit) {\n        var thisOption = this.option;\n        var pieceList = this._pieceList;\n\n        // Selected do not merge but all override.\n        var selected = (isInit ? thisOption : newOption).selected || {};\n        thisOption.selected = selected;\n\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\n        if (thisOption.selectedMode === 'single') {\n            // Ensure there is only one selected.\n            var hasSel = false;\n\n            zrUtil.each(pieceList, function (piece, index) {\n                var key = this.getSelectedMapKey(piece);\n                if (selected[key]) {\n                    hasSel\n                        ? (selected[key] = false)\n                        : (hasSel = true);\n                }\n            }, this);\n        }\n        // thisOption.selectedMode === 'multiple', default: all selected.\n    },\n\n    /**\n     * @public\n     */\n    getSelectedMapKey: function (piece) {\n        return this._mode === 'categories'\n            ? piece.value + '' : piece.index + '';\n    },\n\n    /**\n     * @public\n     */\n    getPieceList: function () {\n        return this._pieceList;\n    },\n\n    /**\n     * @private\n     * @return {string}\n     */\n    _determineMode: function () {\n        var option = this.option;\n\n        return option.pieces && option.pieces.length > 0\n            ? 'pieces'\n            : this.option.categories\n            ? 'categories'\n            : 'splitNumber';\n    },\n\n    /**\n     * @public\n     * @override\n     */\n    setSelected: function (selected) {\n        this.option.selected = zrUtil.clone(selected);\n    },\n\n    /**\n     * @public\n     * @override\n     */\n    getValueState: function (value) {\n        var index = VisualMapping.findPieceIndex(value, this._pieceList);\n\n        return index != null\n            ? (this.option.selected[this.getSelectedMapKey(this._pieceList[index])]\n                ? 'inRange' : 'outOfRange'\n            )\n            : 'outOfRange';\n    },\n\n    /**\n     * @public\n     * @params {number} pieceIndex piece index in visualMapModel.getPieceList()\n     * @return {Array.<Object>} [{seriesId, dataIndex: <Array.<number>>}, ...]\n     */\n    findTargetDataIndices: function (pieceIndex) {\n        var result = [];\n\n        this.eachTargetSeries(function (seriesModel) {\n            var dataIndices = [];\n            var data = seriesModel.getData();\n\n            data.each(this.getDataDimension(data), function (value, dataIndex) {\n                // Should always base on model pieceList, because it is order sensitive.\n                var pIdx = VisualMapping.findPieceIndex(value, this._pieceList);\n                pIdx === pieceIndex && dataIndices.push(dataIndex);\n            }, this);\n\n            result.push({seriesId: seriesModel.id, dataIndex: dataIndices});\n        }, this);\n\n        return result;\n    },\n\n    /**\n     * @private\n     * @param {Object} piece piece.value or piece.interval is required.\n     * @return {number} Can be Infinity or -Infinity\n     */\n    getRepresentValue: function (piece) {\n        var representValue;\n        if (this.isCategory()) {\n            representValue = piece.value;\n        }\n        else {\n            if (piece.value != null) {\n                representValue = piece.value;\n            }\n            else {\n                var pieceInterval = piece.interval || [];\n                representValue = (pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity)\n                    ? 0\n                    : (pieceInterval[0] + pieceInterval[1]) / 2;\n            }\n        }\n        return representValue;\n    },\n\n    getVisualMeta: function (getColorVisual) {\n        // Do not support category. (category axis is ordinal, numerical)\n        if (this.isCategory()) {\n            return;\n        }\n\n        var stops = [];\n        var outerColors = [];\n        var visualMapModel = this;\n\n        function setStop(interval, valueState) {\n            var representValue = visualMapModel.getRepresentValue({interval: interval});\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            }\n            else if (interval[1] === Infinity) {\n                outerColors[1] = color;\n            }\n            else {\n                stops.push(\n                    {value: interval[0], color: color},\n                    {value: interval[1], color: color}\n                );\n            }\n        }\n\n        // Suplement\n        var pieceList = this._pieceList.slice();\n        if (!pieceList.length) {\n            pieceList.push({interval: [-Infinity, Infinity]});\n        }\n        else {\n            var edge = pieceList[0].interval[0];\n            edge !== -Infinity && pieceList.unshift({interval: [-Infinity, edge]});\n            edge = pieceList[pieceList.length - 1].interval[1];\n            edge !== Infinity && pieceList.push({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\n        return {stops: stops, outerColors: outerColors};\n    }\n\n});\n\n/**\n * Key is this._mode\n * @type {Object}\n * @this {module:echarts/component/viusalMap/PiecewiseMode}\n */\nvar resetMethods = {\n\n    splitNumber: function () {\n        var thisOption = this.option;\n        var pieceList = this._pieceList;\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\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\n        var index = 0;\n\n        if (thisOption.minOpen) {\n            pieceList.push({\n                index: index++,\n                interval: [-Infinity, dataExtent[0]],\n                close: [0, 0]\n            });\n        }\n\n        for (\n            var curr = dataExtent[0], len = index + splitNumber;\n            index < len;\n            curr += splitStep\n        ) {\n            var max = index === splitNumber - 1 ? dataExtent[1] : (curr + splitStep);\n\n            pieceList.push({\n                index: index++,\n                interval: [curr, max],\n                close: [1, 1]\n            });\n        }\n\n        if (thisOption.maxOpen) {\n            pieceList.push({\n                index: index++,\n                interval: [dataExtent[1], Infinity],\n                close: [0, 0]\n            });\n        }\n\n        reformIntervals(pieceList);\n\n        zrUtil.each(pieceList, function (piece) {\n            piece.text = this.formatValueText(piece.interval);\n        }, this);\n    },\n\n    categories: function () {\n        var thisOption = this.option;\n        zrUtil.each(thisOption.categories, function (cate) {\n            // FIXME category模式也使用pieceList，但在visualMapping中不是使用pieceList。\n            // 是否改一致。\n            this._pieceList.push({\n                text: this.formatValueText(cate, true),\n                value: cate\n            });\n        }, this);\n\n        // See \"Order Rule\".\n        normalizeReverse(thisOption, this._pieceList);\n    },\n\n    pieces: function () {\n        var thisOption = this.option;\n        var pieceList = this._pieceList;\n\n        zrUtil.each(thisOption.pieces, function (pieceListItem, index) {\n\n            if (!zrUtil.isObject(pieceListItem)) {\n                pieceListItem = {value: pieceListItem};\n            }\n\n            var item = {text: '', index: index};\n\n            if (pieceListItem.label != null) {\n                item.text = pieceListItem.label;\n            }\n\n            if (pieceListItem.hasOwnProperty('value')) {\n                var value = item.value = pieceListItem.value;\n                item.interval = [value, value];\n                item.close = [1, 1];\n            }\n            else {\n                // `min` `max` is legacy option.\n                // `lt` `gt` `lte` `gte` is recommanded.\n                var interval = item.interval = [];\n                var close = item.close = [0, 0];\n\n                var closeList = [1, 0, 1];\n                var infinityList = [-Infinity, Infinity];\n\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[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[0] = 0);\n                useMinMax[1] && interval[0] === -Infinity && (close[1] = 0);\n\n                if (__DEV__) {\n                    if (interval[0] > interval[1]) {\n                        console.warn(\n                            'Piece ' + index + 'is illegal: ' + interval\n                            + ' lower bound should not greater then uppper bound.'\n                        );\n                    }\n                }\n\n                if (interval[0] === interval[1] && close[0] && close[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\n            item.visual = VisualMapping.retrieveVisuals(pieceListItem);\n\n            pieceList.push(item);\n\n        }, this);\n\n        // See \"Order Rule\".\n        normalizeReverse(thisOption, pieceList);\n        // Only pieces\n        reformIntervals(pieceList);\n\n        zrUtil.each(pieceList, function (piece) {\n            var close = piece.close;\n            var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]];\n            piece.text = piece.text || this.formatValueText(\n                piece.value != null ? piece.value : piece.interval,\n                false,\n                edgeSymbols\n            );\n        }, this);\n    }\n};\n\nfunction normalizeReverse(thisOption, pieceList) {\n    var inverse = thisOption.inverse;\n    if (thisOption.orient === 'vertical' ? !inverse : inverse) {\n            pieceList.reverse();\n    }\n}\n\nexport default PiecewiseModel;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nimport * as zrUtil from 'zrender/src/core/util';\nimport VisualMapView from './VisualMapView';\nimport * as graphic from '../../util/graphic';\nimport {createSymbol} from '../../util/symbol';\nimport * as layout from '../../util/layout';\nimport * as helper from './helper';\n\nvar PiecewiseVisualMapView = VisualMapView.extend({\n\n    type: 'visualMap.piecewise',\n\n    /**\n     * @protected\n     * @override\n     */\n    doRender: function () {\n        var thisGroup = this.group;\n\n        thisGroup.removeAll();\n\n        var visualMapModel = this.visualMapModel;\n        var textGap = visualMapModel.get('textGap');\n        var textStyleModel = visualMapModel.textStyleModel;\n        var textFont = textStyleModel.getFont();\n        var textFill = textStyleModel.getTextColor();\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\n        endsText && this._renderEndsText(\n            thisGroup, endsText[0], itemSize, showLabel, itemAlign\n        );\n\n        zrUtil.each(viewData.viewPieceList, renderItem, this);\n\n        endsText && this._renderEndsText(\n            thisGroup, endsText[1], itemSize, showLabel, itemAlign\n        );\n\n        layout.box(\n            visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')\n        );\n\n        this.renderBackground(thisGroup);\n\n        this.positionGroup(thisGroup);\n\n        function renderItem(item) {\n            var piece = item.piece;\n\n            var itemGroup = new graphic.Group();\n            itemGroup.onclick = zrUtil.bind(this._onItemClick, this, piece);\n\n            this._enableHoverLink(itemGroup, item.indexInModelPieceList);\n\n            var representValue = visualMapModel.getRepresentValue(piece);\n\n            this._createItemSymbol(\n                itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]\n            );\n\n            if (showLabel) {\n                var visualState = this.visualMapModel.getValueState(representValue);\n\n                itemGroup.add(new graphic.Text({\n                    style: {\n                        x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap,\n                        y: itemSize[1] / 2,\n                        text: piece.text,\n                        textVerticalAlign: 'middle',\n                        textAlign: itemAlign,\n                        textFont: textFont,\n                        textFill: textFill,\n                        opacity: visualState === 'outOfRange' ? 0.5 : 1\n                    }\n                }));\n            }\n\n            thisGroup.add(itemGroup);\n        }\n    },\n\n    /**\n     * @private\n     */\n    _enableHoverLink: function (itemGroup, pieceIndex) {\n        itemGroup\n            .on('mouseover', zrUtil.bind(onHoverLink, this, 'highlight'))\n            .on('mouseout', zrUtil.bind(onHoverLink, this, 'downplay'));\n\n        function onHoverLink(method) {\n            var visualMapModel = this.visualMapModel;\n\n            visualMapModel.option.hoverLink && this.api.dispatchAction({\n                type: method,\n                batch: helper.makeHighDownBatch(\n                    visualMapModel.findTargetDataIndices(pieceIndex),\n                    visualMapModel\n                )\n            });\n        }\n    },\n\n    /**\n     * @private\n     */\n    _getItemAlign: function () {\n        var visualMapModel = this.visualMapModel;\n        var modelOption = visualMapModel.option;\n\n        if (modelOption.orient === 'vertical') {\n            return helper.getItemAlign(\n                visualMapModel, this.api, visualMapModel.itemSize\n            );\n        }\n        else { // 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\n    /**\n     * @private\n     */\n    _renderEndsText: function (group, text, itemSize, showLabel, itemAlign) {\n        if (!text) {\n            return;\n        }\n\n        var itemGroup = new graphic.Group();\n        var textStyleModel = this.visualMapModel.textStyleModel;\n\n        itemGroup.add(new graphic.Text({\n            style: {\n                x: showLabel ? (itemAlign === 'right' ? itemSize[0] : 0) : itemSize[0] / 2,\n                y: itemSize[1] / 2,\n                textVerticalAlign: 'middle',\n                textAlign: showLabel ? itemAlign : 'center',\n                text: text,\n                textFont: textStyleModel.getFont(),\n                textFill: textStyleModel.getTextColor()\n            }\n        }));\n\n        group.add(itemGroup);\n    },\n\n    /**\n     * @private\n     * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.\n     */\n    _getViewData: function () {\n        var visualMapModel = this.visualMapModel;\n\n        var viewPieceList = zrUtil.map(visualMapModel.getPieceList(), function (piece, index) {\n            return {piece: piece, indexInModelPieceList: index};\n        });\n        var endsText = visualMapModel.get('text');\n\n        // Consider orient and inverse.\n        var orient = visualMapModel.get('orient');\n        var inverse = visualMapModel.get('inverse');\n\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\n        return {viewPieceList: viewPieceList, endsText: endsText};\n    },\n\n    /**\n     * @private\n     */\n    _createItemSymbol: function (group, representValue, shapeParam) {\n        group.add(createSymbol(\n            this.getControllerVisual(representValue, 'symbol'),\n            shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3],\n            this.getControllerVisual(representValue, 'color')\n        ));\n    },\n\n    /**\n     * @private\n     */\n    _onItemClick: function (piece) {\n        var visualMapModel = this.visualMapModel;\n        var option = visualMapModel.option;\n        var selected = zrUtil.clone(option.selected);\n        var newKey = visualMapModel.getSelectedMapKey(piece);\n\n        if (option.selectedMode === 'single') {\n            selected[newKey] = true;\n            zrUtil.each(selected, function (o, key) {\n                selected[key] = key === newKey;\n            });\n        }\n        else {\n            selected[newKey] = !selected[newKey];\n        }\n\n        this.api.dispatchAction({\n            type: 'selectDataRange',\n            from: this.uid,\n            visualMapId: this.visualMapModel.id,\n            selected: selected\n        });\n    }\n});\n\nexport default PiecewiseVisualMapView;","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * DataZoom component entry\n */\n\nimport * as echarts from '../echarts';\nimport preprocessor from './visualMap/preprocessor';\n\nimport './visualMap/typeDefaulter';\nimport './visualMap/visualEncoding';\nimport './visualMap/PiecewiseModel';\nimport './visualMap/PiecewiseView';\nimport './visualMap/visualMapAction';\n\necharts.registerPreprocessor(preprocessor);\n","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n/**\n * visualMap component entry\n */\n\nimport './visualMapContinuous';\nimport './visualMapPiecewise';\n","import env from '../core/env';\n\n\nvar urn = 'urn:schemas-microsoft-com:vml';\nvar win = typeof window === 'undefined' ? null : window;\n\nvar vmlInited = false;\n\nexport var doc = win && win.document;\n\nexport function createNode(tagName) {\n    return doCreateNode(tagName);\n}\n\n// Avoid assign to an exported variable, for transforming to cjs.\nvar doCreateNode;\n\nif (doc && !env.canvasSupported) {\n    try {\n        !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn);\n        doCreateNode = function (tagName) {\n            return doc.createElement('<zrvml:' + tagName + ' class=\"zrvml\">');\n        };\n    }\n    catch (e) {\n        doCreateNode = function (tagName) {\n            return doc.createElement('<' + tagName + ' xmlns=\"' + urn + '\" class=\"zrvml\">');\n        };\n    }\n}\n\n// From raphael\nexport function initVML() {\n    if (vmlInited || !doc) {\n        return;\n    }\n    vmlInited = true;\n\n    var styleSheets = doc.styleSheets;\n    if (styleSheets.length < 31) {\n        doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)');\n    }\n    else {\n        // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\n        styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)');\n    }\n}\n","// http://www.w3.org/TR/NOTE-VML\n// TODO Use proxy like svg instead of overwrite brush methods\n\nimport env from '../core/env';\nimport {applyTransform} from '../core/vector';\nimport BoundingRect from '../core/BoundingRect';\nimport * as colorTool from '../tool/color';\nimport * as textContain from '../contain/text';\nimport * as textHelper from '../graphic/helper/text';\nimport RectText from '../graphic/mixin/RectText';\nimport Displayable from '../graphic/Displayable';\nimport ZImage from '../graphic/Image';\nimport Text from '../graphic/Text';\nimport Path from '../graphic/Path';\nimport PathProxy from '../core/PathProxy';\nimport Gradient from '../graphic/Gradient';\nimport * as vmlCore from './core';\n\nvar CMD = PathProxy.CMD;\nvar round = Math.round;\nvar sqrt = Math.sqrt;\nvar abs = Math.abs;\nvar cos = Math.cos;\nvar sin = Math.sin;\nvar mathMax = Math.max;\n\nif (!env.canvasSupported) {\n\n    var comma = ',';\n    var imageTransformPrefix = 'progid:DXImageTransform.Microsoft';\n\n    var Z = 21600;\n    var Z2 = Z / 2;\n\n    var ZLEVEL_BASE = 100000;\n    var Z_BASE = 1000;\n\n    var initRootElStyle = function (el) {\n        el.style.cssText = 'position:absolute;left:0;top:0;width:1px;height:1px;';\n        el.coordsize = Z + ',' + Z;\n        el.coordorigin = '0,0';\n    };\n\n    var encodeHtmlAttribute = function (s) {\n        return String(s).replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n    };\n\n    var rgb2Str = function (r, g, b) {\n        return 'rgb(' + [r, g, b].join(',') + ')';\n    };\n\n    var append = function (parent, child) {\n        if (child && parent && child.parentNode !== parent) {\n            parent.appendChild(child);\n        }\n    };\n\n    var remove = function (parent, child) {\n        if (child && parent && child.parentNode === parent) {\n            parent.removeChild(child);\n        }\n    };\n\n    var getZIndex = function (zlevel, z, z2) {\n        // z 的取值范围为 [0, 1000]\n        return (parseFloat(zlevel) || 0) * ZLEVEL_BASE + (parseFloat(z) || 0) * Z_BASE + z2;\n    };\n\n    var parsePercent = function (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    };\n\n    /***************************************************\n     * PATH\n     **************************************************/\n\n    var setColorAndOpacity = function (el, color, opacity) {\n        var colorArr = colorTool.parse(color);\n        opacity = +opacity;\n        if (isNaN(opacity)) {\n            opacity = 1;\n        }\n        if (colorArr) {\n            el.color = rgb2Str(colorArr[0], colorArr[1], colorArr[2]);\n            el.opacity = opacity * colorArr[3];\n        }\n    };\n\n    var getColorAndAlpha = function (color) {\n        var colorArr = colorTool.parse(color);\n        return [\n            rgb2Str(colorArr[0], colorArr[1], colorArr[2]),\n            colorArr[3]\n        ];\n    };\n\n    var updateFillNode = function (el, style, zrEl) {\n        // TODO pattern\n        var fill = style.fill;\n        if (fill != null) {\n            // Modified from excanvas\n            if (fill instanceof Gradient) {\n                var gradientType;\n                var angle = 0;\n                var focus = [0, 0];\n                // additional offset\n                var shift = 0;\n                // scale factor for offset\n                var expansion = 1;\n                var rect = zrEl.getBoundingRect();\n                var rectWidth = rect.width;\n                var rectHeight = rect.height;\n                if (fill.type === 'linear') {\n                    gradientType = 'gradient';\n                    var transform = zrEl.transform;\n                    var p0 = [fill.x * rectWidth, fill.y * rectHeight];\n                    var p1 = [fill.x2 * rectWidth, fill.y2 * rectHeight];\n                    if (transform) {\n                        applyTransform(p0, p0, transform);\n                        applyTransform(p1, p1, transform);\n                    }\n                    var dx = p1[0] - p0[0];\n                    var dy = p1[1] - p0[1];\n                    angle = Math.atan2(dx, dy) * 180 / Math.PI;\n                    // The angle should be a non-negative number.\n                    if (angle < 0) {\n                        angle += 360;\n                    }\n\n                    // Very small angles produce an unexpected result because they are\n                    // converted to a scientific notation string.\n                    if (angle < 1e-6) {\n                        angle = 0;\n                    }\n                }\n                else {\n                    gradientType = 'gradientradial';\n                    var p0 = [fill.x * rectWidth, fill.y * rectHeight];\n                    var transform = zrEl.transform;\n                    var scale = zrEl.scale;\n                    var width = rectWidth;\n                    var height = rectHeight;\n                    focus = [\n                        // Percent in bounding rect\n                        (p0[0] - rect.x) / width,\n                        (p0[1] - rect.y) / height\n                    ];\n                    if (transform) {\n                        applyTransform(p0, p0, transform);\n                    }\n\n                    width /= scale[0] * Z;\n                    height /= scale[1] * Z;\n                    var dimension = mathMax(width, height);\n                    shift = 2 * 0 / dimension;\n                    expansion = 2 * fill.r / dimension - shift;\n                }\n\n                // We need to sort the color stops in ascending order by offset,\n                // otherwise IE won't interpret it correctly.\n                var stops = fill.colorStops.slice();\n                stops.sort(function (cs1, cs2) {\n                    return cs1.offset - cs2.offset;\n                });\n\n                var length = stops.length;\n                // Color and alpha list of first and last stop\n                var colorAndAlphaList = [];\n                var colors = [];\n                for (var i = 0; i < length; i++) {\n                    var stop = stops[i];\n                    var colorAndAlpha = getColorAndAlpha(stop.color);\n                    colors.push(stop.offset * expansion + shift + ' ' + colorAndAlpha[0]);\n                    if (i === 0 || i === length - 1) {\n                        colorAndAlphaList.push(colorAndAlpha);\n                    }\n                }\n\n                if (length >= 2) {\n                    var color1 = colorAndAlphaList[0][0];\n                    var color2 = colorAndAlphaList[1][0];\n                    var opacity1 = colorAndAlphaList[0][1] * style.opacity;\n                    var opacity2 = colorAndAlphaList[1][1] * style.opacity;\n\n                    el.type = gradientType;\n                    el.method = 'none';\n                    el.focus = '100%';\n                    el.angle = angle;\n                    el.color = color1;\n                    el.color2 = color2;\n                    el.colors = colors.join(',');\n                    // When colors attribute is used, the meanings of opacity and o:opacity2\n                    // are reversed.\n                    el.opacity = opacity2;\n                    // FIXME g_o_:opacity ?\n                    el.opacity2 = opacity1;\n                }\n                if (gradientType === 'radial') {\n                    el.focusposition = focus.join(',');\n                }\n            }\n            else {\n                // FIXME Change from Gradient fill to color fill\n                setColorAndOpacity(el, fill, style.opacity);\n            }\n        }\n    };\n\n    var updateStrokeNode = function (el, style) {\n        // if (style.lineJoin != null) {\n        //     el.joinstyle = style.lineJoin;\n        // }\n        // if (style.miterLimit != null) {\n        //     el.miterlimit = style.miterLimit * Z;\n        // }\n        // if (style.lineCap != null) {\n        //     el.endcap = style.lineCap;\n        // }\n        if (style.lineDash) {\n            el.dashstyle = style.lineDash.join(' ');\n        }\n        if (style.stroke != null && !(style.stroke instanceof Gradient)) {\n            setColorAndOpacity(el, style.stroke, style.opacity);\n        }\n    };\n\n    var updateFillAndStroke = function (vmlEl, type, style, zrEl) {\n        var isFill = type === 'fill';\n        var el = vmlEl.getElementsByTagName(type)[0];\n        // Stroke must have lineWidth\n        if (style[type] != null && style[type] !== 'none' && (isFill || (!isFill && style.lineWidth))) {\n            vmlEl[isFill ? 'filled' : 'stroked'] = 'true';\n            // FIXME Remove before updating, or set `colors` will throw error\n            if (style[type] instanceof Gradient) {\n                remove(vmlEl, el);\n            }\n            if (!el) {\n                el = vmlCore.createNode(type);\n            }\n\n            isFill ? updateFillNode(el, style, zrEl) : updateStrokeNode(el, style);\n            append(vmlEl, el);\n        }\n        else {\n            vmlEl[isFill ? 'filled' : 'stroked'] = 'false';\n            remove(vmlEl, el);\n        }\n    };\n\n    var points = [[], [], []];\n    var pathDataToString = function (path, m) {\n        var M = CMD.M;\n        var C = CMD.C;\n        var L = CMD.L;\n        var A = CMD.A;\n        var Q = CMD.Q;\n\n        var str = [];\n        var nPoint;\n        var cmdStr;\n        var cmd;\n        var i;\n        var xi;\n        var yi;\n        var data = path.data;\n        var dataLength = path.len();\n        for (i = 0; i < dataLength;) {\n            cmd = data[i++];\n            cmdStr = '';\n            nPoint = 0;\n            switch (cmd) {\n                case M:\n                    cmdStr = ' m ';\n                    nPoint = 1;\n                    xi = data[i++];\n                    yi = data[i++];\n                    points[0][0] = xi;\n                    points[0][1] = yi;\n                    break;\n                case L:\n                    cmdStr = ' l ';\n                    nPoint = 1;\n                    xi = data[i++];\n                    yi = data[i++];\n                    points[0][0] = xi;\n                    points[0][1] = yi;\n                    break;\n                case Q:\n                case C:\n                    cmdStr = ' c ';\n                    nPoint = 3;\n                    var x1 = data[i++];\n                    var y1 = data[i++];\n                    var x2 = data[i++];\n                    var y2 = data[i++];\n                    var x3;\n                    var y3;\n                    if (cmd === Q) {\n                        // Convert quadratic to cubic using degree elevation\n                        x3 = x2;\n                        y3 = y2;\n                        x2 = (x2 + 2 * x1) / 3;\n                        y2 = (y2 + 2 * y1) / 3;\n                        x1 = (xi + 2 * x1) / 3;\n                        y1 = (yi + 2 * y1) / 3;\n                    }\n                    else {\n                        x3 = data[i++];\n                        y3 = data[i++];\n                    }\n                    points[0][0] = x1;\n                    points[0][1] = y1;\n                    points[1][0] = x2;\n                    points[1][1] = y2;\n                    points[2][0] = x3;\n                    points[2][1] = y3;\n\n                    xi = x3;\n                    yi = y3;\n                    break;\n                case A:\n                    var x = 0;\n                    var y = 0;\n                    var sx = 1;\n                    var sy = 1;\n                    var angle = 0;\n                    if (m) {\n                        // Extract SRT from matrix\n                        x = m[4];\n                        y = m[5];\n                        sx = sqrt(m[0] * m[0] + m[1] * m[1]);\n                        sy = sqrt(m[2] * m[2] + m[3] * m[3]);\n                        angle = Math.atan2(-m[1] / sy, m[0] / sx);\n                    }\n\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++] + angle;\n                    var endAngle = data[i++] + startAngle + angle;\n                    // FIXME\n                    // var psi = data[i++];\n                    i++;\n                    var clockwise = data[i++];\n\n                    var x0 = cx + cos(startAngle) * rx;\n                    var y0 = cy + sin(startAngle) * ry;\n\n                    var x1 = cx + cos(endAngle) * rx;\n                    var y1 = cy + sin(endAngle) * ry;\n\n                    var type = clockwise ? ' wa ' : ' at ';\n                    if (Math.abs(x0 - x1) < 1e-4) {\n                        // IE won't render arches drawn counter clockwise if x0 == x1.\n                        if (Math.abs(endAngle - startAngle) > 1e-2) {\n                            // Offset x0 by 1/80 of a pixel. Use something\n                            // that can be represented in binary\n                            if (clockwise) {\n                                x0 += 270 / Z;\n                            }\n                        }\n                        else {\n                            // Avoid case draw full circle\n                            if (Math.abs(y0 - cy) < 1e-4) {\n                                if ((clockwise && x0 < cx) || (!clockwise && x0 > cx)) {\n                                    y1 -= 270 / Z;\n                                }\n                                else {\n                                    y1 += 270 / Z;\n                                }\n                            }\n                            else if ((clockwise && y0 < cy) || (!clockwise && y0 > cy)) {\n                                x1 += 270 / Z;\n                            }\n                            else {\n                                x1 -= 270 / Z;\n                            }\n                        }\n                    }\n                    str.push(\n                        type,\n                        round(((cx - rx) * sx + x) * Z - Z2), comma,\n                        round(((cy - ry) * sy + y) * Z - Z2), comma,\n                        round(((cx + rx) * sx + x) * Z - Z2), comma,\n                        round(((cy + ry) * sy + y) * Z - Z2), comma,\n                        round((x0 * sx + x) * Z - Z2), comma,\n                        round((y0 * sy + y) * Z - Z2), comma,\n                        round((x1 * sx + x) * Z - Z2), comma,\n                        round((y1 * sy + y) * Z - Z2)\n                    );\n\n                    xi = x1;\n                    yi = y1;\n                    break;\n                case CMD.R:\n                    var p0 = points[0];\n                    var p1 = points[1];\n                    // x0, y0\n                    p0[0] = data[i++];\n                    p0[1] = data[i++];\n                    // x1, y1\n                    p1[0] = p0[0] + data[i++];\n                    p1[1] = p0[1] + data[i++];\n\n                    if (m) {\n                        applyTransform(p0, p0, m);\n                        applyTransform(p1, p1, m);\n                    }\n\n                    p0[0] = round(p0[0] * Z - Z2);\n                    p1[0] = round(p1[0] * Z - Z2);\n                    p0[1] = round(p0[1] * Z - Z2);\n                    p1[1] = round(p1[1] * Z - Z2);\n                    str.push(\n                        // x0, y0\n                        ' m ', p0[0], comma, p0[1],\n                        // x1, y0\n                        ' l ', p1[0], comma, p0[1],\n                        // x1, y1\n                        ' l ', p1[0], comma, p1[1],\n                        // x0, y1\n                        ' l ', p0[0], comma, p1[1]\n                    );\n                    break;\n                case CMD.Z:\n                    // FIXME Update xi, yi\n                    str.push(' x ');\n            }\n\n            if (nPoint > 0) {\n                str.push(cmdStr);\n                for (var k = 0; k < nPoint; k++) {\n                    var p = points[k];\n\n                    m && applyTransform(p, p, m);\n                    // 不 round 会非常慢\n                    str.push(\n                        round(p[0] * Z - Z2), comma, round(p[1] * Z - Z2),\n                        k < nPoint - 1 ? comma : ''\n                    );\n                }\n            }\n        }\n\n        return str.join('');\n    };\n\n    // Rewrite the original path method\n    Path.prototype.brushVML = function (vmlRoot) {\n        var style = this.style;\n\n        var vmlEl = this._vmlEl;\n        if (!vmlEl) {\n            vmlEl = vmlCore.createNode('shape');\n            initRootElStyle(vmlEl);\n\n            this._vmlEl = vmlEl;\n        }\n\n        updateFillAndStroke(vmlEl, 'fill', style, this);\n        updateFillAndStroke(vmlEl, 'stroke', style, this);\n\n        var m = this.transform;\n        var needTransform = m != null;\n        var strokeEl = vmlEl.getElementsByTagName('stroke')[0];\n        if (strokeEl) {\n            var lineWidth = style.lineWidth;\n            // Get the line scale.\n            // Determinant of this.m_ means how much the area is enlarged by the\n            // transformation. So its square root can be used as a scale factor\n            // for width.\n            if (needTransform && !style.strokeNoScale) {\n                var det = m[0] * m[3] - m[1] * m[2];\n                lineWidth *= sqrt(abs(det));\n            }\n            strokeEl.weight = lineWidth + 'px';\n        }\n\n        var path = this.path || (this.path = new PathProxy());\n        if (this.__dirtyPath) {\n            path.beginPath();\n            path.subPixelOptimize = false;\n            this.buildPath(path, this.shape);\n            path.toStatic();\n            this.__dirtyPath = false;\n        }\n\n        vmlEl.path = pathDataToString(path, this.transform);\n\n        vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2);\n\n        // Append to root\n        append(vmlRoot, vmlEl);\n\n        // Text\n        if (style.text != null) {\n            this.drawRectText(vmlRoot, this.getBoundingRect());\n        }\n        else {\n            this.removeRectText(vmlRoot);\n        }\n    };\n\n    Path.prototype.onRemove = function (vmlRoot) {\n        remove(vmlRoot, this._vmlEl);\n        this.removeRectText(vmlRoot);\n    };\n\n    Path.prototype.onAdd = function (vmlRoot) {\n        append(vmlRoot, this._vmlEl);\n        this.appendRectText(vmlRoot);\n    };\n\n    /***************************************************\n     * IMAGE\n     **************************************************/\n    var isImage = function (img) {\n        // FIXME img instanceof Image 如果 img 是一个字符串的时候，IE8 下会报错\n        return (typeof img === 'object') && img.tagName && img.tagName.toUpperCase() === 'IMG';\n        // return img instanceof Image;\n    };\n\n    // Rewrite the original path method\n    ZImage.prototype.brushVML = function (vmlRoot) {\n        var style = this.style;\n        var image = style.image;\n\n        // Image original width, height\n        var ow;\n        var oh;\n\n        if (isImage(image)) {\n            var src = image.src;\n            if (src === this._imageSrc) {\n                ow = this._imageWidth;\n                oh = this._imageHeight;\n            }\n            else {\n                var imageRuntimeStyle = image.runtimeStyle;\n                var oldRuntimeWidth = imageRuntimeStyle.width;\n                var oldRuntimeHeight = imageRuntimeStyle.height;\n                imageRuntimeStyle.width = 'auto';\n                imageRuntimeStyle.height = 'auto';\n\n                // get the original size\n                ow = image.width;\n                oh = image.height;\n\n                // and remove overides\n                imageRuntimeStyle.width = oldRuntimeWidth;\n                imageRuntimeStyle.height = oldRuntimeHeight;\n\n                // Caching image original width, height and src\n                this._imageSrc = src;\n                this._imageWidth = ow;\n                this._imageHeight = oh;\n            }\n            image = src;\n        }\n        else {\n            if (image === this._imageSrc) {\n                ow = this._imageWidth;\n                oh = this._imageHeight;\n            }\n        }\n        if (!image) {\n            return;\n        }\n\n        var x = style.x || 0;\n        var y = style.y || 0;\n\n        var dw = style.width;\n        var dh = style.height;\n\n        var sw = style.sWidth;\n        var sh = style.sHeight;\n        var sx = style.sx || 0;\n        var sy = style.sy || 0;\n\n        var hasCrop = sw && sh;\n\n        var vmlEl = this._vmlEl;\n        if (!vmlEl) {\n            // FIXME 使用 group 在 left, top 都不是 0 的时候就无法显示了。\n            // vmlEl = vmlCore.createNode('group');\n            vmlEl = vmlCore.doc.createElement('div');\n            initRootElStyle(vmlEl);\n\n            this._vmlEl = vmlEl;\n        }\n\n        var vmlElStyle = vmlEl.style;\n        var hasRotation = false;\n        var m;\n        var scaleX = 1;\n        var scaleY = 1;\n        if (this.transform) {\n            m = this.transform;\n            scaleX = sqrt(m[0] * m[0] + m[1] * m[1]);\n            scaleY = sqrt(m[2] * m[2] + m[3] * m[3]);\n\n            hasRotation = m[1] || m[2];\n        }\n        if (hasRotation) {\n            // If filters are necessary (rotation exists), create them\n            // filters are bog-slow, so only create them if abbsolutely necessary\n            // The following check doesn't account for skews (which don't exist\n            // in the canvas spec (yet) anyway.\n            // From excanvas\n            var p0 = [x, y];\n            var p1 = [x + dw, y];\n            var p2 = [x, y + dh];\n            var p3 = [x + dw, y + dh];\n            applyTransform(p0, p0, m);\n            applyTransform(p1, p1, m);\n            applyTransform(p2, p2, m);\n            applyTransform(p3, p3, m);\n\n            var maxX = mathMax(p0[0], p1[0], p2[0], p3[0]);\n            var maxY = mathMax(p0[1], p1[1], p2[1], p3[1]);\n\n            var transformFilter = [];\n            transformFilter.push('M11=', m[0] / scaleX, comma,\n                        'M12=', m[2] / scaleY, comma,\n                        'M21=', m[1] / scaleX, comma,\n                        'M22=', m[3] / scaleY, comma,\n                        'Dx=', round(x * scaleX + m[4]), comma,\n                        'Dy=', round(y * scaleY + m[5]));\n\n            vmlElStyle.padding = '0 ' + round(maxX) + 'px ' + round(maxY) + 'px 0';\n            // FIXME DXImageTransform 在 IE11 的兼容模式下不起作用\n            vmlElStyle.filter = imageTransformPrefix + '.Matrix('\n                + transformFilter.join('') + ', SizingMethod=clip)';\n\n        }\n        else {\n            if (m) {\n                x = x * scaleX + m[4];\n                y = y * scaleY + m[5];\n            }\n            vmlElStyle.filter = '';\n            vmlElStyle.left = round(x) + 'px';\n            vmlElStyle.top = round(y) + 'px';\n        }\n\n        var imageEl = this._imageEl;\n        var cropEl = this._cropEl;\n\n        if (!imageEl) {\n            imageEl = vmlCore.doc.createElement('div');\n            this._imageEl = imageEl;\n        }\n        var imageELStyle = imageEl.style;\n        if (hasCrop) {\n            // Needs know image original width and height\n            if (!(ow && oh)) {\n                var tmpImage = new Image();\n                var self = this;\n                tmpImage.onload = function () {\n                    tmpImage.onload = null;\n                    ow = tmpImage.width;\n                    oh = tmpImage.height;\n                    // Adjust image width and height to fit the ratio destinationSize / sourceSize\n                    imageELStyle.width = round(scaleX * ow * dw / sw) + 'px';\n                    imageELStyle.height = round(scaleY * oh * dh / sh) + 'px';\n\n                    // Caching image original width, height and src\n                    self._imageWidth = ow;\n                    self._imageHeight = oh;\n                    self._imageSrc = image;\n                };\n                tmpImage.src = image;\n            }\n            else {\n                imageELStyle.width = round(scaleX * ow * dw / sw) + 'px';\n                imageELStyle.height = round(scaleY * oh * dh / sh) + 'px';\n            }\n\n            if (!cropEl) {\n                cropEl = vmlCore.doc.createElement('div');\n                cropEl.style.overflow = 'hidden';\n                this._cropEl = cropEl;\n            }\n            var cropElStyle = cropEl.style;\n            cropElStyle.width = round((dw + sx * dw / sw) * scaleX);\n            cropElStyle.height = round((dh + sy * dh / sh) * scaleY);\n            cropElStyle.filter = imageTransformPrefix + '.Matrix(Dx='\n                    + (-sx * dw / sw * scaleX) + ',Dy=' + (-sy * dh / sh * scaleY) + ')';\n\n            if (!cropEl.parentNode) {\n                vmlEl.appendChild(cropEl);\n            }\n            if (imageEl.parentNode !== cropEl) {\n                cropEl.appendChild(imageEl);\n            }\n        }\n        else {\n            imageELStyle.width = round(scaleX * dw) + 'px';\n            imageELStyle.height = round(scaleY * dh) + 'px';\n\n            vmlEl.appendChild(imageEl);\n\n            if (cropEl && cropEl.parentNode) {\n                vmlEl.removeChild(cropEl);\n                this._cropEl = null;\n            }\n        }\n\n        var filterStr = '';\n        var alpha = style.opacity;\n        if (alpha < 1) {\n            filterStr += '.Alpha(opacity=' + round(alpha * 100) + ') ';\n        }\n        filterStr += imageTransformPrefix + '.AlphaImageLoader(src=' + image + ', SizingMethod=scale)';\n\n        imageELStyle.filter = filterStr;\n\n        vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2);\n\n        // Append to root\n        append(vmlRoot, vmlEl);\n\n        // Text\n        if (style.text != null) {\n            this.drawRectText(vmlRoot, this.getBoundingRect());\n        }\n    };\n\n    ZImage.prototype.onRemove = function (vmlRoot) {\n        remove(vmlRoot, this._vmlEl);\n\n        this._vmlEl = null;\n        this._cropEl = null;\n        this._imageEl = null;\n\n        this.removeRectText(vmlRoot);\n    };\n\n    ZImage.prototype.onAdd = function (vmlRoot) {\n        append(vmlRoot, this._vmlEl);\n        this.appendRectText(vmlRoot);\n    };\n\n\n    /***************************************************\n     * TEXT\n     **************************************************/\n\n    var DEFAULT_STYLE_NORMAL = 'normal';\n\n    var fontStyleCache = {};\n    var fontStyleCacheCount = 0;\n    var MAX_FONT_CACHE_SIZE = 100;\n    var fontEl = document.createElement('div');\n\n    var getFontStyle = function (fontString) {\n        var fontStyle = fontStyleCache[fontString];\n        if (!fontStyle) {\n            // Clear cache\n            if (fontStyleCacheCount > MAX_FONT_CACHE_SIZE) {\n                fontStyleCacheCount = 0;\n                fontStyleCache = {};\n            }\n\n            var style = fontEl.style;\n            var fontFamily;\n            try {\n                style.font = fontString;\n                fontFamily = style.fontFamily.split(',')[0];\n            }\n            catch (e) {\n            }\n\n            fontStyle = {\n                style: style.fontStyle || DEFAULT_STYLE_NORMAL,\n                variant: style.fontVariant || DEFAULT_STYLE_NORMAL,\n                weight: style.fontWeight || DEFAULT_STYLE_NORMAL,\n                size: parseFloat(style.fontSize || 12) | 0,\n                family: fontFamily || 'Microsoft YaHei'\n            };\n\n            fontStyleCache[fontString] = fontStyle;\n            fontStyleCacheCount++;\n        }\n        return fontStyle;\n    };\n\n    var textMeasureEl;\n    // Overwrite measure text method\n    textContain.$override('measureText', function (text, textFont) {\n        var doc = vmlCore.doc;\n        if (!textMeasureEl) {\n            textMeasureEl = doc.createElement('div');\n            textMeasureEl.style.cssText = 'position:absolute;top:-20000px;left:0;'\n                + 'padding:0;margin:0;border:none;white-space:pre;';\n            vmlCore.doc.body.appendChild(textMeasureEl);\n        }\n\n        try {\n            textMeasureEl.style.font = textFont;\n        }\n        catch (ex) {\n            // Ignore failures to set to invalid font.\n        }\n        textMeasureEl.innerHTML = '';\n        // Don't use innerHTML or innerText because they allow markup/whitespace.\n        textMeasureEl.appendChild(doc.createTextNode(text));\n        return {\n            width: textMeasureEl.offsetWidth\n        };\n    });\n\n    var tmpRect = new BoundingRect();\n\n    var drawRectText = function (vmlRoot, rect, textRect, fromTextEl) {\n\n        var style = this.style;\n\n        // Optimize, avoid normalize every time.\n        this.__dirty && textHelper.normalizeTextStyle(style, true);\n\n        var text = style.text;\n        // Convert to string\n        text != null && (text += '');\n        if (!text) {\n            return;\n        }\n\n        // Convert rich text to plain text. Rich text is not supported in\n        // IE8-, but tags in rich text template will be removed.\n        if (style.rich) {\n            var contentBlock = textContain.parseRichText(text, style);\n            text = [];\n            for (var i = 0; i < contentBlock.lines.length; i++) {\n                var tokens = contentBlock.lines[i].tokens;\n                var textLine = [];\n                for (var j = 0; j < tokens.length; j++) {\n                    textLine.push(tokens[j].text);\n                }\n                text.push(textLine.join(''));\n            }\n            text = text.join('\\n');\n        }\n\n        var x;\n        var y;\n        var align = style.textAlign;\n        var verticalAlign = style.textVerticalAlign;\n\n        var fontStyle = getFontStyle(style.font);\n        // FIXME encodeHtmlAttribute ?\n        var font = fontStyle.style + ' ' + fontStyle.variant + ' ' + fontStyle.weight + ' '\n            + fontStyle.size + 'px \"' + fontStyle.family + '\"';\n\n        textRect = textRect || textContain.getBoundingRect(\n            text, font, align, verticalAlign, style.textPadding, style.textLineHeight\n        );\n\n        // Transform rect to view space\n        var m = this.transform;\n        // Ignore transform for text in other element\n        if (m && !fromTextEl) {\n            tmpRect.copy(rect);\n            tmpRect.applyTransform(m);\n            rect = tmpRect;\n        }\n\n        if (!fromTextEl) {\n            var textPosition = style.textPosition;\n            // Text position represented by coord\n            if (textPosition instanceof Array) {\n                x = rect.x + parsePercent(textPosition[0], rect.width);\n                y = rect.y + parsePercent(textPosition[1], rect.height);\n\n                align = align || 'left';\n            }\n            else {\n                var res = this.calculateTextPosition\n                    ? this.calculateTextPosition({}, style, rect)\n                    : textContain.calculateTextPosition({}, style, rect);\n                x = res.x;\n                y = res.y;\n\n                // Default align and baseline when has textPosition\n                align = align || res.textAlign;\n                verticalAlign = verticalAlign || res.textVerticalAlign;\n            }\n        }\n        else {\n            x = rect.x;\n            y = rect.y;\n        }\n\n        x = textContain.adjustTextX(x, textRect.width, align);\n        y = textContain.adjustTextY(y, textRect.height, verticalAlign);\n\n        // Force baseline 'middle'\n        y += textRect.height / 2;\n\n        // var fontSize = fontStyle.size;\n        // 1.75 is an arbitrary number, as there is no info about the text baseline\n        // switch (baseline) {\n            // case 'hanging':\n            // case 'top':\n            //     y += fontSize / 1.75;\n            //     break;\n        //     case 'middle':\n        //         break;\n        //     default:\n        //     // case null:\n        //     // case 'alphabetic':\n        //     // case 'ideographic':\n        //     // case 'bottom':\n        //         y -= fontSize / 2.25;\n        //         break;\n        // }\n\n        // switch (align) {\n        //     case 'left':\n        //         break;\n        //     case 'center':\n        //         x -= textRect.width / 2;\n        //         break;\n        //     case 'right':\n        //         x -= textRect.width;\n        //         break;\n            // case 'end':\n                // align = elementStyle.direction == 'ltr' ? 'right' : 'left';\n                // break;\n            // case 'start':\n                // align = elementStyle.direction == 'rtl' ? 'right' : 'left';\n                // break;\n            // default:\n            //     align = 'left';\n        // }\n\n        var createNode = vmlCore.createNode;\n\n        var textVmlEl = this._textVmlEl;\n        var pathEl;\n        var textPathEl;\n        var skewEl;\n        if (!textVmlEl) {\n            textVmlEl = createNode('line');\n            pathEl = createNode('path');\n            textPathEl = createNode('textpath');\n            skewEl = createNode('skew');\n\n            // FIXME Why here is not cammel case\n            // Align 'center' seems wrong\n            textPathEl.style['v-text-align'] = 'left';\n\n            initRootElStyle(textVmlEl);\n\n            pathEl.textpathok = true;\n            textPathEl.on = true;\n\n            textVmlEl.from = '0 0';\n            textVmlEl.to = '1000 0.05';\n\n            append(textVmlEl, skewEl);\n            append(textVmlEl, pathEl);\n            append(textVmlEl, textPathEl);\n\n            this._textVmlEl = textVmlEl;\n        }\n        else {\n            // 这里是在前面 appendChild 保证顺序的前提下\n            skewEl = textVmlEl.firstChild;\n            pathEl = skewEl.nextSibling;\n            textPathEl = pathEl.nextSibling;\n        }\n\n        var coords = [x, y];\n        var textVmlElStyle = textVmlEl.style;\n        // Ignore transform for text in other element\n        if (m && fromTextEl) {\n            applyTransform(coords, coords, m);\n\n            skewEl.on = true;\n\n            skewEl.matrix = m[0].toFixed(3) + comma + m[2].toFixed(3) + comma\n                            + m[1].toFixed(3) + comma + m[3].toFixed(3) + ',0,0';\n\n            // Text position\n            skewEl.offset = (round(coords[0]) || 0) + ',' + (round(coords[1]) || 0);\n            // Left top point as origin\n            skewEl.origin = '0 0';\n\n            textVmlElStyle.left = '0px';\n            textVmlElStyle.top = '0px';\n        }\n        else {\n            skewEl.on = false;\n            textVmlElStyle.left = round(x) + 'px';\n            textVmlElStyle.top = round(y) + 'px';\n        }\n\n        textPathEl.string = encodeHtmlAttribute(text);\n        // TODO\n        try {\n            textPathEl.style.font = font;\n        }\n        // Error font format\n        catch (e) {}\n\n        updateFillAndStroke(textVmlEl, 'fill', {\n            fill: style.textFill,\n            opacity: style.opacity\n        }, this);\n        updateFillAndStroke(textVmlEl, 'stroke', {\n            stroke: style.textStroke,\n            opacity: style.opacity,\n            lineDash: style.lineDash || null // style.lineDash can be `false`.\n        }, this);\n\n        textVmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2);\n\n        // Attached to root\n        append(vmlRoot, textVmlEl);\n    };\n\n    var removeRectText = function (vmlRoot) {\n        remove(vmlRoot, this._textVmlEl);\n        this._textVmlEl = null;\n    };\n\n    var appendRectText = function (vmlRoot) {\n        append(vmlRoot, this._textVmlEl);\n    };\n\n    var list = [RectText, Displayable, ZImage, Path, Text];\n\n    // In case Displayable has been mixed in RectText\n    for (var i = 0; i < list.length; i++) {\n        var proto = list[i].prototype;\n        proto.drawRectText = drawRectText;\n        proto.removeRectText = removeRectText;\n        proto.appendRectText = appendRectText;\n    }\n\n    Text.prototype.brushVML = function (vmlRoot) {\n        var style = this.style;\n        if (style.text != null) {\n            this.drawRectText(vmlRoot, {\n                x: style.x || 0, y: style.y || 0,\n                width: 0, height: 0\n            }, this.getBoundingRect(), true);\n        }\n        else {\n            this.removeRectText(vmlRoot);\n        }\n    };\n\n    Text.prototype.onRemove = function (vmlRoot) {\n        this.removeRectText(vmlRoot);\n    };\n\n    Text.prototype.onAdd = function (vmlRoot) {\n        this.appendRectText(vmlRoot);\n    };\n}","/**\n * VML Painter.\n *\n * @module zrender/vml/Painter\n */\n\nimport zrLog from '../core/log';\nimport * as vmlCore from './core';\nimport {each} from '../core/util';\n\nfunction parseInt10(val) {\n    return parseInt(val, 10);\n}\n\n/**\n * @alias module:zrender/vml/Painter\n */\nfunction VMLPainter(root, storage) {\n\n    vmlCore.initVML();\n\n    this.root = root;\n\n    this.storage = storage;\n\n    var vmlViewport = document.createElement('div');\n\n    var vmlRoot = document.createElement('div');\n\n    vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;';\n\n    vmlRoot.style.cssText = 'position:absolute;left:0;top:0;';\n\n    root.appendChild(vmlViewport);\n\n    this._vmlRoot = vmlRoot;\n    this._vmlViewport = vmlViewport;\n\n    this.resize();\n\n    // Modify storage\n    var oldDelFromStorage = storage.delFromStorage;\n    var oldAddToStorage = storage.addToStorage;\n    storage.delFromStorage = function (el) {\n        oldDelFromStorage.call(storage, el);\n\n        if (el) {\n            el.onRemove && el.onRemove(vmlRoot);\n        }\n    };\n\n    storage.addToStorage = function (el) {\n        // Displayable already has a vml node\n        el.onAdd && el.onAdd(vmlRoot);\n\n        oldAddToStorage.call(storage, el);\n    };\n\n    this._firstPaint = true;\n}\n\nVMLPainter.prototype = {\n\n    constructor: VMLPainter,\n\n    getType: function () {\n        return 'vml';\n    },\n\n    /**\n     * @return {HTMLDivElement}\n     */\n    getViewportRoot: function () {\n        return this._vmlViewport;\n    },\n\n    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\n    /**\n     * 刷新\n     */\n    refresh: function () {\n\n        var list = this.storage.getDisplayList(true, true);\n\n        this._paintList(list);\n    },\n\n    _paintList: function (list) {\n        var vmlRoot = this._vmlRoot;\n        for (var i = 0; i < list.length; i++) {\n            var el = list[i];\n            if (el.invisible || el.ignore) {\n                if (!el.__alreadyNotVisible) {\n                    el.onRemove(vmlRoot);\n                }\n                // Set as already invisible\n                el.__alreadyNotVisible = true;\n            }\n            else {\n                if (el.__alreadyNotVisible) {\n                    el.onAdd(vmlRoot);\n                }\n                el.__alreadyNotVisible = false;\n                if (el.__dirty) {\n                    el.beforeBrush && el.beforeBrush();\n                    (el.brushVML || el.brush).call(el, vmlRoot);\n                    el.afterBrush && el.afterBrush();\n                }\n            }\n            el.__dirty = false;\n        }\n\n        if (this._firstPaint) {\n            // Detached from document at first time\n            // to avoid page refreshing too many times\n\n            // FIXME 如果每次都先 removeChild 可能会导致一些填充和描边的效果改变\n            this._vmlViewport.appendChild(vmlRoot);\n            this._firstPaint = false;\n        }\n    },\n\n    resize: function (width, height) {\n        var width = width == null ? this._getWidth() : width;\n        var height = height == null ? this._getHeight() : height;\n\n        if (this._width !== width || this._height !== height) {\n            this._width = width;\n            this._height = height;\n\n            var vmlViewportStyle = this._vmlViewport.style;\n            vmlViewportStyle.width = width + 'px';\n            vmlViewportStyle.height = height + 'px';\n        }\n    },\n\n    dispose: function () {\n        this.root.innerHTML = '';\n\n        this._vmlRoot =\n        this._vmlViewport =\n        this.storage = null;\n    },\n\n    getWidth: function () {\n        return this._width;\n    },\n\n    getHeight: function () {\n        return this._height;\n    },\n\n    clear: function () {\n        if (this._vmlViewport) {\n            this.root.removeChild(this._vmlViewport);\n        }\n    },\n\n    _getWidth: function () {\n        var root = this.root;\n        var stl = root.currentStyle;\n\n        return ((root.clientWidth || parseInt10(stl.width))\n                - parseInt10(stl.paddingLeft)\n                - parseInt10(stl.paddingRight)) | 0;\n    },\n\n    _getHeight: function () {\n        var root = this.root;\n        var stl = root.currentStyle;\n\n        return ((root.clientHeight || parseInt10(stl.height))\n                - parseInt10(stl.paddingTop)\n                - parseInt10(stl.paddingBottom)) | 0;\n    }\n};\n\n// Not supported methods\nfunction createMethodNotSupport(method) {\n    return function () {\n        zrLog('In IE8.0 VML mode painter not support method \"' + method + '\"');\n    };\n}\n\n// Unsupported methods\neach([\n    'getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer', 'eachOtherLayer', 'getLayers',\n    'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage'\n], function (name) {\n    VMLPainter.prototype[name] = createMethodNotSupport(name);\n});\n\nexport default VMLPainter;","import './graphic';\nimport {registerPainter} from '../zrender';\nimport Painter from './Painter';\n\nregisterPainter('vml', Painter);","\nvar svgURI = 'http://www.w3.org/2000/svg';\n\nexport function createElement(name) {\n    return document.createElementNS(svgURI, name);\n}","// TODO\n// 1. shadow\n// 2. Image: sx, sy, sw, sh\n\nimport {createElement} from './core';\nimport PathProxy from '../core/PathProxy';\nimport BoundingRect from '../core/BoundingRect';\nimport * as matrix from '../core/matrix';\nimport * as textContain from '../contain/text';\nimport * as textHelper from '../graphic/helper/text';\nimport Text from '../graphic/Text';\n\nvar CMD = PathProxy.CMD;\nvar arrayJoin = Array.prototype.join;\n\nvar NONE = 'none';\nvar mathRound = Math.round;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI = Math.PI;\nvar PI2 = Math.PI * 2;\nvar degree = 180 / PI;\n\nvar EPSILON = 1e-4;\n\nfunction round4(val) {\n    return mathRound(val * 1e4) / 1e4;\n}\n\nfunction isAroundZero(val) {\n    return val < EPSILON && val > -EPSILON;\n}\n\nfunction pathHasFill(style, isText) {\n    var fill = isText ? style.textFill : style.fill;\n    return fill != null && fill !== NONE;\n}\n\nfunction pathHasStroke(style, isText) {\n    var stroke = isText ? style.textStroke : style.stroke;\n    return stroke != null && stroke !== NONE;\n}\n\nfunction setTransform(svgEl, m) {\n    if (m) {\n        attr(svgEl, 'transform', 'matrix(' + arrayJoin.call(m, ',') + ')');\n    }\n}\n\nfunction attr(el, key, val) {\n    if (!val || val.type !== 'linear' && val.type !== 'radial') {\n        // Don't set attribute for gradient, since it need new dom nodes\n        el.setAttribute(key, val);\n    }\n}\n\nfunction attrXLink(el, key, val) {\n    el.setAttributeNS('http://www.w3.org/1999/xlink', key, val);\n}\n\nfunction bindStyle(svgEl, style, isText, el) {\n    if (pathHasFill(style, isText)) {\n        var fill = isText ? style.textFill : style.fill;\n        fill = fill === 'transparent' ? NONE : fill;\n        attr(svgEl, 'fill', fill);\n        attr(svgEl, 'fill-opacity', style.fillOpacity != null ? style.fillOpacity * style.opacity : style.opacity);\n    }\n    else {\n        attr(svgEl, 'fill', NONE);\n    }\n\n    if (pathHasStroke(style, isText)) {\n        var stroke = isText ? style.textStroke : style.stroke;\n        stroke = stroke === 'transparent' ? NONE : stroke;\n        attr(svgEl, 'stroke', stroke);\n        var strokeWidth = isText\n            ? style.textStrokeWidth\n            : style.lineWidth;\n        var strokeScale = !isText && style.strokeNoScale\n            ? el.getLineScale()\n            : 1;\n        attr(svgEl, 'stroke-width', strokeWidth / strokeScale);\n        // stroke then fill for text; fill then stroke for others\n        attr(svgEl, 'paint-order', isText ? 'stroke' : 'fill');\n        attr(svgEl, 'stroke-opacity', style.strokeOpacity != null ? style.strokeOpacity : style.opacity);\n        var lineDash = style.lineDash;\n        if (lineDash) {\n            attr(svgEl, 'stroke-dasharray', style.lineDash.join(','));\n            attr(svgEl, 'stroke-dashoffset', mathRound(style.lineDashOffset || 0));\n        }\n        else {\n            attr(svgEl, 'stroke-dasharray', '');\n        }\n\n        // PENDING\n        style.lineCap && attr(svgEl, 'stroke-linecap', style.lineCap);\n        style.lineJoin && attr(svgEl, 'stroke-linejoin', style.lineJoin);\n        style.miterLimit && attr(svgEl, 'stroke-miterlimit', style.miterLimit);\n    }\n    else {\n        attr(svgEl, 'stroke', NONE);\n    }\n}\n\n/***************************************************\n * PATH\n **************************************************/\nfunction pathDataToString(path) {\n    var str = [];\n    var data = path.data;\n    var dataLength = path.len();\n    for (var i = 0; i < dataLength;) {\n        var cmd = data[i++];\n        var cmdStr = '';\n        var nData = 0;\n        switch (cmd) {\n            case CMD.M:\n                cmdStr = 'M';\n                nData = 2;\n                break;\n            case CMD.L:\n                cmdStr = 'L';\n                nData = 2;\n                break;\n            case CMD.Q:\n                cmdStr = 'Q';\n                nData = 4;\n                break;\n            case CMD.C:\n                cmdStr = 'C';\n                nData = 6;\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                var psi = data[i++];\n                var clockwise = data[i++];\n\n                var dThetaPositive = Math.abs(dTheta);\n                var isCircle = isAroundZero(dThetaPositive - PI2)\n                    && !isAroundZero(dThetaPositive);\n\n                var large = false;\n                if (dThetaPositive >= PI2) {\n                    large = true;\n                }\n                else if (isAroundZero(dThetaPositive)) {\n                    large = false;\n                }\n                else {\n                    large = (dTheta > -PI && dTheta < 0 || dTheta > PI)\n                        === !!clockwise;\n                }\n\n                var x0 = round4(cx + rx * mathCos(theta));\n                var y0 = round4(cy + ry * mathSin(theta));\n\n                // It will not draw if start point and end point are exactly the same\n                // We need to shift the end point with a small value\n                // FIXME A better way to draw circle ?\n                if (isCircle) {\n                    if (clockwise) {\n                        dTheta = PI2 - 1e-4;\n                    }\n                    else {\n                        dTheta = -PI2 + 1e-4;\n                    }\n\n                    large = true;\n\n                    if (i === 9) {\n                        // Move to (x0, y0) only when CMD.A comes at the\n                        // first position of a shape.\n                        // For instance, when drawing a ring, CMD.A comes\n                        // after CMD.M, so it's unnecessary to move to\n                        // (x0, y0).\n                        str.push('M', x0, y0);\n                    }\n                }\n\n                var x = round4(cx + rx * mathCos(theta + dTheta));\n                var y = round4(cy + ry * mathSin(theta + dTheta));\n\n                // FIXME Ellipse\n                str.push('A', round4(rx), round4(ry),\n                    mathRound(psi * degree), +large, +clockwise, x, y);\n                break;\n            case CMD.Z:\n                cmdStr = 'Z';\n                break;\n            case CMD.R:\n                var x = round4(data[i++]);\n                var y = round4(data[i++]);\n                var w = round4(data[i++]);\n                var h = round4(data[i++]);\n                str.push(\n                    'M', x, y,\n                    'L', x + w, y,\n                    'L', x + w, y + h,\n                    'L', x, y + h,\n                    'L', x, y\n                );\n                break;\n        }\n        cmdStr && str.push(cmdStr);\n        for (var j = 0; j < nData; j++) {\n            // PENDING With scale\n            str.push(round4(data[i++]));\n        }\n    }\n    return str.join(' ');\n}\n\nvar svgPath = {};\nexport {svgPath as path};\n\nsvgPath.brush = function (el) {\n    var style = el.style;\n\n    var svgEl = el.__svgEl;\n    if (!svgEl) {\n        svgEl = createElement('path');\n        el.__svgEl = svgEl;\n    }\n\n    if (!el.path) {\n        el.createPathProxy();\n    }\n    var path = el.path;\n\n    if (el.__dirtyPath) {\n        path.beginPath();\n        path.subPixelOptimize = false;\n        el.buildPath(path, el.shape);\n        el.__dirtyPath = false;\n\n        var pathStr = pathDataToString(path);\n        if (pathStr.indexOf('NaN') < 0) {\n            // Ignore illegal path, which may happen such in out-of-range\n            // data in Calendar series.\n            attr(svgEl, 'd', pathStr);\n        }\n    }\n\n    bindStyle(svgEl, style, false, el);\n    setTransform(svgEl, el.transform);\n\n    if (style.text != null) {\n        svgTextDrawRectText(el, el.getBoundingRect());\n    }\n};\n\n/***************************************************\n * IMAGE\n **************************************************/\nvar svgImage = {};\nexport {svgImage as image};\n\nsvgImage.brush = function (el) {\n    var style = el.style;\n    var image = style.image;\n\n    if (image instanceof HTMLImageElement) {\n        var src = image.src;\n        image = src;\n    }\n    if (!image) {\n        return;\n    }\n\n    var x = style.x || 0;\n    var y = style.y || 0;\n\n    var dw = style.width;\n    var dh = style.height;\n\n    var svgEl = el.__svgEl;\n    if (!svgEl) {\n        svgEl = createElement('image');\n        el.__svgEl = svgEl;\n    }\n\n    if (image !== el.__imageSrc) {\n        attrXLink(svgEl, 'href', image);\n        // Caching image src\n        el.__imageSrc = image;\n    }\n\n    attr(svgEl, 'width', dw);\n    attr(svgEl, 'height', dh);\n\n    attr(svgEl, 'x', x);\n    attr(svgEl, 'y', y);\n\n    setTransform(svgEl, el.transform);\n\n    if (style.text != null) {\n        svgTextDrawRectText(el, el.getBoundingRect());\n    }\n};\n\n/***************************************************\n * TEXT\n **************************************************/\nvar svgText = {};\nexport {svgText as text};\nvar tmpRect = new BoundingRect();\nvar tmpTextPositionResult = {};\n\nvar svgTextDrawRectText = function (el, rect, textRect) {\n    var style = el.style;\n\n    el.__dirty && textHelper.normalizeTextStyle(style, true);\n\n    var text = style.text;\n    // Convert to string\n    if (text == null) {\n        // Draw no text only when text is set to null, but not ''\n        return;\n    }\n    else {\n        text += '';\n    }\n\n    var textSvgEl = el.__textSvgEl;\n    if (!textSvgEl) {\n        textSvgEl = createElement('text');\n        el.__textSvgEl = textSvgEl;\n    }\n\n    var x;\n    var y;\n    var textPosition = style.textPosition;\n    var align = style.textAlign || 'left';\n\n    if (typeof style.fontSize === 'number') {\n        style.fontSize += 'px';\n    }\n    var font = style.font\n        || [\n            style.fontStyle || '',\n            style.fontWeight || '',\n            style.fontSize || '',\n            style.fontFamily || ''\n        ].join(' ')\n        || textContain.DEFAULT_FONT;\n\n    var verticalAlign = style.textVerticalAlign;\n\n    textRect = textContain.getBoundingRect(\n        text, font, align,\n        verticalAlign, style.textPadding, style.textLineHeight\n    );\n\n    var lineHeight = textRect.lineHeight;\n    // Text position represented by coord\n    if (textPosition instanceof Array) {\n        x = rect.x + textPosition[0];\n        y = rect.y + textPosition[1];\n    }\n    else {\n        var newPos = el.calculateTextPosition\n            ? el.calculateTextPosition(tmpTextPositionResult, style, rect)\n            : textContain.calculateTextPosition(tmpTextPositionResult, style, rect);\n        x = newPos.x;\n        y = newPos.y;\n        verticalAlign = newPos.textVerticalAlign;\n        align = newPos.textAlign;\n    }\n\n    setVerticalAlign(textSvgEl, verticalAlign);\n\n    if (font) {\n        textSvgEl.style.font = font;\n    }\n\n    var textPadding = style.textPadding;\n\n    // Make baseline top\n    attr(textSvgEl, 'x', x);\n    attr(textSvgEl, 'y', y);\n\n    bindStyle(textSvgEl, style, true, el);\n    if (el instanceof Text || el.style.transformText) {\n        // Transform text with element\n        setTransform(textSvgEl, el.transform);\n    }\n    else {\n        if (el.transform) {\n            tmpRect.copy(rect);\n            tmpRect.applyTransform(el.transform);\n            rect = tmpRect;\n        }\n        else {\n            var pos = el.transformCoordToGlobal(rect.x, rect.y);\n            rect.x = pos[0];\n            rect.y = pos[1];\n            el.transform = matrix.identity(matrix.create());\n        }\n\n        // Text rotation, but no element transform\n        var origin = style.textOrigin;\n        if (origin === 'center') {\n            x = textRect.width / 2 + x;\n            y = textRect.height / 2 + y;\n        }\n        else if (origin) {\n            x = origin[0] + x;\n            y = origin[1] + y;\n        }\n        var rotate = -style.textRotation || 0;\n        var transform = matrix.create();\n        // Apply textRotate to element matrix\n        matrix.rotate(transform, transform, rotate);\n\n        var pos = [el.transform[4], el.transform[5]];\n        matrix.translate(transform, transform, pos);\n        setTransform(textSvgEl, transform);\n    }\n\n    var textLines = text.split('\\n');\n    var nTextLines = textLines.length;\n    var textAnchor = align;\n    // PENDING\n    if (textAnchor === 'left') {\n        textAnchor = 'start';\n        textPadding && (x += textPadding[3]);\n    }\n    else if (textAnchor === 'right') {\n        textAnchor = 'end';\n        textPadding && (x -= textPadding[1]);\n    }\n    else if (textAnchor === 'center') {\n        textAnchor = 'middle';\n        textPadding && (x += (textPadding[3] - textPadding[1]) / 2);\n    }\n\n    var dy = 0;\n    if (verticalAlign === 'bottom') {\n        dy = -textRect.height + lineHeight;\n        textPadding && (dy -= textPadding[2]);\n    }\n    else if (verticalAlign === 'middle') {\n        dy = (-textRect.height + lineHeight) / 2;\n        textPadding && (y += (textPadding[0] - textPadding[2]) / 2);\n    }\n    else {\n        textPadding && (dy += textPadding[0]);\n    }\n\n    // Font may affect position of each tspan elements\n    if (el.__text !== text || el.__textFont !== font) {\n        var tspanList = el.__tspanList || [];\n        el.__tspanList = tspanList;\n        for (var i = 0; i < nTextLines; i++) {\n            // Using cached tspan elements\n            var tspan = tspanList[i];\n            if (!tspan) {\n                tspan = tspanList[i] = createElement('tspan');\n                textSvgEl.appendChild(tspan);\n                setVerticalAlign(tspan, verticalAlign);\n                attr(tspan, 'text-anchor', textAnchor);\n            }\n            else {\n                tspan.innerHTML = '';\n            }\n            attr(tspan, 'x', x);\n            attr(tspan, 'y', y + i * lineHeight + dy);\n            tspan.appendChild(document.createTextNode(textLines[i]));\n        }\n        // Remove unsed tspan elements\n        for (; i < tspanList.length; i++) {\n            textSvgEl.removeChild(tspanList[i]);\n        }\n        tspanList.length = nTextLines;\n\n        el.__text = text;\n        el.__textFont = font;\n    }\n    else if (el.__tspanList.length) {\n        // Update span x and y\n        var len = el.__tspanList.length;\n        for (var i = 0; i < len; ++i) {\n            var tspan = el.__tspanList[i];\n            if (tspan) {\n                attr(tspan, 'x', x);\n                attr(tspan, 'y', y + i * lineHeight + dy);\n            }\n        }\n    }\n};\n\nfunction setVerticalAlign(textSvgEl, verticalAlign) {\n    switch (verticalAlign) {\n        case 'middle':\n            attr(textSvgEl, 'dominant-baseline', 'middle');\n            attr(textSvgEl, 'alignment-baseline', 'middle');\n            break;\n\n        case 'bottom':\n            attr(textSvgEl, 'dominant-baseline', 'ideographic');\n            attr(textSvgEl, 'alignment-baseline', 'ideographic');\n            break;\n\n        default:\n            attr(textSvgEl, 'dominant-baseline', 'hanging');\n            attr(textSvgEl, 'alignment-baseline', 'hanging');\n    }\n}\n\nsvgText.drawRectText = svgTextDrawRectText;\n\nsvgText.brush = function (el) {\n    var style = el.style;\n    if (style.text != null) {\n        // 强制设置 textPosition\n        style.textPosition = [0, 0];\n        svgTextDrawRectText(el, {\n            x: style.x || 0, y: style.y || 0,\n            width: 0, height: 0\n        }, el.getBoundingRect());\n    }\n};\n","// Myers' Diff Algorithm\n// Modified from https://github.com/kpdecker/jsdiff/blob/master/src/diff/base.js\n\nfunction Diff() {}\n\nDiff.prototype = {\n    diff: function (oldArr, newArr, equals) {\n        if (!equals) {\n            equals = function (a, b) {\n                return a === b;\n            };\n        }\n        this.equals = equals;\n\n        var self = this;\n\n        oldArr = oldArr.slice();\n        newArr = newArr.slice();\n        // Allow subclasses to massage the input prior to running\n        var newLen = newArr.length;\n        var oldLen = oldArr.length;\n        var editLength = 1;\n        var maxEditLength = newLen + oldLen;\n        var bestPath = [{ newPos: -1, components: [] }];\n\n        // Seed editLength = 0, i.e. the content starts with the same values\n        var oldPos = this.extractCommon(bestPath[0], newArr, oldArr, 0);\n        if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n            var indices = [];\n            for (var i = 0; i < newArr.length; i++) {\n                indices.push(i);\n            }\n            // Identity per the equality and tokenizer\n            return [{\n                indices: indices, count: newArr.length\n            }];\n        }\n\n        // Main worker method. checks all permutations of a given edit length for acceptance.\n        function execEditLength() {\n            for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n                var basePath;\n                var addPath = bestPath[diagonalPath - 1];\n                var removePath = bestPath[diagonalPath + 1];\n                var oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n                if (addPath) {\n                    // No one else is going to attempt to use this value, clear it\n                    bestPath[diagonalPath - 1] = undefined;\n                }\n\n                var canAdd = addPath && addPath.newPos + 1 < newLen;\n                var canRemove = removePath && 0 <= oldPos && oldPos < oldLen;\n                if (!canAdd && !canRemove) {\n                    // If this path is a terminal then prune\n                    bestPath[diagonalPath] = undefined;\n                    continue;\n                }\n\n                // Select the diagonal that we want to branch from. We select the prior\n                // path whose position in the new string is the farthest from the origin\n                // and does not pass the bounds of the diff graph\n                if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {\n                    basePath = clonePath(removePath);\n                    self.pushComponent(basePath.components, undefined, true);\n                }\n                else {\n                    basePath = addPath;   // No need to clone, we've pulled it from the list\n                    basePath.newPos++;\n                    self.pushComponent(basePath.components, true, undefined);\n                }\n\n                oldPos = self.extractCommon(basePath, newArr, oldArr, diagonalPath);\n\n                // If we have hit the end of both strings, then we are done\n                if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n                    return buildValues(self, basePath.components, newArr, oldArr);\n                }\n                else {\n                    // Otherwise track this path as a potential candidate and continue.\n                    bestPath[diagonalPath] = basePath;\n                }\n            }\n\n            editLength++;\n        }\n\n        while (editLength <= maxEditLength) {\n            var ret = execEditLength();\n            if (ret) {\n                return ret;\n            }\n        }\n    },\n\n    pushComponent: function (components, added, removed) {\n        var last = components[components.length - 1];\n        if (last && last.added === added && last.removed === removed) {\n            // We need to clone here as the component clone operation is just\n            // as shallow array clone\n            components[components.length - 1] = {count: last.count + 1, added: added, removed: removed };\n        }\n        else {\n            components.push({count: 1, added: added, removed: removed });\n        }\n    },\n    extractCommon: function (basePath, newArr, oldArr, diagonalPath) {\n        var newLen = newArr.length;\n        var oldLen = oldArr.length;\n        var newPos = basePath.newPos;\n        var oldPos = newPos - diagonalPath;\n        var commonCount = 0;\n\n        while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newArr[newPos + 1], oldArr[oldPos + 1])) {\n            newPos++;\n            oldPos++;\n            commonCount++;\n        }\n\n        if (commonCount) {\n            basePath.components.push({count: commonCount});\n        }\n\n        basePath.newPos = newPos;\n        return oldPos;\n    },\n    tokenize: function (value) {\n        return value.slice();\n    },\n    join: function (value) {\n        return value.slice();\n    }\n};\n\nfunction buildValues(diff, components, newArr, oldArr) {\n    var componentPos = 0;\n    var componentLen = components.length;\n    var newPos = 0;\n    var oldPos = 0;\n\n    for (; componentPos < componentLen; componentPos++) {\n        var component = components[componentPos];\n        if (!component.removed) {\n            var indices = [];\n            for (var i = newPos; i < newPos + component.count; i++) {\n                indices.push(i);\n            }\n            component.indices = indices;\n            newPos += component.count;\n            // Common case\n            if (!component.added) {\n                oldPos += component.count;\n            }\n        }\n        else {\n            var indices = [];\n            for (var i = oldPos; i < oldPos + component.count; i++) {\n                indices.push(i);\n            }\n            component.indices = indices;\n            oldPos += component.count;\n        }\n    }\n\n    return components;\n}\n\nfunction clonePath(path) {\n    return { newPos: path.newPos, components: path.components.slice(0) };\n}\n\nvar arrayDiff = new Diff();\n\nexport default function (oldArr, newArr, callback) {\n    return arrayDiff.diff(oldArr, newArr, callback);\n}","/**\n * @file Manages elements that can be defined in <defs> in SVG,\n *       e.g., gradients, clip path, etc.\n * @author Zhang Wenli\n */\n\nimport {createElement} from '../core';\nimport * as zrUtil from '../../core/util';\nimport Path from '../../graphic/Path';\nimport ZImage from '../../graphic/Image';\nimport ZText from '../../graphic/Text';\nimport {\n    path as svgPath,\n    image as svgImage,\n    text as svgText\n} from '../graphic';\n\n\nvar MARK_UNUSED = '0';\nvar MARK_USED = '1';\n\n/**\n * Manages elements that can be defined in <defs> in SVG,\n * e.g., gradients, clip path, etc.\n *\n * @class\n * @param {number}          zrId      zrender instance id\n * @param {SVGElement}      svgRoot   root of SVG document\n * @param {string|string[]} tagNames  possible tag names\n * @param {string}          markLabel label name to make if the element\n *                                    is used\n */\nfunction Definable(\n    zrId,\n    svgRoot,\n    tagNames,\n    markLabel,\n    domName\n) {\n    this._zrId = zrId;\n    this._svgRoot = svgRoot;\n    this._tagNames = typeof tagNames === 'string' ? [tagNames] : tagNames;\n    this._markLabel = markLabel;\n    this._domName = domName || '_dom';\n\n    this.nextId = 0;\n}\n\n\nDefinable.prototype.createElement = createElement;\n\n\n/**\n * Get the <defs> tag for svgRoot; optionally creates one if not exists.\n *\n * @param {boolean} isForceCreating if need to create when not exists\n * @return {SVGDefsElement} SVG <defs> element, null if it doesn't\n * exist and isForceCreating is false\n */\nDefinable.prototype.getDefs = function (isForceCreating) {\n    var svgRoot = this._svgRoot;\n    var defs = this._svgRoot.getElementsByTagName('defs');\n    if (defs.length === 0) {\n        // Not exist\n        if (isForceCreating) {\n            defs = svgRoot.insertBefore(\n                this.createElement('defs'), // Create new tag\n                svgRoot.firstChild // Insert in the front of svg\n            );\n            if (!defs.contains) {\n                // IE doesn't support contains method\n                defs.contains = function (el) {\n                    var children = defs.children;\n                    if (!children) {\n                        return false;\n                    }\n                    for (var i = children.length - 1; i >= 0; --i) {\n                        if (children[i] === el) {\n                            return true;\n                        }\n                    }\n                    return false;\n                };\n            }\n            return defs;\n        }\n        else {\n            return null;\n        }\n    }\n    else {\n        return defs[0];\n    }\n};\n\n\n/**\n * Update DOM element if necessary.\n *\n * @param {Object|string} element style element. e.g., for gradient,\n *                                it may be '#ccc' or {type: 'linear', ...}\n * @param {Function|undefined} onUpdate update callback\n */\nDefinable.prototype.update = function (element, onUpdate) {\n    if (!element) {\n        return;\n    }\n\n    var defs = this.getDefs(false);\n    if (element[this._domName] && defs.contains(element[this._domName])) {\n        // Update DOM\n        if (typeof onUpdate === 'function') {\n            onUpdate(element);\n        }\n    }\n    else {\n        // No previous dom, create new\n        var dom = this.add(element);\n        if (dom) {\n            element[this._domName] = dom;\n        }\n    }\n};\n\n\n/**\n * Add gradient dom to defs\n *\n * @param {SVGElement} dom DOM to be added to <defs>\n */\nDefinable.prototype.addDom = function (dom) {\n    var defs = this.getDefs(true);\n    defs.appendChild(dom);\n};\n\n\n/**\n * Remove DOM of a given element.\n *\n * @param {SVGElement} element element to remove dom\n */\nDefinable.prototype.removeDom = function (element) {\n    var defs = this.getDefs(false);\n    if (defs && element[this._domName]) {\n        defs.removeChild(element[this._domName]);\n        element[this._domName] = null;\n    }\n};\n\n\n/**\n * Get DOMs of this element.\n *\n * @return {HTMLDomElement} doms of this defineable elements in <defs>\n */\nDefinable.prototype.getDoms = function () {\n    var defs = this.getDefs(false);\n    if (!defs) {\n        // No dom when defs is not defined\n        return [];\n    }\n\n    var doms = [];\n    zrUtil.each(this._tagNames, function (tagName) {\n        var tags = defs.getElementsByTagName(tagName);\n        // Note that tags is HTMLCollection, which is array-like\n        // rather than real array.\n        // So `doms.concat(tags)` add tags as one object.\n        doms = doms.concat([].slice.call(tags));\n    });\n\n    return doms;\n};\n\n\n/**\n * Mark DOMs to be unused before painting, and clear unused ones at the end\n * of the painting.\n */\nDefinable.prototype.markAllUnused = function () {\n    var doms = this.getDoms();\n    var that = this;\n    zrUtil.each(doms, function (dom) {\n        dom[that._markLabel] = MARK_UNUSED;\n    });\n};\n\n\n/**\n * Mark a single DOM to be used.\n *\n * @param {SVGElement} dom DOM to mark\n */\nDefinable.prototype.markUsed = function (dom) {\n    if (dom) {\n        dom[this._markLabel] = MARK_USED;\n    }\n};\n\n\n/**\n * Remove unused DOMs defined in <defs>\n */\nDefinable.prototype.removeUnused = function () {\n    var defs = this.getDefs(false);\n    if (!defs) {\n        // Nothing to remove\n        return;\n    }\n\n    var doms = this.getDoms();\n    var that = this;\n    zrUtil.each(doms, function (dom) {\n        if (dom[that._markLabel] !== MARK_USED) {\n            // Remove gradient\n            defs.removeChild(dom);\n        }\n    });\n};\n\n\n/**\n * Get SVG proxy.\n *\n * @param {Displayable} displayable displayable element\n * @return {Path|Image|Text} svg proxy of given element\n */\nDefinable.prototype.getSvgProxy = function (displayable) {\n    if (displayable instanceof Path) {\n        return svgPath;\n    }\n    else if (displayable instanceof ZImage) {\n        return svgImage;\n    }\n    else if (displayable instanceof ZText) {\n        return svgText;\n    }\n    else {\n        return svgPath;\n    }\n};\n\n\n/**\n * Get text SVG element.\n *\n * @param {Displayable} displayable displayable element\n * @return {SVGElement} SVG element of text\n */\nDefinable.prototype.getTextSvgElement = function (displayable) {\n    return displayable.__textSvgEl;\n};\n\n\n/**\n * Get SVG element.\n *\n * @param {Displayable} displayable displayable element\n * @return {SVGElement} SVG element\n */\nDefinable.prototype.getSvgElement = function (displayable) {\n    return displayable.__svgEl;\n};\n\n\nexport default Definable;\n","/**\n * @file Manages SVG gradient elements.\n * @author Zhang Wenli\n */\n\nimport Definable from './Definable';\nimport * as zrUtil from '../../core/util';\nimport zrLog from '../../core/log';\nimport * as colorTool from '../../tool/color';\n\n/**\n * Manages SVG gradient elements.\n *\n * @class\n * @extends Definable\n * @param   {number}     zrId    zrender instance id\n * @param   {SVGElement} svgRoot root of SVG document\n */\nfunction GradientManager(zrId, svgRoot) {\n    Definable.call(\n        this,\n        zrId,\n        svgRoot,\n        ['linearGradient', 'radialGradient'],\n        '__gradient_in_use__'\n    );\n}\n\n\nzrUtil.inherits(GradientManager, Definable);\n\n\n/**\n * Create new gradient DOM for fill or stroke if not exist,\n * but will not update gradient if exists.\n *\n * @param {SvgElement}  svgElement   SVG element to paint\n * @param {Displayable} displayable  zrender displayable element\n */\nGradientManager.prototype.addWithoutUpdate = function (\n    svgElement,\n    displayable\n) {\n    if (displayable && displayable.style) {\n        var that = this;\n        zrUtil.each(['fill', 'stroke'], function (fillOrStroke) {\n            if (displayable.style[fillOrStroke]\n                && (displayable.style[fillOrStroke].type === 'linear'\n                || displayable.style[fillOrStroke].type === 'radial')\n            ) {\n                var gradient = displayable.style[fillOrStroke];\n                var defs = that.getDefs(true);\n\n                // Create dom in <defs> if not exists\n                var dom;\n                if (gradient._dom) {\n                    // Gradient exists\n                    dom = gradient._dom;\n                    if (!defs.contains(gradient._dom)) {\n                        // _dom is no longer in defs, recreate\n                        that.addDom(dom);\n                    }\n                }\n                else {\n                    // New dom\n                    dom = that.add(gradient);\n                }\n\n                that.markUsed(displayable);\n\n                var id = dom.getAttribute('id');\n                svgElement.setAttribute(fillOrStroke, 'url(#' + id + ')');\n            }\n        });\n    }\n};\n\n\n/**\n * Add a new gradient tag in <defs>\n *\n * @param   {Gradient} gradient zr gradient instance\n * @return {SVGLinearGradientElement | SVGRadialGradientElement}\n *                            created DOM\n */\nGradientManager.prototype.add = function (gradient) {\n    var dom;\n    if (gradient.type === 'linear') {\n        dom = this.createElement('linearGradient');\n    }\n    else if (gradient.type === 'radial') {\n        dom = this.createElement('radialGradient');\n    }\n    else {\n        zrLog('Illegal gradient type.');\n        return null;\n    }\n\n    // Set dom id with gradient id, since each gradient instance\n    // will have no more than one dom element.\n    // id may exists before for those dirty elements, in which case\n    // id should remain the same, and other attributes should be\n    // updated.\n    gradient.id = gradient.id || this.nextId++;\n    dom.setAttribute('id', 'zr' + this._zrId\n        + '-gradient-' + gradient.id);\n\n    this.updateDom(gradient, dom);\n    this.addDom(dom);\n\n    return dom;\n};\n\n\n/**\n * Update gradient.\n *\n * @param {Gradient} gradient zr gradient instance\n */\nGradientManager.prototype.update = function (gradient) {\n    var that = this;\n    Definable.prototype.update.call(this, gradient, function () {\n        var type = gradient.type;\n        var tagName = gradient._dom.tagName;\n        if (type === 'linear' && tagName === 'linearGradient'\n            || type === 'radial' && tagName === 'radialGradient'\n        ) {\n            // Gradient type is not changed, update gradient\n            that.updateDom(gradient, gradient._dom);\n        }\n        else {\n            // Remove and re-create if type is changed\n            that.removeDom(gradient);\n            that.add(gradient);\n        }\n    });\n};\n\n\n/**\n * Update gradient dom\n *\n * @param {Gradient} gradient zr gradient instance\n * @param {SVGLinearGradientElement | SVGRadialGradientElement} dom\n *                            DOM to update\n */\nGradientManager.prototype.updateDom = function (gradient, dom) {\n    if (gradient.type === 'linear') {\n        dom.setAttribute('x1', gradient.x);\n        dom.setAttribute('y1', gradient.y);\n        dom.setAttribute('x2', gradient.x2);\n        dom.setAttribute('y2', gradient.y2);\n    }\n    else if (gradient.type === 'radial') {\n        dom.setAttribute('cx', gradient.x);\n        dom.setAttribute('cy', gradient.y);\n        dom.setAttribute('r', gradient.r);\n    }\n    else {\n        zrLog('Illegal gradient type.');\n        return;\n    }\n\n    if (gradient.global) {\n        // x1, x2, y1, y2 in range of 0 to canvas width or height\n        dom.setAttribute('gradientUnits', 'userSpaceOnUse');\n    }\n    else {\n        // x1, x2, y1, y2 in range of 0 to 1\n        dom.setAttribute('gradientUnits', 'objectBoundingBox');\n    }\n\n    // Remove color stops if exists\n    dom.innerHTML = '';\n\n    // Add color stops\n    var colors = gradient.colorStops;\n    for (var i = 0, len = colors.length; i < len; ++i) {\n        var stop = this.createElement('stop');\n        stop.setAttribute('offset', colors[i].offset * 100 + '%');\n\n        var color = colors[i].color;\n        if (color.indexOf('rgba' > -1)) {\n            // Fix Safari bug that stop-color not recognizing alpha #9014\n            var opacity = colorTool.parse(color)[3];\n            var hex = colorTool.toHex(color);\n\n            // stop-color cannot be color, since:\n            // The opacity value used for the gradient calculation is the\n            // *product* of the value of stop-opacity and the opacity of the\n            // value of stop-color.\n            // See https://www.w3.org/TR/SVG2/pservers.html#StopOpacityProperty\n            stop.setAttribute('stop-color', '#' + hex);\n            stop.setAttribute('stop-opacity', opacity);\n        }\n        else {\n            stop.setAttribute('stop-color', colors[i].color);\n        }\n\n        dom.appendChild(stop);\n    }\n\n    // Store dom element in gradient, to avoid creating multiple\n    // dom instances for the same gradient element\n    gradient._dom = dom;\n};\n\n/**\n * Mark a single gradient to be used\n *\n * @param {Displayable} displayable displayable element\n */\nGradientManager.prototype.markUsed = function (displayable) {\n    if (displayable.style) {\n        var gradient = displayable.style.fill;\n        if (gradient && gradient._dom) {\n            Definable.prototype.markUsed.call(this, gradient._dom);\n        }\n\n        gradient = displayable.style.stroke;\n        if (gradient && gradient._dom) {\n            Definable.prototype.markUsed.call(this, gradient._dom);\n        }\n    }\n};\n\n\nexport default GradientManager;\n","/**\n * @file Manages SVG clipPath elements.\n * @author Zhang Wenli\n */\n\nimport Definable from './Definable';\nimport * as zrUtil from '../../core/util';\nimport * as matrix from '../../core/matrix';\n\n/**\n * Manages SVG clipPath elements.\n *\n * @class\n * @extends Definable\n * @param   {number}     zrId    zrender instance id\n * @param   {SVGElement} svgRoot root of SVG document\n */\nfunction ClippathManager(zrId, svgRoot) {\n    Definable.call(this, zrId, svgRoot, 'clipPath', '__clippath_in_use__');\n}\n\n\nzrUtil.inherits(ClippathManager, Definable);\n\n\n/**\n * Update clipPath.\n *\n * @param {Displayable} displayable displayable element\n */\nClippathManager.prototype.update = function (displayable) {\n    var svgEl = this.getSvgElement(displayable);\n    if (svgEl) {\n        this.updateDom(svgEl, displayable.__clipPaths, false);\n    }\n\n    var textEl = this.getTextSvgElement(displayable);\n    if (textEl) {\n        // Make another clipPath for text, since it's transform\n        // matrix is not the same with svgElement\n        this.updateDom(textEl, displayable.__clipPaths, true);\n    }\n\n    this.markUsed(displayable);\n};\n\n\n/**\n * Create an SVGElement of displayable and create a <clipPath> of its\n * clipPath\n *\n * @param {Displayable} parentEl  parent element\n * @param {ClipPath[]}  clipPaths clipPaths of parent element\n * @param {boolean}     isText    if parent element is Text\n */\nClippathManager.prototype.updateDom = function (\n    parentEl,\n    clipPaths,\n    isText\n) {\n    if (clipPaths && clipPaths.length > 0) {\n        // Has clipPath, create <clipPath> with the first clipPath\n        var defs = this.getDefs(true);\n        var clipPath = clipPaths[0];\n        var clipPathEl;\n        var id;\n\n        var dom = isText ? '_textDom' : '_dom';\n\n        if (clipPath[dom]) {\n            // Use a dom that is already in <defs>\n            id = clipPath[dom].getAttribute('id');\n            clipPathEl = clipPath[dom];\n\n            // Use a dom that is already in <defs>\n            if (!defs.contains(clipPathEl)) {\n                // This happens when set old clipPath that has\n                // been previously removed\n                defs.appendChild(clipPathEl);\n            }\n        }\n        else {\n            // New <clipPath>\n            id = 'zr' + this._zrId + '-clip-' + this.nextId;\n            ++this.nextId;\n            clipPathEl = this.createElement('clipPath');\n            clipPathEl.setAttribute('id', id);\n            defs.appendChild(clipPathEl);\n\n            clipPath[dom] = clipPathEl;\n        }\n\n        // Build path and add to <clipPath>\n        var svgProxy = this.getSvgProxy(clipPath);\n        if (clipPath.transform\n            && clipPath.parent.invTransform\n            && !isText\n        ) {\n            /**\n             * If a clipPath has a parent with transform, the transform\n             * of parent should not be considered when setting transform\n             * of clipPath. So we need to transform back from parent's\n             * transform, which is done by multiplying parent's inverse\n             * transform.\n             */\n            // Store old transform\n            var transform = Array.prototype.slice.call(\n                clipPath.transform\n            );\n\n            // Transform back from parent, and brush path\n            matrix.mul(\n                clipPath.transform,\n                clipPath.parent.invTransform,\n                clipPath.transform\n            );\n            svgProxy.brush(clipPath);\n\n            // Set back transform of clipPath\n            clipPath.transform = transform;\n        }\n        else {\n            svgProxy.brush(clipPath);\n        }\n\n        var pathEl = this.getSvgElement(clipPath);\n\n        clipPathEl.innerHTML = '';\n        /**\n         * Use `cloneNode()` here to appendChild to multiple parents,\n         * which may happend when Text and other shapes are using the same\n         * clipPath. Since Text will create an extra clipPath DOM due to\n         * different transform rules.\n         */\n        clipPathEl.appendChild(pathEl.cloneNode());\n\n        parentEl.setAttribute('clip-path', 'url(#' + id + ')');\n\n        if (clipPaths.length > 1) {\n            // Make the other clipPaths recursively\n            this.updateDom(clipPathEl, clipPaths.slice(1), isText);\n        }\n    }\n    else {\n        // No clipPath\n        if (parentEl) {\n            parentEl.setAttribute('clip-path', 'none');\n        }\n    }\n};\n\n/**\n * Mark a single clipPath to be used\n *\n * @param {Displayable} displayable displayable element\n */\nClippathManager.prototype.markUsed = function (displayable) {\n    var that = this;\n    // displayable.__clipPaths can only be `null`/`undefined` or an non-empty array.\n    if (displayable.__clipPaths) {\n        zrUtil.each(displayable.__clipPaths, function (clipPath) {\n            if (clipPath._dom) {\n                Definable.prototype.markUsed.call(that, clipPath._dom);\n            }\n            if (clipPath._textDom) {\n                Definable.prototype.markUsed.call(that, clipPath._textDom);\n            }\n        });\n    }\n};\n\n\nexport default ClippathManager;\n","/**\n * @file Manages SVG shadow elements.\n * @author Zhang Wenli\n */\n\nimport Definable from './Definable';\nimport * as zrUtil from '../../core/util';\n\n/**\n * Manages SVG shadow elements.\n *\n * @class\n * @extends Definable\n * @param   {number}     zrId    zrender instance id\n * @param   {SVGElement} svgRoot root of SVG document\n */\nfunction ShadowManager(zrId, svgRoot) {\n    Definable.call(\n        this,\n        zrId,\n        svgRoot,\n        ['filter'],\n        '__filter_in_use__',\n        '_shadowDom'\n    );\n}\n\n\nzrUtil.inherits(ShadowManager, Definable);\n\n\n/**\n * Create new shadow DOM for fill or stroke if not exist,\n * but will not update shadow if exists.\n *\n * @param {SvgElement}  svgElement   SVG element to paint\n * @param {Displayable} displayable  zrender displayable element\n */\nShadowManager.prototype.addWithoutUpdate = function (\n    svgElement,\n    displayable\n) {\n    if (displayable && hasShadow(displayable.style)) {\n        var style = displayable.style;\n\n        // Create dom in <defs> if not exists\n        var dom;\n        if (style._shadowDom) {\n            // Gradient exists\n            dom = style._shadowDom;\n\n            var defs = this.getDefs(true);\n            if (!defs.contains(style._shadowDom)) {\n                // _shadowDom is no longer in defs, recreate\n                this.addDom(dom);\n            }\n        }\n        else {\n            // New dom\n            dom = this.add(displayable);\n        }\n\n        this.markUsed(displayable);\n\n        var id = dom.getAttribute('id');\n        svgElement.style.filter = 'url(#' + id + ')';\n    }\n};\n\n\n/**\n * Add a new shadow tag in <defs>\n *\n * @param {Displayable} displayable  zrender displayable element\n * @return {SVGFilterElement} created DOM\n */\nShadowManager.prototype.add = function (displayable) {\n    var dom = this.createElement('filter');\n    var style = displayable.style;\n\n    // Set dom id with shadow id, since each shadow instance\n    // will have no more than one dom element.\n    // id may exists before for those dirty elements, in which case\n    // id should remain the same, and other attributes should be\n    // updated.\n    style._shadowDomId = style._shadowDomId || this.nextId++;\n    dom.setAttribute('id', 'zr' + this._zrId\n        + '-shadow-' + style._shadowDomId);\n\n    this.updateDom(displayable, dom);\n    this.addDom(dom);\n\n    return dom;\n};\n\n\n/**\n * Update shadow.\n *\n * @param {Displayable} displayable  zrender displayable element\n */\nShadowManager.prototype.update = function (svgElement, displayable) {\n    var style = displayable.style;\n    if (hasShadow(style)) {\n        var that = this;\n        Definable.prototype.update.call(this, displayable, function (style) {\n            that.updateDom(displayable, style._shadowDom);\n        });\n    }\n    else {\n        // Remove shadow\n        this.remove(svgElement, style);\n    }\n};\n\n\n/**\n * Remove DOM and clear parent filter\n */\nShadowManager.prototype.remove = function (svgElement, style) {\n    if (style._shadowDomId != null) {\n        this.removeDom(style);\n        svgElement.style.filter = '';\n    }\n};\n\n\n/**\n * Update shadow dom\n *\n * @param {Displayable} displayable  zrender displayable element\n * @param {SVGFilterElement} dom DOM to update\n */\nShadowManager.prototype.updateDom = function (displayable, dom) {\n    var domChild = dom.getElementsByTagName('feDropShadow');\n    if (domChild.length === 0) {\n        domChild = this.createElement('feDropShadow');\n    }\n    else {\n        domChild = domChild[0];\n    }\n\n    var style = displayable.style;\n    var scaleX = displayable.scale ? (displayable.scale[0] || 1) : 1;\n    var scaleY = displayable.scale ? (displayable.scale[1] || 1) : 1;\n\n    // TODO: textBoxShadowBlur is not supported yet\n    var offsetX, offsetY, blur, color;\n    if (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY) {\n        offsetX = style.shadowOffsetX || 0;\n        offsetY = style.shadowOffsetY || 0;\n        blur = style.shadowBlur;\n        color = style.shadowColor;\n    }\n    else if (style.textShadowBlur) {\n        offsetX = style.textShadowOffsetX || 0;\n        offsetY = style.textShadowOffsetY || 0;\n        blur = style.textShadowBlur;\n        color = style.textShadowColor;\n    }\n    else {\n        // Remove shadow\n        this.removeDom(dom, style);\n        return;\n    }\n\n    domChild.setAttribute('dx', offsetX / scaleX);\n    domChild.setAttribute('dy', offsetY / scaleY);\n    domChild.setAttribute('flood-color', color);\n\n    // Divide by two here so that it looks the same as in canvas\n    // See: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur\n    var stdDx = blur / 2 / scaleX;\n    var stdDy = blur / 2 / scaleY;\n    var stdDeviation = stdDx + ' ' + stdDy;\n    domChild.setAttribute('stdDeviation', stdDeviation);\n\n    // Fix filter clipping problem\n    dom.setAttribute('x', '-100%');\n    dom.setAttribute('y', '-100%');\n    dom.setAttribute('width', Math.ceil(blur / 2 * 200) + '%');\n    dom.setAttribute('height', Math.ceil(blur / 2 * 200) + '%');\n\n    dom.appendChild(domChild);\n\n    // Store dom element in shadow, to avoid creating multiple\n    // dom instances for the same shadow element\n    style._shadowDom = dom;\n};\n\n/**\n * Mark a single shadow to be used\n *\n * @param {Displayable} displayable displayable element\n */\nShadowManager.prototype.markUsed = function (displayable) {\n    var style = displayable.style;\n    if (style && style._shadowDom) {\n        Definable.prototype.markUsed.call(this, style._shadowDom);\n    }\n};\n\nfunction hasShadow(style) {\n    // TODO: textBoxShadowBlur is not supported yet\n    return style\n        && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY\n            || style.textShadowBlur || style.textShadowOffsetX\n            || style.textShadowOffsetY);\n}\n\n\nexport default ShadowManager;\n","/**\n * SVG Painter\n * @module zrender/svg/Painter\n */\n\nimport {createElement} from './core';\nimport * as util from '../core/util';\nimport zrLog from '../core/log';\nimport Path from '../graphic/Path';\nimport ZImage from '../graphic/Image';\nimport ZText from '../graphic/Text';\nimport arrayDiff from '../core/arrayDiff2';\nimport GradientManager from './helper/GradientManager';\nimport ClippathManager from './helper/ClippathManager';\nimport ShadowManager from './helper/ShadowManager';\nimport {\n    path as svgPath,\n    image as svgImage,\n    text as svgText\n} from './graphic';\n\nfunction parseInt10(val) {\n    return parseInt(val, 10);\n}\n\nfunction getSvgProxy(el) {\n    if (el instanceof Path) {\n        return svgPath;\n    }\n    else if (el instanceof ZImage) {\n        return svgImage;\n    }\n    else if (el instanceof ZText) {\n        return svgText;\n    }\n    else {\n        return svgPath;\n    }\n}\n\nfunction checkParentAvailable(parent, child) {\n    return child && parent && child.parentNode !== parent;\n}\n\nfunction insertAfter(parent, child, prevSibling) {\n    if (checkParentAvailable(parent, child) && prevSibling) {\n        var nextSibling = prevSibling.nextSibling;\n        nextSibling ? parent.insertBefore(child, nextSibling)\n            : parent.appendChild(child);\n    }\n}\n\nfunction prepend(parent, child) {\n    if (checkParentAvailable(parent, child)) {\n        var firstChild = parent.firstChild;\n        firstChild ? parent.insertBefore(child, firstChild)\n            : parent.appendChild(child);\n    }\n}\n\nfunction append(parent, child) {\n    if (checkParentAvailable(parent, child)) {\n        parent.appendChild(child);\n    }\n}\n\nfunction remove(parent, child) {\n    if (child && parent && child.parentNode === parent) {\n        parent.removeChild(child);\n    }\n}\n\nfunction getTextSvgElement(displayable) {\n    return displayable.__textSvgEl;\n}\n\nfunction getSvgElement(displayable) {\n    return displayable.__svgEl;\n}\n\n/**\n * @alias module:zrender/svg/Painter\n * @constructor\n * @param {HTMLElement} root 绘图容器\n * @param {module:zrender/Storage} storage\n * @param {Object} opts\n */\nvar SVGPainter = function (root, storage, opts, zrId) {\n\n    this.root = root;\n    this.storage = storage;\n    this._opts = opts = util.extend({}, opts || {});\n\n    var svgRoot = createElement('svg');\n    svgRoot.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    svgRoot.setAttribute('version', '1.1');\n    svgRoot.setAttribute('baseProfile', 'full');\n    svgRoot.style.cssText = 'user-select:none;position:absolute;left:0;top:0;';\n\n    this.gradientManager = new GradientManager(zrId, svgRoot);\n    this.clipPathManager = new ClippathManager(zrId, svgRoot);\n    this.shadowManager = new ShadowManager(zrId, svgRoot);\n\n    var viewport = document.createElement('div');\n    viewport.style.cssText = 'overflow:hidden;position:relative';\n\n    this._svgRoot = svgRoot;\n    this._viewport = viewport;\n\n    root.appendChild(viewport);\n    viewport.appendChild(svgRoot);\n\n    this.resize(opts.width, opts.height);\n\n    this._visibleList = [];\n};\n\nSVGPainter.prototype = {\n\n    constructor: SVGPainter,\n\n    getType: function () {\n        return 'svg';\n    },\n\n    getViewportRoot: function () {\n        return this._viewport;\n    },\n\n    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\n    refresh: function () {\n\n        var list = this.storage.getDisplayList(true);\n\n        this._paintList(list);\n    },\n\n    setBackgroundColor: function (backgroundColor) {\n        // TODO gradient\n        this._viewport.style.background = backgroundColor;\n    },\n\n    _paintList: function (list) {\n        this.gradientManager.markAllUnused();\n        this.clipPathManager.markAllUnused();\n        this.shadowManager.markAllUnused();\n\n        var svgRoot = this._svgRoot;\n        var visibleList = this._visibleList;\n        var listLen = list.length;\n\n        var newVisibleList = [];\n        var i;\n        for (i = 0; i < listLen; i++) {\n            var displayable = list[i];\n            var svgProxy = getSvgProxy(displayable);\n            var svgElement = getSvgElement(displayable)\n                || getTextSvgElement(displayable);\n            if (!displayable.invisible) {\n                if (displayable.__dirty) {\n                    svgProxy && svgProxy.brush(displayable);\n\n                    // Update clipPath\n                    this.clipPathManager.update(displayable);\n\n                    // Update gradient and shadow\n                    if (displayable.style) {\n                        this.gradientManager\n                            .update(displayable.style.fill);\n                        this.gradientManager\n                            .update(displayable.style.stroke);\n\n                        this.shadowManager\n                            .update(svgElement, displayable);\n                    }\n\n                    displayable.__dirty = false;\n                }\n                newVisibleList.push(displayable);\n            }\n        }\n\n        var diff = arrayDiff(visibleList, newVisibleList);\n        var prevSvgElement;\n\n        // First do remove, in case element moved to the head and do remove\n        // after add\n        for (i = 0; i < diff.length; i++) {\n            var item = diff[i];\n            if (item.removed) {\n                for (var k = 0; k < item.count; k++) {\n                    var displayable = visibleList[item.indices[k]];\n                    var svgElement = getSvgElement(displayable);\n                    var textSvgElement = getTextSvgElement(displayable);\n                    remove(svgRoot, svgElement);\n                    remove(svgRoot, textSvgElement);\n                }\n            }\n        }\n        for (i = 0; i < diff.length; i++) {\n            var item = diff[i];\n            if (item.added) {\n                for (var k = 0; k < item.count; k++) {\n                    var displayable = newVisibleList[item.indices[k]];\n                    var svgElement = getSvgElement(displayable);\n                    var textSvgElement = getTextSvgElement(displayable);\n                    prevSvgElement\n                        ? insertAfter(svgRoot, svgElement, prevSvgElement)\n                        : prepend(svgRoot, svgElement);\n                    if (svgElement) {\n                        insertAfter(svgRoot, textSvgElement, svgElement);\n                    }\n                    else if (prevSvgElement) {\n                        insertAfter(\n                            svgRoot, textSvgElement, prevSvgElement\n                        );\n                    }\n                    else {\n                        prepend(svgRoot, textSvgElement);\n                    }\n                    // Insert text\n                    insertAfter(svgRoot, textSvgElement, svgElement);\n                    prevSvgElement = textSvgElement || svgElement\n                        || prevSvgElement;\n\n                    this.gradientManager\n                        .addWithoutUpdate(svgElement, displayable);\n                    this.shadowManager\n                        .addWithoutUpdate(prevSvgElement, displayable);\n                    this.clipPathManager.markUsed(displayable);\n                }\n            }\n            else if (!item.removed) {\n                for (var k = 0; k < item.count; k++) {\n                    var displayable = newVisibleList[item.indices[k]];\n                    prevSvgElement =\n                        svgElement =\n                        getTextSvgElement(displayable)\n                        || getSvgElement(displayable)\n                        || prevSvgElement;\n\n                    this.gradientManager.markUsed(displayable);\n                    this.gradientManager\n                        .addWithoutUpdate(svgElement, displayable);\n\n                    this.shadowManager.markUsed(displayable);\n                    this.shadowManager\n                        .addWithoutUpdate(svgElement, displayable);\n\n                    this.clipPathManager.markUsed(displayable);\n                }\n            }\n        }\n\n        this.gradientManager.removeUnused();\n        this.clipPathManager.removeUnused();\n        this.shadowManager.removeUnused();\n\n        this._visibleList = newVisibleList;\n    },\n\n    _getDefs: function (isForceCreating) {\n        var svgRoot = this._svgRoot;\n        var defs = this._svgRoot.getElementsByTagName('defs');\n        if (defs.length === 0) {\n            // Not exist\n            if (isForceCreating) {\n                var defs = svgRoot.insertBefore(\n                    createElement('defs'), // Create new tag\n                    svgRoot.firstChild // Insert in the front of svg\n                );\n                if (!defs.contains) {\n                    // IE doesn't support contains method\n                    defs.contains = function (el) {\n                        var children = defs.children;\n                        if (!children) {\n                            return false;\n                        }\n                        for (var i = children.length - 1; i >= 0; --i) {\n                            if (children[i] === el) {\n                                return true;\n                            }\n                        }\n                        return false;\n                    };\n                }\n                return defs;\n            }\n            else {\n                return null;\n            }\n        }\n        else {\n            return defs[0];\n        }\n    },\n\n    resize: function (width, height) {\n        var viewport = this._viewport;\n        // FIXME Why ?\n        viewport.style.display = 'none';\n\n        // Save input w/h\n        var opts = this._opts;\n        width != null && (opts.width = width);\n        height != null && (opts.height = height);\n\n        width = this._getSize(0);\n        height = this._getSize(1);\n\n        viewport.style.display = '';\n\n        if (this._width !== width || this._height !== height) {\n            this._width = width;\n            this._height = height;\n\n            var viewportStyle = viewport.style;\n            viewportStyle.width = width + 'px';\n            viewportStyle.height = height + 'px';\n\n            var svgRoot = this._svgRoot;\n            // Set width by 'svgRoot.width = width' is invalid\n            svgRoot.setAttribute('width', width);\n            svgRoot.setAttribute('height', height);\n        }\n    },\n\n    /**\n     * 获取绘图区域宽度\n     */\n    getWidth: function () {\n        return this._width;\n    },\n\n    /**\n     * 获取绘图区域高度\n     */\n    getHeight: function () {\n        return this._height;\n    },\n\n    _getSize: function (whIdx) {\n        var opts = this._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\n        if (opts[wh] != null && opts[wh] !== 'auto') {\n            return parseFloat(opts[wh]);\n        }\n\n        var root = this.root;\n        // IE8 does not support getComputedStyle, but it use VML.\n        var stl = document.defaultView.getComputedStyle(root);\n\n        return (\n            (root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh]))\n            - (parseInt10(stl[plt]) || 0)\n            - (parseInt10(stl[prb]) || 0)\n        ) | 0;\n    },\n\n    dispose: function () {\n        this.root.innerHTML = '';\n\n        this._svgRoot =\n            this._viewport =\n            this.storage =\n            null;\n    },\n\n    clear: function () {\n        if (this._viewport) {\n            this.root.removeChild(this._viewport);\n        }\n    },\n\n    pathToDataUrl: function () {\n        this.refresh();\n        var html = this._svgRoot.outerHTML;\n        return 'data:image/svg+xml;charset=UTF-8,' + html;\n    }\n};\n\n// Not supported methods\nfunction createMethodNotSupport(method) {\n    return function () {\n        zrLog('In SVG mode painter not support method \"' + method + '\"');\n    };\n}\n\n// Unsuppoted methods\nutil.each([\n    'getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer',\n    'eachOtherLayer', 'getLayers', 'modLayer', 'delLayer', 'clearLayer',\n    'toDataURL', 'pathToImage'\n], function (name) {\n    SVGPainter.prototype[name] = createMethodNotSupport(name);\n});\n\nexport default SVGPainter;","import './graphic';\nimport {registerPainter} from '../zrender';\nimport Painter from './Painter';\n\nregisterPainter('svg', Painter);","/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\nexport * from './src/echarts';\nexport * from './src/export';\n\nimport './src/component/dataset';\n\n\n\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// ----------------------------------------------\n\n\n\n// ----------------\n// Charts (series)\n// ----------------\n\n\n\n// All of the series types, for example:\n// chart.setOption({\n//     series: [{\n//         type: 'line' // or 'bar', 'pie', ...\n//     }]\n// });\n\nimport './src/chart/line';\nimport './src/chart/bar';\nimport './src/chart/pie';\nimport './src/chart/scatter';\nimport './src/chart/radar';\nimport './src/chart/map';\nimport './src/chart/tree';\nimport './src/chart/treemap';\nimport './src/chart/graph';\nimport './src/chart/gauge';\nimport './src/chart/funnel';\nimport './src/chart/parallel';\nimport './src/chart/sankey';\nimport './src/chart/boxplot';\nimport './src/chart/candlestick';\nimport './src/chart/effectScatter';\nimport './src/chart/lines';\nimport './src/chart/heatmap';\nimport './src/chart/pictorialBar';\nimport './src/chart/themeRiver';\nimport './src/chart/sunburst';\nimport './src/chart/custom';\n\n\n\n// -------------------\n// Coordinate systems\n// -------------------\n\n\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\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// });\nimport './src/component/grid';\n\n// `polar` coordinate system, for example:\n// chart.setOption({\n//     polar: {...},\n//     radiusAxis: {...},\n//     angleAxis: {...},\n//     series: [{\n//         coordinateSystem: 'polar'\n//     }]\n// });\nimport './src/component/polar';\n\n// `geo` coordinate system, for example:\n// chart.setOption({\n//     geo: {...},\n//     series: [{\n//         coordinateSystem: 'geo'\n//     }]\n// });\nimport './src/component/geo';\n\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// });\nimport './src/component/singleAxis';\n\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// });\nimport './src/component/parallel';\n\n// `calendar` coordinate system. for example,\n// chart.setOptionp({\n//     calendar: {...},\n//     series: [{\n//         coordinateSystem: 'calendar'\n//     }]\n// );\nimport './src/component/calendar';\n\n\n\n// ------------------\n// Other components\n// ------------------\n\n\n\n// `grapchic` component, for example:\n// chart.setOption({\n//     graphic: {...}\n// });\nimport './src/component/graphic';\n\n// `toolbox` component, for example:\n// chart.setOption({\n//     toolbox: {...}\n// });\nimport './src/component/toolbox';\n\n// `tooltip` component, for example:\n// chart.setOption({\n//     tooltip: {...}\n// });\nimport './src/component/tooltip';\n\n// `axisPointer` component, for example:\n// chart.setOption({\n//     tooltip: {axisPointer: {...}, ...}\n// });\n// Or\n// chart.setOption({\n//     axisPointer: {...}\n// });\nimport './src/component/axisPointer';\n\n// `brush` component, for example:\n// chart.setOption({\n//     brush: {...}\n// });\n// Or\n// chart.setOption({\n//     tooltip: {feature: {brush: {...}}\n// })\nimport './src/component/brush';\n\n// `title` component, for example:\n// chart.setOption({\n//     title: {...}\n// });\nimport './src/component/title';\n\n// `timeline` component, for example:\n// chart.setOption({\n//     timeline: {...}\n// });\nimport './src/component/timeline';\n\n// `markPoint` component, for example:\n// chart.setOption({\n//     series: [{markPoint: {...}}]\n// });\nimport './src/component/markPoint';\n\n// `markLine` component, for example:\n// chart.setOption({\n//     series: [{markLine: {...}}]\n// });\nimport './src/component/markLine';\n\n// `markArea` component, for example:\n// chart.setOption({\n//     series: [{markArea: {...}}]\n// });\nimport './src/component/markArea';\n\n// `legend` component scrollable, for example:\n// chart.setOption({\n//     legend: {type: 'scroll'}\n// });\nimport './src/component/legendScroll';\n\n// `legend` component not scrollable. for example:\n// chart.setOption({\n//     legend: {...}\n// });\nimport './src/component/legend';\n\n// `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`.\nimport './src/component/dataZoom';\n\n// `dataZoom` component providing drag, pinch, wheel behaviors\n// inside coodinate system, for example:\n// chart.setOption({\n//     dataZoom: {type: 'inside'}\n// });\nimport './src/component/dataZoomInside';\n\n// `dataZoom` component providing a slider bar, for example:\n// chart.setOption({\n//     dataZoom: {type: 'slider'}\n// });\nimport './src/component/dataZoomSlider';\n\n// `dataZoom` component including both `visualMapContinuous` and `visualMapPiecewise`.\nimport './src/component/visualMap';\n\n// `visualMap` component providing continuous bar, for example:\n// chart.setOption({\n//     visualMap: {type: 'continuous'}\n// });\nimport './src/component/visualMapContinuous';\n\n// `visualMap` component providing pieces bar, for example:\n// chart.setOption({\n//     visualMap: {type: 'piecewise'}\n// });\nimport './src/component/visualMapPiecewise';\n\n\n\n// -----------------\n// Render engines\n// -----------------\n\n\n\n// Provide IE 6,7,8 compatibility.\nimport 'zrender/src/vml/vml';\n\n// Render via SVG rather than canvas.\nimport 'zrender/src/svg/svg';\n"],"names":["isObject","each","isFunction","assert","clone","env","eventUtil.clientToLocal","dist","eventTool.stop","util.each","vec2.dist","util.mixin","ArrayCtor","create","copy","mul","scale","matrix.identity","matrix.create","matrix.mul","matrix.copy","matrix.invert","vector.applyTransform","matrix.scale","matrix.rotate","easing","easingFuncs","lerp","color.parse","log","zrUtil.isObject","zrUtil.mixin","vec2.applyTransform","matrix.translate","zrUtil.indexOf","zrUtil.inherits","timsort","util.indexOf","util.createCanvas","util.isObject","DEFAULT_FONT","methods","$override","imageHelper.findExistImage","imageHelper.isImageReady","textContain.DEFAULT_FONT","textContain.makeFont","textContain.parsePlainText","textContain.adjustTextY","textContain.getWidth","textContain.adjustTextX","textContain.parseRichText","roundRectHelper.buildPath","imageHelper.createOrUpdateImage","textContain.calculateTextPosition","tmpRect","textHelper.normalizeTextStyle","textHelper.needDrawText","textHelper.renderText","util.extend","util.merge","Image","Dispatcher","zrUtil.map","zrUtil.each","zrUtil.bind","instances","version","init","dispose","HandlerProxy","isArray","zrUtil.isArray","zrUtil.createHashMap","zrUtil.assert","map","zrUtil.isString","parseClassType","zrUtil.extend","zrUtil.slice","mathSqrt","EPSILON","v2Create","isNotAroundZero","v2DistSquare","mathMin","mathMax","mathSin","mathCos","vec2.create","min","max","cubicExtrema","curve.cubicExtrema","cubicAt","curve.cubicAt","quadraticExtremum","curve.quadraticExtremum","quadraticAt","curve.quadraticAt","vec2.min","vec2.max","dpr","len","bbox.fromLine","bbox.fromCubic","bbox.fromQuadratic","bbox.fromArc","containStroke","curve.cubicProjectPoint","PI2","CMD","curve.cubicRootAt","curve.quadraticRootAt","line.containStroke","cubic.containStroke","quadratic.containStroke","arc.containStroke","pathContain.containStroke","pathContain.contain","defaults","v2ApplyTransform","mergePath","textContain.getBoundingRect","textHelper.getStroke","distance","v2Distance","v2Min","v2Max","v2Clone","v2Sub","v2Scale","v2Add","buildPath","polyHelper.buildPath","subPixelOptimizeLine","subPixelOptimize","subPixelOptimizeRect","subPixelOptimizeOutputShape","vec2.normalize","Displayble","pathTool.extendFromString","pathTool.createFromString","pathTool.mergePath","subPixelOptimizeUtil.subPixelOptimizeLine","subPixelOptimizeUtil.subPixelOptimizeRect","subPixelOptimizeUtil.subPixelOptimize","colorTool.lift","zrUtil.isFunction","zrUtil.retrieve2","zrUtil.trim","applyTransform","invert","zrUtil.isArrayLike","vector.clone","zrUtil.defaults","graphicUtil.getFont","mixin","zrUtil.merge","zrUtil.clone","parsePercent","round","zrUtil.reduce","normalizeCssArray","zrUtil.normalizeCssArray","numberUtil.parseDate","truncateText","textContain.truncateText","zrUtil.curry","formatUtil.normalizeCssArray","merge","inner","componentUtil.getUID","layout.getLayoutParams","layout.mergeLayoutParam","componentUtil.enableSubTypeDefaulter","componentUtil.enableTopologicalTravel","modelUtil.normalizeToArray","modelUtil.mappingToExists","modelUtil.makeIdAndName","modelUtil.isIdInner","zrUtil.isTypedArray","zrUtil.setAsPrimitive","modelUtil.TEXT_STYLE_OPTIONS","set","modelUtil.makeInner","modelUtil.defaultEmphasis","modelUtil.isNameSpecified","Component","clazzUtil.enableClassExtend","clazzUtil.enableClassManagement","graphicUtil.isHighDownDispatcher","modelUtil.queryDataIndex","graphicUtil.getHighlightDigit","PI","graphic.Rect","graphic.Arc","graphic.Group","ComponentView","theme","zrender.init","zrUtil.createCanvas","graphic.Image","modelUtil.parseFinder","colorTool.parse","colorTool.stringify","ChartView","modelUtil.setAttribute","zrender.version","zrUtil.isDom","modelUtil.getAttribute","CoordinateSystem","zrUtil.$override","zrUtil.noop","darkTheme","proto","roundNumber","numberUtil.round","numberUtil.nice","numberUtil.getPrecisionSafe","helper.getIntervalPrecision","helper.intervalScaleGetTicks","formatUtil.addCommas","helper.intervalScaleNiceTicks","formatUtil.formatTime","scaleHelper.fixExtent","scaleProto","intervalScaleProto","getPrecisionSafe","mathFloor","mathCeil","mathPow","numberUtil.quantity","numberUtil.parsePercent","zrUtil.eqNaN","graphic.extendShape","graphic.Line","graphic.Circle","graphic.makeImage","graphic.makePath","dataStack","axisHelper.createScaleByModel","axisHelper.niceScaleExtent","Model","isAroundEqual","contain","bbox.fromPoints","polygonContain.contain","zrUtil.filter","parseGeoJSON","graphic","graphicUtil","SymbolClz","graphic.updateProps","graphic.initProps","graphic.setLabelStyle","graphic.setHoverStyle","scaleAndAdd","vec2.scaleAndAdd","vec2.copy","vec2.sub","Polyline","Polygon","graphic.Sector","graphic.LinearGradient","zrUtil.mergeAll","formatUtil.truncateText","graphic.Text","graphic.setTextStyle","matrixUtil.identity","matrixUtil.rotate","matrixUtil.mul","curry","echarts.extendComponentView","axisPointerModelHelper.fixValue","axisPointerModelHelper.getAxisPointerModel","layout","zrUtil.retrieve","cartesianAxisHelper.layout","graphic.groupTransition","echarts.registerPreprocessor","echarts.registerVisual","echarts.registerLayout","layoutPoints","echarts.registerProcessor","echarts.PRIORITY","echarts.extendChartView","echarts.extendSeriesModel","dataSelectableMixin","graphic.Polyline","echarts.registerAction","RADIAN","IncrementalDisplayable","echarts.extendComponentModel","axisBuilderAttrs","graphic.Ring","graphic.Polygon","graphic.mergePath","createSymbol","symbolUtil.createSymbol","zrUtil.find","backwardCompat","points","i","parseGeoJson","getBoundingRect","bind","eventTool.isMiddleOrRightButtonOnMouseUpDown","interactionMutex.isTaken","graphic.CompoundPath","roamHelper.updateViewOnPan","roamHelper.updateViewOnZoom","graphic.Z2_EMPHASIS_LIFT","vector.copy","doConvert","layout.getLayoutRect","echarts.registerCoordinateSystem","symbolNeedsDraw","graphic.BezierCurve","separation","sep","layout.positionElement","layout.getAvailableSize","Group","Rect","helper\n            .retrieveTargetInfo","animationUtil.createWrap","helper.aboveViewRoot","noop","helper.retrieveTargetInfo","zrColor.fastLerp","zrColor.stringify","zrColor.modifyHSL","zrColor.modifyAlpha","zrColor.parse","mapVisual","helper.getPathToRoot","sort","vector.sub","vector.normalize","Line","zrUtil.retrieve3","LineGroup","makeSeriesScope","getSymbolSize","curveTool.quadraticAt","vec2.distSquare","mathAbs","quadraticSubdivide","curveTool.quadraticSubdivide","vec2.clone","graphic.modifyLabelStyle","normalize","simpleLayout","circularLayout","forceLayout","vec2.len","vec2.set","getViewRect","labelLayout","restrict","layoutUtil.getLayoutRect","graphic.applyTransform","AxisModel","numberUtil.asc","defaultOption","getAxisType","actionInfo","interactionMutex.take","interactionMutex.release","updateZ","trigger","getTransform","graphic.getTransform","graphic.transformDirection","graphicUtil.clipPointsByRect","AxisView","graphic.BoundingRect","brushHelper.makeRectPanelClipPath","brushHelper.makeRectIsTargetByCursor","brushHelper.makeLinearBrushOtherExtent","throttleUtil.createOrUpdate","createGridClipShape","opacityAccessPath","nodeOpacityPath","lineOpacityPath","getItemOpacity","fadeOutItem","fadeInItem","center","NORMAL_ITEM_STYLE_PATH","EMPHASIS_ITEM_STYLE_PATH","createNormalBox","createLarge","transInit","setLargeStyle","LargeArr","normalizeSymbolSize","matrix.clone","curveUtil.quadraticAt","quadraticDerivativeAt","curveUtil.quadraticDerivativeAt","vec2.lerp","lineContain.containStroke","quadraticContain.containStroke","HeatmapLayer","BAR_BORDER_WIDTH_QUERY","BarView","updateCommon","singleAxisHelper.layout","modelHelper.makeKey","globalListener.register","globalListener.unregister","updateProps","axisPointerModelHelper.getAxisInfo","graphic.createIcon","axisHelper.getAxisRawValue","viewHelper.buildElStyle","viewHelper.buildCartesianSingleLabelElOption","viewHelper.getTransformedPosition","viewHelper.makeLineShape","viewHelper.makeRectShape","axisPointerModelHelper.collect","pointerShapeBuilder","themeRiverLayout","completeTreeValue","ROOT_TO_NODE_ACTION","helper\n                .retrieveTargetInfo","initChildren","dataToCoordSize","CACHED_LABEL_STYLE_PROPERTIES","graphicUtil.CACHED_LABEL_STYLE_PROPERTIES","createOrUpdate","graphicUtil.makePath","graphicUtil.Image","graphicUtil.Text","graphicUtil.initProps","graphicUtil.updateProps","graphicUtil.setElementHoverStyle","graphicUtil.setAsHighDownDispatcher","graphicUtil.setTextStyle","getSeriesStackId","getAxisKey","elementList","selfBuilderAttrs","formatUtil.capitalFirst","viewHelper.buildLabelElOption","viewHelper.makeSectorShape","barPolar","formatUtil.formatTplSimple","createEl","layoutUtil.positionElement","layoutUtil.LOCATION_PARAMS","layoutUtil.mergeLayoutParam","layoutUtil.copyLayoutParams","register","get","featureManager.get","layoutBox","listComponentHelper.layout","listComponentHelper.makeBackground","lang","featureManager.register","trim","eventTool.addEventListener","indexOf","parseFinder","ATTR","clear","eachAxisDim","asc","helper.isCoordSupported","numberUtil.linearMap","numberUtil.getPixelPrecision","helper.eachAxisDim","helper.createLinkedNodesFinder","handlers","history.pop","history.push","history.count","history.clear","toCamelCase","formatUtil.toCamelCase","zrColor.toHex","eventUtil.normalizeEvent","makeDispatchAction","axisPointerViewHelper.getValueLabel","formatUtil.encodeHTML","formatUtil.formatTpl","visualSolution.createVisualMappings","visualSolution.applyVisual","visualSolution.replaceVisualOption","preprocessor","has","modelUtil.getDataItemValue","addCommas","encodeHTML","numberUtil.getPrecision","getAxisInfo","dataFilter","createList","markerHelper.dataTransform","markerHelper.dataFilter","markerHelper.dimValueGetter","markerHelper.getAxisInfo","markerHelper.numCalculate","dimValueGetter","retrieve","isInifinity","ifMarkLineHasOnlyDim","colorUtil.modifyAlpha","layoutUtil.box","mergeAndNormalizeLayoutParams","WH","XY","linearMap","throttle.createOrUpdate","throttle.clear","giveStore","dispatchAction","unregister","roams.generateCoordId","roams.register","roams.unregister","visualSolution.incrementalApplyVisual","helper.getItemAlign","getCursor","modelUtil.compressBatches","helper.makeHighDownBatch","layout.box","abs","Z_BASE","length","vmlCore.createNode","vmlCore.doc","textContain.$override","doc","createNode","parseInt10","vmlCore.initVML","Painter","isAroundZero","pathDataToString","rotate","ZText","colorTool.toHex","remove","arrayDiff","createMethodNotSupport"],"mappings":"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,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CA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"}