This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch fix/bar-race
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit 2a1bad2e7e3a76f7f52e51ebd884b2a3d1411b3e
Author: 100pah <[email protected]>
AuthorDate: Sat Jan 9 14:52:42 2021 +0800

    fix: realtimeSort:
    + When base axis is x, the initial sort should not be different from the 
subsequent sort.
    + Remove the transition animation of the baseAxis init state to the first 
sorted state.
    + Fix that throw error when series data does not cover all axis category.
    + Fix some incorrect logic like:
        + BarView sortMap input param
        + OrdinalScale['scale']
        + OrdinalScale['getTicks']
    + Simplify and clarify the params `sortInfo` of action "changeAxisOrder".
        ```js
        // before:
        sortInfo: [
            // `beforeSortIndex` is not easy to understand and not necessary.
            { ordinalNumber: 2, beforeSortIndex: 4 },
            { ordinalNumber: 5, beforeSortIndex: 5 },
            { ordinalNumber: 3, beforeSortIndex: 0 },
            { ordinalNumber: 4, beforeSortIndex: 2 },
            { ordinalNumber: 0, beforeSortIndex: 3 },
            { ordinalNumber: 1, beforeSortIndex: 1 },
        ]
        // after:
        sortInfo: {
            ordinalNumbers: [2, 5, 3, 4, 0, 1]
        }
        ```
    + some small refactor: naming, code organization, type. Add comments.
    
    Test cases:
    test/bar-race.html
    test/bar-race2.html
---
 src/chart/bar/BarSeries.ts              |   8 +
 src/chart/bar/BarView.ts                | 346 +++++++++++--------
 src/chart/helper/createListFromArray.ts |   5 +
 src/chart/line/LineView.ts              |   4 +-
 src/component/axis/AngleAxisView.ts     |   7 +-
 src/component/axis/AxisBuilder.ts       |   2 +-
 src/coord/Axis.ts                       |   7 +-
 src/coord/cartesian/Axis2D.ts           |   4 +-
 src/coord/cartesian/AxisModel.ts        |   2 +-
 src/coord/cartesian/Grid.ts             |   2 +-
 src/model/Global.ts                     |   2 +-
 src/scale/Ordinal.ts                    | 176 +++++++---
 src/util/types.ts                       |  29 +-
 test/bar-race2.html                     | 575 ++++++++++++++++++++++++++++++++
 14 files changed, 967 insertions(+), 202 deletions(-)

diff --git a/src/chart/bar/BarSeries.ts b/src/chart/bar/BarSeries.ts
index 0cb5399..87713ee 100644
--- a/src/chart/bar/BarSeries.ts
+++ b/src/chart/bar/BarSeries.ts
@@ -29,6 +29,7 @@ import {
     SeriesEncodeOptionMixin
 } from '../../util/types';
 import type Cartesian2D from '../../coord/cartesian/Cartesian2D';
+import createListFromArray from '../helper/createListFromArray';
 import type Polar from '../../coord/polar/Polar';
 import { inheritDefaultOption } from '../../util/component';
 import List from '../../data/List';
@@ -83,6 +84,13 @@ class BarSeriesModel extends 
BaseBarSeriesModel<BarSeriesOption> {
 
     coordinateSystem: Cartesian2D | Polar;
 
+    getInitialData(): List {
+        return createListFromArray(this.getSource(), this, {
+            useEncodeDefaulter: true,
+            createInvertedIndices: !!this.get('realtimeSort', true) || null
+        });
+    }
+
     /**
      * @override
      */
diff --git a/src/chart/bar/BarView.ts b/src/chart/bar/BarView.ts
index 7c768e7..e190653 100644
--- a/src/chart/bar/BarView.ts
+++ b/src/chart/bar/BarView.ts
@@ -19,7 +19,7 @@
 
 import Path, {PathProps} from 'zrender/src/graphic/Path';
 import Group from 'zrender/src/graphic/Group';
-import {extend, map, defaults, each} from 'zrender/src/core/util';
+import {extend, defaults, each, map} from 'zrender/src/core/util';
 import {
     Rect,
     Sector,
@@ -59,6 +59,7 @@ import {AngleAxisModel, RadiusAxisModel} from 
'../../coord/polar/AxisModel';
 import CartesianAxisModel from '../../coord/cartesian/AxisModel';
 import {LayoutRect} from '../../util/layout';
 import {EventCallback} from 'zrender/src/core/Eventful';
+import { warn } from '../../util/log';
 
 const BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth'] as const;
 const BAR_BORDER_RADIUS_QUERY = ['itemStyle', 'borderRadius'] as const;
@@ -79,6 +80,13 @@ type BarPossiblePath = Sector | Rect | Sausage;
 type CartesianCoordArea = ReturnType<Cartesian2D['getArea']>;
 type PolarCoordArea = ReturnType<Polar['getArea']>;
 
+type RealtimeSortConfig = {
+    baseAxis: Axis2D;
+    otherAxis: Axis2D;
+};
+// Return a number, based on which the ordinal sorted.
+type OrderMapping = (dataIndex: number) => number;
+
 function getClipArea(coord: CoordSysOfBar, data: List) {
     const coordSysClipArea = coord.getArea && coord.getArea();
     if (isCoordinateSystemType<Cartesian2D>(coord, 'cartesian2d')) {
@@ -127,7 +135,7 @@ class BarView extends ChartView {
     render(seriesModel: BarSeriesModel, ecModel: GlobalModel, api: 
ExtensionAPI, payload: Payload) {
         this._model = seriesModel;
 
-        this.removeOnRenderedListener(api);
+        this._removeOnRenderedListener(api);
 
         this._updateDrawMode(seriesModel);
 
@@ -141,7 +149,7 @@ class BarView extends ChartView {
                 : this._renderNormal(seriesModel, ecModel, api, payload);
         }
         else if (__DEV__) {
-            console.warn('Only cartesian2d and polar supported for bar.');
+            warn('Only cartesian2d and polar supported for bar.');
         }
     }
 
@@ -189,36 +197,13 @@ class BarView extends ChartView {
 
         const animationModel = seriesModel.isAnimationEnabled() ? seriesModel 
: null;
 
-        const axis2DModel = (baseAxis as Axis2D).model;
-        const realtimeSort = seriesModel.get('realtimeSort');
+        const realtimeSortCfg = shouldRealtimeSort(seriesModel, coord);
 
-        // If no data in the first frame, wait for data to initSort
-        if (realtimeSort && data.count()) {
-            if (this._isFirstFrame) {
-                this._initSort(data, isHorizontalOrRadial, baseAxis as Axis2D, 
api);
-                this._isFirstFrame = false;
-                return;
-            }
-            else {
-                this._onRendered = () => {
-                    const orderMap = (idx: number) => {
-                        const el = (data.getItemGraphicEl(idx) as Rect);
-                        if (el) {
-                            const shape = el.shape;
-                            // If data is NaN, shape.xxx may be NaN, so use || 
0 here in case
-                            return (isHorizontalOrRadial ? shape.y + 
shape.height : shape.x + shape.width) || 0;
-                        }
-                        else {
-                            return 0;
-                        }
-                    };
-                    this._updateSort(data, orderMap, baseAxis as Axis2D, api);
-                };
-                api.getZr().on('rendered', this._onRendered as any);
-            }
+        if (realtimeSortCfg) {
+            this._enableRealtimeSort(realtimeSortCfg, data, api);
         }
 
-        const needsClip = seriesModel.get('clip', true) || realtimeSort;
+        const needsClip = seriesModel.get('clip', true) || realtimeSortCfg;
         const coordSysClipArea = getClipArea(coord, data);
         // If there is clipPath created in large mode. Remove it.
         group.removeClipPath();
@@ -288,10 +273,9 @@ class BarView extends ChartView {
                 if (isInitSort) {
                     (el as Rect).attr({ shape: layout });
                 }
-                else if (realtimeSort) {
+                else if (realtimeSortCfg) {
                     updateRealtimeAnimation(
-                        seriesModel,
-                        axis2DModel,
+                        realtimeSortCfg,
                         animationModel,
                         el as Rect,
                         layout as LayoutRect,
@@ -374,10 +358,9 @@ class BarView extends ChartView {
                 if (isInitSort) {
                     (el as Rect).attr({ shape: layout });
                 }
-                else if (realtimeSort) {
+                else if (realtimeSortCfg) {
                     updateRealtimeAnimation(
-                        seriesModel,
-                        axis2DModel,
+                        realtimeSortCfg,
                         animationModel,
                         el as Rect,
                         layout as LayoutRect,
@@ -439,54 +422,94 @@ class BarView extends ChartView {
         }
     }
 
-    _dataSort(
+    private _enableRealtimeSort(
+        realtimeSortCfg: RealtimeSortConfig,
+        data: ReturnType<BarSeriesModel['getData']>,
+        api: ExtensionAPI
+    ): void {
+        // If no data in the first frame, wait for data to initSort
+        if (!data.count()) {
+            return;
+        }
+
+        const baseAxis = realtimeSortCfg.baseAxis;
+
+        if (this._isFirstFrame) {
+            this._dispatchInitSort(data, realtimeSortCfg, api);
+            this._isFirstFrame = false;
+        }
+        else {
+            const orderMapping = (idx: number) => {
+                const el = (data.getItemGraphicEl(idx) as Rect);
+                if (el) {
+                    const shape = el.shape;
+                    // If data is NaN, shape.xxx may be NaN, so use || 0 here 
in case
+                    return (
+                        baseAxis.isHorizontal()
+                            // The result should be consistent with the 
initial sort by data value.
+                            // Do not support the case that both positive and 
negative exist.
+                            ? Math.abs(shape.height)
+                            : Math.abs(shape.width)
+                    ) || 0;
+                }
+                else {
+                    return 0;
+                }
+            };
+            this._onRendered = () => {
+                this._updateSortWithinSameData(data, orderMapping, baseAxis, 
api);
+            };
+            api.getZr().on('rendered', this._onRendered);
+        }
+    }
+
+    private _dataSort(
         data: List<BarSeriesModel, DefaultDataVisual>,
-        idxMap: ((idx: number) => number)
-    ): OrdinalSortInfo[] {
+        baseAxis: Axis2D,
+        orderMapping: OrderMapping
+    ): OrdinalSortInfo {
         type SortValueInfo = {
+            dataIndex: number,
             mappedValue: number,
-            ordinalNumber: OrdinalNumber,
-            beforeSortIndex: number
+            ordinalNumber: OrdinalNumber
         };
         const info: SortValueInfo[] = [];
-        data.each(idx => {
+        data.each(data.mapDimension(baseAxis.dim), (ordinalNumber: 
OrdinalNumber, dataIdx: number) => {
+            let mappedValue = orderMapping(dataIdx);
+            mappedValue = mappedValue == null ? NaN : mappedValue;
             info.push({
-                mappedValue: idxMap(idx),
-                ordinalNumber: idx,
-                beforeSortIndex: null
+                dataIndex: dataIdx,
+                mappedValue: mappedValue,
+                ordinalNumber: ordinalNumber
             });
         });
 
         info.sort((a, b) => {
+            // If NaN, it will be treated as min val.
             return b.mappedValue - a.mappedValue;
         });
 
-        // Update beforeSortIndex
-        for (let i = 0; i < info.length; ++i) {
-            info[info[i].ordinalNumber].beforeSortIndex = i;
-        }
-
-        return map(info, item => {
-            return {
-                ordinalNumber: item.ordinalNumber,
-                beforeSortIndex: item.beforeSortIndex
-            };
-        });
+        return {
+            ordinalNumbers: map(info, item => item.ordinalNumber)
+        };
     }
 
-    _isDataOrderChanged(
+    private _isOrderChangedWithinSameData(
         data: List<BarSeriesModel, DefaultDataVisual>,
-        orderMap: ((idx: number) => number),
-        oldOrder: OrdinalSortInfo[]
+        orderMapping: OrderMapping,
+        baseAxis: Axis2D
     ): boolean {
-        const oldCount = oldOrder ? oldOrder.length : 0;
-        if (oldCount !== data.count()) {
-            return true;
-        }
+        const scale = baseAxis.scale as OrdinalScale;
+        const ordinalDataDim = data.mapDimension(baseAxis.dim);
 
         let lastValue = Number.MAX_VALUE;
-        for (let i = 0; i < oldOrder.length; ++i) {
-            const value = orderMap(oldOrder[i] && oldOrder[i].ordinalNumber);
+        for (let tickNum = 0, len = scale.getOrdinalMeta().categories.length; 
tickNum < len; ++tickNum) {
+            const rawIdx = data.rawIndexOf(ordinalDataDim, 
scale.getRawOrdinalNumber(tickNum));
+            const value = rawIdx < 0
+                // If some tick have no bar, the tick will be treated as min.
+                ? Number.MIN_VALUE
+                // PENDING: if dataZoom on baseAxis exits, is it a performance 
issue?
+                : orderMapping(data.indexOfRawIndex(rawIdx));
             if (value > lastValue) {
                 return true;
             }
@@ -495,68 +518,88 @@ class BarView extends ChartView {
         return false;
     }
 
-    _updateSort(
+    /*
+     * Consider the case when A and B changed order, whose representing
+     * bars are both out of sight, we don't wish to trigger reorder action
+     * as long as the order in the view doesn't change.
+     */
+    private _isOrderDifferentInView(
+        orderInfo: OrdinalSortInfo,
+        baseAxis: Axis2D
+    ): boolean {
+        const scale = baseAxis.scale as OrdinalScale;
+        const extent = scale.getExtent();
+
+        let tickNum = Math.max(0, extent[0]);
+        const tickMax = Math.min(extent[1], 
scale.getOrdinalMeta().categories.length - 1);
+        for (;tickNum <= tickMax; ++tickNum) {
+            if (orderInfo.ordinalNumbers[tickNum] !== 
scale.getRawOrdinalNumber(tickNum)) {
+                return true;
+            }
+        }
+    }
+
+    private _updateSortWithinSameData(
         data: List<BarSeriesModel, DefaultDataVisual>,
-        orderMap: ((idx: number) => number),
+        orderMapping: OrderMapping,
         baseAxis: Axis2D,
         api: ExtensionAPI
     ) {
-        const oldOrder = (baseAxis.scale as 
OrdinalScale).getCategorySortInfo();
-        const isOrderChanged = this._isDataOrderChanged(data, orderMap, 
oldOrder);
-        if (isOrderChanged) {
-            const newOrder = this._dataSort(data, orderMap);
-            const extent = baseAxis.scale.getExtent();
-            for (let i = extent[0]; i < extent[1]; ++i) {
-                /**
-                 * Consider the case when A and B changed order, whose 
representing
-                 * bars are both out of sight, we don't wish to trigger 
reorder action
-                 * as long as the order in the view doesn't change.
-                 */
-                if (!oldOrder || !oldOrder[i] || oldOrder[i].ordinalNumber !== 
newOrder[i].ordinalNumber) {
-                    this.removeOnRenderedListener(api);
-
-                    const action = {
-                        type: 'changeAxisOrder',
-                        componentType: baseAxis.dim + 'Axis',
-                        axisId: baseAxis.index,
-                        sortInfo: newOrder
-                    } as Payload;
-                    api.dispatchAction(action);
-                    break;
-                }
-            }
+        if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) 
{
+            return;
+        }
+
+        const sortInfo = this._dataSort(data, baseAxis, orderMapping);
+
+        if (this._isOrderDifferentInView(sortInfo, baseAxis)) {
+            this._removeOnRenderedListener(api);
+            api.dispatchAction({
+                type: 'changeAxisOrder',
+                componentType: baseAxis.dim + 'Axis',
+                axisId: baseAxis.index,
+                sortInfo: sortInfo
+            });
         }
     }
 
-    _initSort(
+    private _dispatchInitSort(
         data: List<BarSeriesModel, DefaultDataVisual>,
-        isHorizontal: boolean,
-        baseAxis: Axis2D,
+        realtimeSortCfg: RealtimeSortConfig,
         api: ExtensionAPI
     ) {
-        const action = {
+        const baseAxis = realtimeSortCfg.baseAxis;
+        const sortResult = this._dataSort(
+            data,
+            baseAxis,
+            dataIdx => data.get(
+                data.mapDimension(realtimeSortCfg.otherAxis.dim),
+                dataIdx
+            ) as number
+        );
+        api.dispatchAction({
             type: 'changeAxisOrder',
             componentType: baseAxis.dim + 'Axis',
             isInitSort: true,
             axisId: baseAxis.index,
-            sortInfo: this._dataSort(
-                data,
-                idx => parseFloat(data.get(isHorizontal ? 'y' : 'x', idx) as 
string) || 0
-            )
-        } as Payload;
-        api.dispatchAction(action);
+            sortInfo: sortResult,
+            animation: {
+                // Update the axis label from the natural initial layout to
+                // sorted layout should has no animation.
+                duration: 0
+            }
+        });
     }
 
     remove(ecModel: GlobalModel, api: ExtensionAPI) {
         this._clear(this._model);
-        this.removeOnRenderedListener(api);
+        this._removeOnRenderedListener(api);
     }
 
     dispose(ecModel: GlobalModel, api: ExtensionAPI) {
-        this.removeOnRenderedListener(api);
+        this._removeOnRenderedListener(api);
     }
 
-    removeOnRenderedListener(api: ExtensionAPI) {
+    private _removeOnRenderedListener(api: ExtensionAPI) {
         if (this._onRendered) {
             api.getZr().off('rendered', this._onRendered);
             this._onRendered = null;
@@ -737,10 +780,33 @@ const elementCreator: {
     }
 };
 
-function updateRealtimeAnimation(
+function shouldRealtimeSort(
     seriesModel: BarSeriesModel,
-    axisModel: CartesianAxisModel,
-    animationModel: BarSeriesModel,
+    coordSys: Cartesian2D | Polar
+): RealtimeSortConfig {
+    const realtimeSortOption = seriesModel.get('realtimeSort', true);
+    const baseAxis = coordSys.getBaseAxis() as Axis2D;
+    if (__DEV__) {
+        if (realtimeSortOption) {
+            if (baseAxis.type !== 'category') {
+                warn('`realtimeSort` will not work because this bar series is 
not based on a category axis.');
+            }
+            if (coordSys.type !== 'cartesian2d') {
+                warn('`realtimeSort` will not work because this bar series is 
not on cartesian2d.');
+            }
+        }
+    }
+    if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type 
=== 'cartesian2d') {
+        return {
+            baseAxis: baseAxis as Axis2D,
+            otherAxis: coordSys.getOtherAxis(baseAxis)
+        };
+    }
+}
+
+function updateRealtimeAnimation(
+    realtimeSortCfg: RealtimeSortConfig,
+    seriesAnimationModel: BarSeriesModel,
     el: Rect,
     layout: LayoutRect,
     newIndex: number,
@@ -748,43 +814,41 @@ function updateRealtimeAnimation(
     isUpdate: boolean,
     isChangeOrder: boolean
 ) {
-    // Animation
-    if (animationModel || axisModel) {
-        let seriesTarget;
-        let axisTarget;
-        if (isHorizontal) {
-            axisTarget = {
-                x: layout.x,
-                width: layout.width
-            };
-            seriesTarget = {
-                y: layout.y,
-                height: layout.height
-            };
-        }
-        else {
-            axisTarget = {
-                y: layout.y,
-                height: layout.height
-            };
-            seriesTarget = {
-                x: layout.x,
-                width: layout.width
-            };
-        }
-
-        if (!isChangeOrder) {
-            // Keep the original growth animation if only axis order changed.
-            // Not start a new animation.
-            (isUpdate ? updateProps : initProps)(el, {
-                shape: seriesTarget
-            }, seriesModel, newIndex, null);
-        }
+    let seriesTarget;
+    let axisTarget;
+    if (isHorizontal) {
+        axisTarget = {
+            x: layout.x,
+            width: layout.width
+        };
+        seriesTarget = {
+            y: layout.y,
+            height: layout.height
+        };
+    }
+    else {
+        axisTarget = {
+            y: layout.y,
+            height: layout.height
+        };
+        seriesTarget = {
+            x: layout.x,
+            width: layout.width
+        };
+    }
 
+    if (!isChangeOrder) {
+        // Keep the original growth animation if only axis order changed.
+        // Not start a new animation.
         (isUpdate ? updateProps : initProps)(el, {
-            shape: axisTarget
-        }, axisModel, newIndex);
+            shape: seriesTarget
+        }, seriesAnimationModel, newIndex, null);
     }
+
+    const axisAnimationModel = seriesAnimationModel ? 
realtimeSortCfg.baseAxis.model : null;
+    (isUpdate ? updateProps : initProps)(el, {
+        shape: axisTarget
+    }, axisAnimationModel, newIndex);
 }
 
 interface GetLayout {
diff --git a/src/chart/helper/createListFromArray.ts 
b/src/chart/helper/createListFromArray.ts
index 1c3768c..a9adc2f 100644
--- a/src/chart/helper/createListFromArray.ts
+++ b/src/chart/helper/createListFromArray.ts
@@ -35,6 +35,8 @@ import SeriesModel from '../../model/Series';
 function createListFromArray(source: Source | OptionSourceData, seriesModel: 
SeriesModel, opt?: {
     generateCoord?: string
     useEncodeDefaulter?: boolean | EncodeDefaulter
+    // By default: auto. If `true`, create inverted indices for all ordinal 
dimension on coordSys.
+    createInvertedIndices?: boolean
 }): List {
     opt = opt || {};
 
@@ -94,6 +96,9 @@ function createListFromArray(source: Source | 
OptionSourceData, seriesModel: Ser
                 firstCategoryDimIndex = dimIndex;
             }
             dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta();
+            if (opt.createInvertedIndices) {
+                dimInfo.createInvertedIndices = true;
+            }
         }
         if (dimInfo.otherDims.itemName != null) {
             hasNameEncode = true;
diff --git a/src/chart/line/LineView.ts b/src/chart/line/LineView.ts
index 1c20120..b327fc7 100644
--- a/src/chart/line/LineView.ts
+++ b/src/chart/line/LineView.ts
@@ -319,7 +319,9 @@ function getIsIgnoreFunc(
     const labelMap: Dictionary<1> = {};
 
     zrUtil.each(categoryAxis.getViewLabels(), function (labelItem) {
-        labelMap[labelItem.tickValue] = 1;
+        const ordinalNumber = (categoryAxis.scale as OrdinalScale)
+            .getRawOrdinalNumber(labelItem.tickValue);
+        labelMap[ordinalNumber] = 1;
     });
 
     return function (dataIndex: number) {
diff --git a/src/component/axis/AngleAxisView.ts 
b/src/component/axis/AngleAxisView.ts
index 1910def..6ce8da8 100644
--- a/src/component/axis/AngleAxisView.ts
+++ b/src/component/axis/AngleAxisView.ts
@@ -29,6 +29,7 @@ import Polar from '../../coord/polar/Polar';
 import AngleAxis from '../../coord/polar/AngleAxis';
 import { ZRTextAlign, ZRTextVerticalAlign, ColorString } from 
'../../util/types';
 import { getECData } from '../../util/innerStore';
+import OrdinalScale from '../../scale/Ordinal';
 
 const elementList = [
     'axisLine',
@@ -97,7 +98,11 @@ class AngleAxisView extends AxisView {
 
         const labels = zrUtil.map(angleAxis.getViewLabels(), function 
(labelItem: TickLabel) {
             labelItem = zrUtil.clone(labelItem);
-            labelItem.coord = angleAxis.dataToCoord(labelItem.tickValue);
+            const scale = angleAxis.scale;
+            const tickValue = scale.type === 'ordinal'
+                ? (scale as 
OrdinalScale).getRawOrdinalNumber(labelItem.tickValue)
+                : labelItem.tickValue;
+            labelItem.coord = angleAxis.dataToCoord(tickValue);
             return labelItem;
         });
 
diff --git a/src/component/axis/AxisBuilder.ts 
b/src/component/axis/AxisBuilder.ts
index 55fa890..3fd04af 100644
--- a/src/component/axis/AxisBuilder.ts
+++ b/src/component/axis/AxisBuilder.ts
@@ -764,7 +764,7 @@ function buildAxisLabel(
 
     each(labels, function (labelItem, index) {
         const tickValue = axis.scale.type === 'ordinal'
-            ? (axis.scale as OrdinalScale).getRawIndex(labelItem.tickValue)
+            ? (axis.scale as 
OrdinalScale).getRawOrdinalNumber(labelItem.tickValue)
             : labelItem.tickValue;
         const formattedLabel = labelItem.formattedLabel;
         const rawLabel = labelItem.rawLabel;
diff --git a/src/coord/Axis.ts b/src/coord/Axis.ts
index f314526..a2f3e0a 100644
--- a/src/coord/Axis.ts
+++ b/src/coord/Axis.ts
@@ -25,7 +25,7 @@ import {
     calculateCategoryInterval
 } from './axisTickLabelBuilder';
 import Scale from '../scale/Scale';
-import { DimensionName, ScaleDataValue } from '../util/types';
+import { DimensionName, ScaleDataValue, ScaleTick } from '../util/types';
 import OrdinalScale from '../scale/Ordinal';
 import Model from '../model/Model';
 import { AxisBaseOption, OptionAxisType } from './axisCommonTypes';
@@ -35,7 +35,8 @@ const NORMALIZED_EXTENT = [0, 1] as [number, number];
 
 interface TickCoord {
     coord: number;
-    tickValue?: number;
+    // That is `scaleTick.value`.
+    tickValue?: ScaleTick['value'];
 }
 
 /**
@@ -179,7 +180,7 @@ class Axis {
             return {
                 coord: this.dataToCoord(
                     this.scale.type === 'ordinal'
-                        ? (this.scale as OrdinalScale).getRawIndex(tickVal)
+                        ? (this.scale as 
OrdinalScale).getRawOrdinalNumber(tickVal)
                         : tickVal
                 ),
                 tickValue: tickVal
diff --git a/src/coord/cartesian/Axis2D.ts b/src/coord/cartesian/Axis2D.ts
index ca82100..2bc583a 100644
--- a/src/coord/cartesian/Axis2D.ts
+++ b/src/coord/cartesian/Axis2D.ts
@@ -115,13 +115,13 @@ class Axis2D extends Axis {
      * Set ordinalSortInfo
      * @param info new OrdinalSortInfo
      */
-    setCategorySortInfo(info: OrdinalSortInfo[]): boolean {
+    setCategorySortInfo(info: OrdinalSortInfo): boolean {
         if (this.type !== 'category') {
             return false;
         }
 
         this.model.option.categorySortInfo = info;
-        (this.scale as OrdinalScale).setCategorySortInfo(info);
+        (this.scale as OrdinalScale).setSortInfo(info);
     }
 
 }
diff --git a/src/coord/cartesian/AxisModel.ts b/src/coord/cartesian/AxisModel.ts
index 6722660..076b1c1 100644
--- a/src/coord/cartesian/AxisModel.ts
+++ b/src/coord/cartesian/AxisModel.ts
@@ -37,7 +37,7 @@ export interface CartesianAxisOption extends AxisBaseOption {
     position?: CartesianAxisPosition;
     // Offset is for multiple axis on the same position.
     offset?: number;
-    categorySortInfo?: OrdinalSortInfo[];
+    categorySortInfo?: OrdinalSortInfo;
 }
 
 export interface XAXisOption extends CartesianAxisOption {
diff --git a/src/coord/cartesian/Grid.ts b/src/coord/cartesian/Grid.ts
index e13b633..32c616d 100644
--- a/src/coord/cartesian/Grid.ts
+++ b/src/coord/cartesian/Grid.ts
@@ -420,7 +420,7 @@ class Grid implements CoordinateSystemMaster {
             axis.scale.setExtent(Infinity, -Infinity);
             if (axis.type === 'category') {
                 const categorySortInfo = axis.model.get('categorySortInfo');
-                (axis.scale as 
OrdinalScale).setCategorySortInfo(categorySortInfo);
+                (axis.scale as OrdinalScale).setSortInfo(categorySortInfo);
             }
         });
 
diff --git a/src/model/Global.ts b/src/model/Global.ts
index 59dccdb..8e77709 100644
--- a/src/model/Global.ts
+++ b/src/model/Global.ts
@@ -924,7 +924,7 @@ function queryByIdOrName<T extends { id?: string, name?: 
string }>(
     cmpts: T[]
 ): T[] {
     // Here is a break from echarts4: string and number are
-    // traded as equal.
+    // treated as equal.
     if (isArray(idOrName)) {
         const keyMap = createHashMap<boolean>();
         each(idOrName, function (idOrNameItem) {
diff --git a/src/scale/Ordinal.ts b/src/scale/Ordinal.ts
index 248c56d..76f515a 100644
--- a/src/scale/Ordinal.ts
+++ b/src/scale/Ordinal.ts
@@ -50,7 +50,66 @@ class OrdinalScale extends Scale<OrdinalScaleSetting> {
     readonly type = 'ordinal';
 
     private _ordinalMeta: OrdinalMeta;
-    private _categorySortInfo: OrdinalSortInfo[];
+
+    /**
+     * For example:
+     * Given original ordinal data:
+     * ```js
+     * option = {
+     *     xAxis: {
+     *         // Their raw ordinal numbers are:
+     *         //      0    1    2    3    4    5
+     *         data: ['a', 'b', 'c', 'd', 'e', 'f']
+     *     },
+     *     yAxis: {}
+     *     series: {
+     *         type: 'bar',
+     *         data: [
+     *             ['d', 110], // ordinalNumber: 3
+     *             ['c', 660], // ordinalNumber: 2
+     *             ['f', 220], // ordinalNumber: 5
+     *             ['e', 550]  // ordinalNumber: 4
+     *         ],
+     *         realtimeSort: true
+     *     }
+     * };
+     * ```
+     * After realtime sorted (order by yValue desc):
+     * ```js
+     * _ordinalNumbersByTick: [
+     *     2, // tick: 0, yValue: 660
+     *     5, // tick: 1, yValue: 220
+     *     3, // tick: 2, yValue: 110
+     *     4, // tick: 3, yValue: 550
+     *     0, // tick: 4, yValue: -
+     *     1, // tick: 5, yValue: -
+     * ],
+     * _ticksByOrdinalNumber: [
+     *     4, // ordinalNumber: 0, yValue: -
+     *     5, // ordinalNumber: 1, yValue: -
+     *     0, // ordinalNumber: 2, yValue: 660
+     *     2, // ordinalNumber: 3, yValue: 110
+     *     3, // ordinalNumber: 4, yValue: 550
+     *     1, // ordinalNumber: 5, yValue: 220
+     * ]
+     * ```
+     * The index of this array is from `0` to `ordinalMeta.categories.length`.
+     *
+     * @see `Ordinal['getRawOrdinalNumber']`
+     * @see `OrdinalSortInfo`
+     */
+    private _ordinalNumbersByTick: OrdinalNumber[];
+
+    /**
+     * This is the inverted map of `_ordinalNumbersByTick`.
+     * The index of this array is from `0` to `ordinalMeta.categories.length`.
+     *
+     * @see `Ordinal['_ordinalNumbersByTick']`
+     * @see `Ordinal['_getTickNumber']`
+     * @see `OrdinalSortInfo`
+     */
+    private _ticksByOrdinalNumber: number[];
+
 
     constructor(setting?: OrdinalScaleSetting) {
         super(setting);
@@ -85,15 +144,21 @@ class OrdinalScale extends Scale<OrdinalScaleSetting> {
 
     /**
      * Normalize given rank or name to linear [0, 1]
+     * @param val raw ordinal number.
+     * @return normalized value in [0, 1].
      */
     normalize(val: OrdinalRawValue | OrdinalNumber): number {
-        val = this.getCategoryIndex(this.parse(val));
+        val = this._getTickNumber(this.parse(val));
         return scaleHelper.normalize(val, this._extent);
     }
 
+    /**
+     * @param val normalized value in [0, 1].
+     * @return raw ordinal number.
+     */
     scale(val: number): OrdinalNumber {
-        val = this.getCategoryIndex(val);
-        return Math.round(scaleHelper.scale(val, this._extent));
+        val = Math.round(scaleHelper.scale(val, this._extent));
+        return this.getRawOrdinalNumber(val);
     }
 
     getTicks(): OrdinalScaleTick[] {
@@ -103,7 +168,7 @@ class OrdinalScale extends Scale<OrdinalScaleSetting> {
 
         while (rank <= extent[1]) {
             ticks.push({
-                value: this.getCategoryIndex(rank)
+                value: rank
             });
             rank++;
         }
@@ -116,61 +181,78 @@ class OrdinalScale extends Scale<OrdinalScaleSetting> {
         return;
     }
 
-    setCategorySortInfo(info: OrdinalSortInfo[]): void {
-        this._categorySortInfo = info;
-    }
-
-    getCategorySortInfo(): OrdinalSortInfo[] {
-        return this._categorySortInfo;
-    }
-
     /**
-     * Get display order after sort
-     *
-     * @param {OrdinalNumber} n index of raw data
+     * @see `Ordinal['_ordinalNumbersByTick']`
      */
-    getCategoryIndex(n: OrdinalNumber): OrdinalNumber {
-        const categorySortInfo = this._categorySortInfo;
-        if (categorySortInfo) {
-            // Sorted
-            return categorySortInfo[n]
-                ? categorySortInfo[n].beforeSortIndex
-                : -1;
+    setSortInfo(info: OrdinalSortInfo): void {
+        if (info == null) {
+            this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null;
+            return;
+        }
+
+        const infoOrdinalNumbers = info.ordinalNumbers;
+        const ordinalsByTick = this._ordinalNumbersByTick = [] as 
OrdinalNumber[];
+        const ticksByOrdinal = this._ticksByOrdinalNumber = [] as number[];
+
+        // Unnecessary support negative tick in `realtimeSort`.
+        let tickNum = 0;
+        const allCategoryLen = this._ordinalMeta.categories.length;
+        for (const len = Math.min(allCategoryLen, infoOrdinalNumbers.length); 
tickNum < len; ++tickNum) {
+            const ordinalNumber = infoOrdinalNumbers[tickNum];
+            ordinalsByTick[tickNum] = ordinalNumber;
+            ticksByOrdinal[ordinalNumber] = tickNum;
         }
-        else {
-            // Not sorted
-            return n;
+        // Handle that `series.data` only covers part of the 
`axis.category.data`.
+        let unusedOrdinal = 0;
+        for (; tickNum < allCategoryLen; ++tickNum) {
+            while (ticksByOrdinal[unusedOrdinal] != null) {
+                unusedOrdinal++;
+            };
+            ordinalsByTick.push(unusedOrdinal);
+            ticksByOrdinal[unusedOrdinal] = tickNum;
         }
     }
 
+    private _getTickNumber(ordinal: OrdinalNumber): number {
+        const ticksByOrdinalNumber = this._ticksByOrdinalNumber;
+        // also support ordinal out of range of 
`ordinalMeta.categories.length`,
+        // where ordinal numbers are used as tick value directly.
+        return (ticksByOrdinalNumber && ordinal >= 0 && ordinal < 
ticksByOrdinalNumber.length)
+            ? ticksByOrdinalNumber[ordinal]
+            : ordinal;
+    }
+
     /**
-     * Get raw data index
+     * @usage
+     * ```js
+     * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal);
      *
-     * @param {OrdinalNumber} displayIndex index of display
+     * // case0
+     * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber];
+     * // case1
+     * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber];
+     * // case2
+     * const coord = axis.dataToCoord(ordinalNumber);
+     * ```
+     *
+     * @param {OrdinalNumber} tickNumber index of display
      */
-    getRawIndex(displayIndex: OrdinalNumber): OrdinalNumber {
-        const categorySortInfo = this._categorySortInfo;
-        if (categorySortInfo) {
-            // Sorted
-            return categorySortInfo[displayIndex]
-                // In range, return ordinalNumber
-                ? categorySortInfo[displayIndex].ordinalNumber
-                // Out of range, e.g., when axis max is larger than cagetory 
number
-                : -1;
-        }
-        else {
-            // Not sorted
-            return displayIndex;
-        }
+    getRawOrdinalNumber(tickNumber: number): OrdinalNumber {
+        const ordinalNumbersByTick = this._ordinalNumbersByTick;
+        // tickNumber may be out of range, e.g., when axis max is larger than 
`ordinalMeta.categories.length`.,
+        // where ordinal numbers are used as tick value directly.
+        return (ordinalNumbersByTick && tickNumber >= 0 && tickNumber < 
ordinalNumbersByTick.length)
+            ? ordinalNumbersByTick[tickNumber]
+            : tickNumber;
     }
 
     /**
-     * Get item on rank n
+     * Get item on tick
      */
     getLabel(tick: ScaleTick): string {
         if (!this.isBlank()) {
-            const rawIndex = this.getRawIndex(tick.value);
-            const cateogry = this._ordinalMeta.categories[rawIndex];
+            const ordinalNumber = this.getRawOrdinalNumber(tick.value);
+            const cateogry = this._ordinalMeta.categories[ordinalNumber];
             // Note that if no data, ordinalMeta.categories is an empty array.
             // Return empty if it's not exist.
             return cateogry == null ? '' : cateogry + '';
@@ -189,8 +271,8 @@ class OrdinalScale extends Scale<OrdinalScaleSetting> {
      * @override
      * If value is in extent range
      */
-    isInExtentRange(value: number): boolean {
-        value = this.getCategoryIndex(value);
+    isInExtentRange(value: OrdinalNumber): boolean {
+        value = this._getTickNumber(value);
         return this._extent[0] <= value && this._extent[1] >= value;
     }
 
diff --git a/src/util/types.ts b/src/util/types.ts
index de1e432..a68e5c1 100644
--- a/src/util/types.ts
+++ b/src/util/types.ts
@@ -326,9 +326,17 @@ export type TooltipOrderMode = 'valueAsc' | 'valueDesc' | 
'seriesAsc' | 'seriesD
 // Check `convertValue` for more details.
 export type OrdinalRawValue = string | number;
 export type OrdinalNumber = number; // The number mapped from each 
OrdinalRawValue.
+
+/**
+ * @usage For example,
+ * ```js
+ * { ordinalNumbers: [2, 5, 3, 4] }
+ * ```
+ * means that ordinal 2 should be diplayed on tick 0,
+ * ordinal 5 should be displayed on tick 1, ...
+ */
 export type OrdinalSortInfo = {
-    ordinalNumber: OrdinalNumber,
-    beforeSortIndex: number
+    ordinalNumbers: OrdinalNumber[];
 };
 
 /**
@@ -366,7 +374,22 @@ export interface TimeScaleTick extends ScaleTick {
     level?: number
 };
 export interface OrdinalScaleTick extends ScaleTick {
-    value: OrdinalNumber
+    /**
+     * Represents where the tick will be placed visually.
+     * Notice:
+     * The value is not the raw ordinal value. And do not changed
+     * after ordinal scale sorted.
+     * We need to:
+     * ```js
+     * const coord = dataToCoord(ordinalScale.getRawOrdinalNumber(tick.value)).
+     * ```
+     * Why place the tick value here rather than the raw ordinal value (like 
LogScale did)?
+     * Becuase ordinal scale sort is the different case from LogScale, where
+     * axis tick, splitArea should better not to be sorted, especially in
+     * anid(animation id) when `boundaryGap: true`.
+     * Only axis label are sorted.
+     */
+    value: number
 };
 
 // Can only be string or index, because it is used in object key in some code.
diff --git a/test/bar-race2.html b/test/bar-race2.html
new file mode 100644
index 0000000..297cbbf
--- /dev/null
+++ b/test/bar-race2.html
@@ -0,0 +1,575 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+
+<html>
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        <script src="lib/esl.js"></script>
+        <script src="lib/config.js"></script>
+        <script src="lib/jquery.min.js"></script>
+        <script src="lib/facePrint.js"></script>
+        <script src="lib/testHelper.js"></script>
+        <!-- <script src="ut/lib/canteen.js"></script> -->
+        <link rel="stylesheet" href="lib/reset.css" />
+    </head>
+    <body>
+        <style>
+        </style>
+
+
+
+        <div id="main-i0"></div>
+        <div id="main-i1"></div>
+        <div id="main-i2"></div>
+        <div id="main0"></div>
+        <div id="main1"></div>
+
+
+
+        <script>
+
+            function monitorChangeAxisOrderTriggering(chart) {
+                if (chart) {
+                    var changeAxisOrderTriggered;
+                    var renderedTriggered;
+                    chart.on('changeAxisOrder', function () {
+                        changeAxisOrderTriggered = +new Date();
+                        renderInfo();
+                    });
+                    chart.on('rendered', function () {
+                        renderedTriggered = +new Date();
+                        renderInfo();
+                    });
+                    function renderInfo() {
+                        chart.__testHelper.updateInfo([
+                            '"changeAxisOrder" triggered at: ',
+                            changeAxisOrderTriggered,
+                            '"rendered" triggered at: ',
+                            renderedTriggered
+                        ].join('<br>'));
+                    }
+                }
+            }
+
+
+            function makeRawData0() {
+                var days = ['1/22/20', '1/23/20', '1/24/20', '1/25/20', 
'1/26/20', '1/27/20', '1/28/20', '1/29/20', '1/30/20', '1/31/20', '2/1/20', 
'2/2/20', '2/3/20', '2/4/20', '2/5/20', '2/6/20', '2/7/20', '2/8/20', '2/9/20', 
'2/10/20', '2/11/20', '2/12/20', '2/13/20', '2/14/20', '2/15/20', '2/16/20', 
'2/17/20', '2/18/20', '2/19/20', '2/20/20', '2/21/20', '2/22/20', '2/23/20', 
'2/24/20', '2/25/20', '2/26/20', '2/27/20', '2/28/20', '2/29/20', '3/1/20', 
'3/2/20', '3/3/20', '3/4/20', '3/5 [...]
+                var countries = ['Alabama', 'Alaska', 'American Samoa', 
'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 
'Diamond Princess', 'District of Columbia', 'Florida', 'Georgia', 'Grand 
Princess', 'Guam', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 
'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 
'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New 
Hampshire', 'New Jersey', 'New Mexico', [...]
+                var data = [
+                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 11, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 11, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 12, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 12, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 3, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 21, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 0, 4, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3, 0, 
0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 25, 0, 0, 0, 45, 0, 2, 2, 0, 0, 0, 0, 4, 
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 1, 0, 0, 0, 0, 3, 0, 
0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 35, 0, 0, 0, 45, 0, 2, 2, 0, 0, 0, 0, 4, 
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 11, 1, 0, 0, 0, 0, 3, 0, 
0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0],
+                    [0, 0, 0, 1, 0, 51, 0, 0, 0, 45, 0, 3, 2, 0, 0, 0, 0, 5, 
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 23, 1, 0, 0, 0, 0, 3, 0, 
0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 70, 0, 0, 0],
+                    [0, 0, 0, 2, 0, 59, 3, 0, 0, 45, 0, 3, 3, 0, 0, 0, 0, 5, 
1, 0, 0, 1, 0, 0, 3, 6, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 31, 2, 0, 0, 0, 0, 3, 2, 
0, 2, 0, 0, 1, 4, 0, 0, 0, 0, 78, 0, 0, 0],
+                    [0, 0, 0, 4, 0, 81, 7, 0, 0, 45, 0, 7, 5, 21, 0, 1, 0, 6, 
1, 0, 0, 1, 0, 0, 3, 6, 0, 1, 0, 0, 0, 1, 2, 2, 4, 0, 76, 2, 0, 0, 0, 1, 6, 2, 
0, 3, 2, 0, 1, 8, 1, 0, 0, 0, 102, 0, 0, 0],
+                    [0, 0, 0, 4, 0, 95, 7, 0, 0, 45, 2, 10, 5, 21, 0, 1, 0, 7, 
2, 0, 1, 1, 0, 0, 5, 22, 0, 1, 0, 1, 0, 1, 4, 4, 5, 0, 106, 2, 0, 0, 0, 1, 14, 
6, 0, 3, 2, 0, 3, 11, 1, 1, 0, 2, 122, 0, 0, 0],
+                    [0, 0, 0, 4, 0, 101, 7, 0, 0, 45, 2, 13, 10, 21, 0, 1, 0, 
7, 3, 3, 1, 4, 1, 0, 5, 22, 0, 2, 0, 1, 0, 3, 4, 4, 5, 0, 142, 2, 0, 0, 0, 1, 
14, 7, 0, 3, 3, 0, 3, 13, 1, 1, 0, 2, 122, 0, 0, 0],
+                    [0, 0, 0, 6, 0, 144, 15, 2, 0, 46, 5, 15, 17, 21, 0, 2, 0, 
12, 6, 8, 1, 6, 1, 0, 8, 92, 0, 3, 0, 1, 0, 3, 4, 4, 15, 0, 173, 7, 0, 0, 3, 2, 
15, 12, 0, 3, 7, 0, 7, 13, 2, 1, 0, 7, 267, 0, 3, 0],
+                    [0, 0, 0, 9, 1, 177, 34, 3, 1, 46, 10, 28, 23, 21, 0, 2, 
0, 25, 11, 13, 1, 8, 6, 0, 9, 95, 2, 5, 0, 1, 1, 5, 7, 5, 23, 3, 220, 7, 0, 0, 
4, 2, 19, 16, 0, 5, 10, 8, 9, 21, 3, 1, 0, 9, 366, 0, 6, 0],
+                    [0, 0, 0, 9, 6, 221, 45, 5, 1, 46, 10, 35, 31, 21, 0, 2, 
0, 32, 13, 16, 1, 10, 19, 0, 12, 108, 2, 9, 1, 1, 1, 10, 14, 6, 29, 5, 328, 15, 
1, 0, 5, 2, 24, 22, 0, 5, 12, 8, 18, 27, 5, 2, 0, 17, 442, 0, 8, 1],
+                    [5, 1, 0, 9, 6, 282, 49, 11, 4, 46, 10, 50, 42, 21, 0, 2, 
1, 46, 13, 17, 5, 14, 36, 1, 18, 123, 16, 14, 1, 2, 1, 13, 17, 6, 29, 10, 421, 
17, 1, 0, 13, 2, 30, 41, 0, 14, 13, 8, 26, 43, 9, 2, 0, 30, 568, 0, 19, 1],
+                    [6, 1, 0, 12, 12, 340, 101, 22, 6, 46, 10, 76, 66, 21, 0, 
4, 2, 64, 16, 17, 8, 14, 77, 3, 26, 138, 25, 21, 6, 4, 5, 14, 21, 7, 69, 10, 
525, 24, 1, 0, 26, 4, 32, 47, 3, 20, 19, 9, 32, 57, 10, 5, 1, 41, 572, 0, 27, 
2],
+                    [12, 1, 0, 13, 16, 426, 131, 24, 7, 46, 16, 115, 99, 21, 
3, 6, 5, 93, 20, 18, 8, 20, 91, 12, 32, 164, 33, 35, 10, 5, 7, 17, 24, 13, 98, 
13, 732, 33, 1, 0, 37, 7, 36, 66, 5, 20, 28, 9, 39, 72, 28, 8, 1, 45, 643, 0, 
32, 3],
+                    [29, 1, 0, 18, 22, 557, 160, 30, 8, 47, 22, 155, 121, 20, 
3, 7, 5, 105, 25, 23, 11, 21, 136, 17, 41, 197, 53, 54, 13, 6, 7, 18, 45, 17, 
178, 17, 967, 38, 1, 0, 50, 10, 39, 77, 5, 21, 33, 10, 52, 85, 39, 12, 1, 49, 
904, 0, 47, 3],
+                    [39, 3, 0, 20, 22, 698, 160, 68, 16, 47, 22, 216, 146, 21, 
3, 10, 8, 161, 30, 23, 18, 26, 196, 32, 60, 218, 65, 60, 21, 11, 9, 21, 56, 26, 
267, 23, 1706, 64, 3, 0, 67, 19, 66, 112, 5, 23, 47, 11, 74, 110, 51, 12, 2, 
67, 1076, 1, 72, 11],
+                    [46, 6, 0, 27, 33, 751, 184, 68, 19, 47, 31, 314, 199, 21, 
5, 14, 9, 162, 39, 29, 18, 27, 257, 42, 85, 218, 83, 77, 34, 18, 11, 24, 55, 
26, 267, 23, 2495, 70, 6, 0, 86, 19, 68, 152, 5, 33, 47, 11, 79, 173, 51, 18, 
2, 77, 1014, 1, 92, 15],
+                    [78, 9, 0, 45, 62, 952, 277, 159, 30, 47, 40, 417, 287, 
22, 12, 16, 11, 422, 60, 44, 34, 37, 392, 52, 107, 328, 334, 89, 50, 31, 11, 
29, 95, 44, 742, 35, 5365, 123, 18, 0, 119, 44, 88, 206, 5, 44, 81, 11, 154, 
260, 80, 22, 3, 99, 1376, 2, 159, 18],
+                    [83, 12, 0, 78, 96, 1177, 363, 194, 38, 49, 71, 563, 420, 
23, 14, 26, 23, 585, 86, 45, 44, 47, 538, 56, 149, 413, 552, 115, 80, 53, 15, 
37, 114, 44, 890, 43, 8310, 172, 19, 0, 173, 49, 114, 303, 14, 54, 126, 14, 
233, 394, 78, 29, 3, 122, 1524, 7, 207, 19],
+                    [131, 15, 0, 118, 122, 1364, 390, 194, 45, 49, 77, 659, 
507, 23, 15, 37, 36, 753, 128, 68, 57, 87, 585, 70, 193, 525, 788, 138, 140, 
74, 21, 38, 161, 55, 1327, 43, 11710, 253, 28, 0, 248, 53, 114, 396, 21, 66, 
171, 14, 371, 581, 136, 29, 3, 156, 1793, 8, 282, 23],
+                    [157, 20, 0, 152, 165, 1646, 591, 327, 56, 49, 204, 1004, 
621, 30, 27, 53, 42, 1049, 204, 90, 65, 103, 837, 89, 244, 646, 1035, 167, 207, 
87, 34, 51, 190, 74, 1914, 57, 15800, 305, 28, 0, 356, 67, 161, 509, 23, 83, 
196, 21, 505, 643, 162, 52, 6, 220, 1997, 16, 381, 26],
+                    [196, 30, 0, 235, 192, 2108, 704, 415, 68, 49, 120, 1227, 
772, 28, 29, 56, 68, 1285, 270, 105, 84, 123, 1172, 107, 290, 777, 1329, 234, 
249, 187, 34, 51, 245, 101, 2844, 83, 20884, 353, 30, 0, 443, 81, 191, 698, 31, 
106, 298, 28, 614, 758, 257, 75, 7, 254, 2221, 16, 425, 26],
+                    [242, 34, 0, 326, 219, 2538, 723, 618, 104, 49, 141, 1412, 
1026, 28, 32, 90, 81, 1537, 368, 124, 100, 162, 1388, 118, 349, 1159, 1793, 
261, 320, 257, 51, 66, 278, 101, 3675, 100, 25681, 495, 36, 0, 567, 106, 210, 
946, 39, 124, 342, 30, 772, 955, 298, 95, 17, 293, 2328, 22, 481, 29],
+                    [381, 41, 0, 401, 280, 2998, 1021, 875, 119, 49, 187, 
1682, 1247, 28, 37, 91, 91, 1865, 477, 146, 134, 197, 1795, 142, 425, 1838, 
2296, 286, 377, 354, 65, 71, 323, 108, 4402, 113, 30841, 590, 45, 0, 704, 164, 
266, 1260, 51, 132, 424, 41, 916, 1229, 340, 125, 17, 396, 2591, 39, 621, 44],
+                    [517, 56, 0, 508, 335, 3899, 1430, 1012, 130, 49, 231, 
2357, 1525, 28, 45, 95, 146, 2538, 645, 179, 172, 247, 2304, 155, 583, 2417, 
2845, 344, 485, 520, 90, 74, 420, 137, 6876, 113, 37877, 738, 51, 0, 868, 248, 
316, 1795, 64, 165, 424, 46, 1097, 1563, 396, 158, 17, 466, 3207, 52, 728, 53],
+                    [587, 58, 0, 665, 381, 4657, 1433, 1291, 163, 49, 271, 
2900, 2000, 28, 51, 106, 205, 3024, 979, 235, 206, 301, 2744, 168, 775, 3240, 
3634, 396, 579, 666, 109, 82, 536, 158, 8825, 136, 44876, 887, 68, 0, 1137, 
322, 416, 2345, 79, 203, 542, 58, 1318, 1937, 472, 184, 19, 607, 3477, 76, 926, 
70],
+                    [694, 85, 0, 773, 409, 5095, 1740, 1524, 214, 49, 304, 
3763, 2366, 103, 55, 149, 234, 3491, 1233, 298, 266, 380, 3315, 211, 995, 4257, 
4650, 441, 663, 836, 129, 96, 626, 187, 11124, 208, 52410, 1020, 94, 0, 1406, 
377, 479, 2845, 100, 239, 660, 68, 1511, 2455, 602, 211, 22, 740, 4030, 96, 
1055, 82],
+                    [825, 102, 0, 919, 426, 5852, 2307, 1993, 232, 49, 342, 
4246, 2651, 103, 56, 149, 281, 4596, 1513, 336, 330, 438, 3540, 253, 1239, 
4955, 5488, 503, 759, 915, 154, 108, 920, 214, 13386, 237, 59648, 1191, 98, 0, 
1653, 429, 548, 3432, 127, 294, 774, 90, 1720, 2792, 720, 235, 23, 890, 4465, 
113, 1164, 86],
+                    [899, 114, 0, 1157, 473, 7138, 2311, 2571, 264, 49, 401, 
5473, 2808, 103, 58, 175, 340, 5056, 1786, 424, 372, 479, 4025, 275, 1413, 
5752, 6498, 576, 847, 1051, 171, 145, 1012, 314, 16636, 237, 66663, 1313, 109, 
0, 1933, 481, 606, 4155, 174, 408, 925, 101, 1917, 3147, 798, 256, 30, 1020, 
4923, 145, 1230, 94],
+                    [987, 119, 0, 1289, 523, 8210, 2966, 3128, 319, 49, 495, 
6741, 3929, 103, 69, 204, 515, 5994, 2158, 497, 434, 628, 5237, 303, 1660, 
6620, 7615, 629, 937, 1357, 198, 172, 1114, 357, 18696, 315, 75833, 1535, 122, 
2, 2199, 568, 690, 4963, 239, 488, 1083, 108, 2391, 3809, 888, 293, 30, 1249, 
5432, 162, 1412, 109],
+                    [1060, 132, 0, 1530, 584, 9399, 2982, 3557, 368, 49, 586, 
6956, 4638, 103, 77, 224, 566, 6980, 2564, 547, 485, 632, 6424, 303, 1986, 
7738, 9315, 689, 1073, 1613, 208, 210, 1279, 367, 22255, 340, 83948, 1675, 142, 
6, 2547, 721, 736, 6009, 286, 566, 1293, 129, 2933, 4355, 888, 321, 30, 1483, 
5608, 191, 1556, 130],
+                    [1233, 143, 0, 1715, 643, 10773, 3342, 3824, 393, 49, 653, 
9008, 5348, 103, 82, 256, 776, 7695, 3038, 614, 553, 770, 9149, 376, 2331, 
8966, 10791, 742, 1177, 1857, 241, 246, 1463, 316, 25590, 388, 92506, 1977, 
159, 6, 2901, 881, 826, 7268, 316, 645, 1554, 165, 3013, 5069, 1092, 338, 30, 
1706, 6389, 216, 1748, 150],
+                    [1495, 157, 0, 1937, 704, 12004, 3742, 4914, 450, 49, 757, 
10268, 5831, 103, 84, 319, 891, 8904, 3437, 699, 629, 770, 10297, 432, 2758, 
10402, 12744, 788, 1358, 1864, 243, 279, 1514, 479, 29895, 534, 102987, 2251, 
173, 8, 3312, 990, 899, 8570, 316, 711, 1700, 187, 3067, 5734, 1255, 389, 37, 
2012, 6846, 237, 2012, 162],
+                    [1614, 171, 0, 2187, 743, 12837, 4188, 5276, 593, 49, 902, 
11537, 6160, 103, 93, 351, 1022, 10357, 3953, 787, 698, 917, 12496, 456, 3125, 
11736, 14225, 865, 1455, 2310, 265, 321, 1742, 540, 34124, 534, 113833, 2486, 
186, 8, 3739, 1161, 899, 10444, 452, 806, 1917, 212, 3322, 6567, 1435, 461, 40, 
2407, 7247, 282, 2030, 187],
+                    [1765, 185, 0, 2486, 837, 15034, 4950, 5675, 673, 49, 
1002, 12350, 6647, 103, 112, 371, 1078, 11259, 4411, 869, 751, 955, 13010, 470, 
3617, 12500, 15718, 935, 1638, 2347, 286, 364, 1855, 621, 37505, 670, 123160, 
2649, 207, 8, 4043, 1254, 1068, 11589, 475, 922, 2049, 240, 3633, 7209, 1608, 
512, 42, 2640, 7825, 324, 2320, 197],
+                    [1952, 190, 0, 2732, 875, 16019, 5183, 6906, 783, 49, 
1097, 13324, 7314, 103, 113, 387, 1101, 12262, 4956, 946, 849, 955, 14867, 499, 
4045, 13837, 17221, 986, 1738, 2736, 299, 417, 1953, 715, 41090, 757, 131815, 
2962, 225, 8, 4453, 1329, 1068, 13127, 513, 1082, 2232, 288, 3802, 8043, 1685, 
543, 43, 2878, 8311, 345, 2449, 210],
+                    [2169, 213, 0, 2870, 946, 17351, 5429, 7781, 928, 49, 
1211, 14545, 8822, 103, 121, 410, 1170, 12271, 5510, 1046, 912, 1149, 16284, 
519, 4371, 15202, 18970, 1069, 1915, 3130, 319, 447, 2124, 715, 44416, 876, 
139875, 3299, 237, 8, 4782, 1474, 1132, 14853, 573, 1229, 2417, 320, 4139, 
8925, 1746, 575, 43, 3335, 8692, 412, 2578, 216],
+                    [2328, 226, 0, 3036, 1000, 18897, 5655, 7781, 1116, 49, 
1440, 15456, 9901, 103, 121, 410, 1210, 15078, 5943, 1145, 1046, 1149, 17030, 
537, 5529, 16790, 20346, 1154, 2003, 3209, 332, 519, 2259, 747, 47437, 902, 
151061, 3499, 251, 11, 5148, 1526, 1181, 16631, 620, 1450, 2417, 393, 4363, 
9777, 1855, 605, 45, 3645, 9276, 483, 2710, 221],
+                    [2703, 235, 0, 3018, 1119, 19710, 5655, 9784, 1209, 49, 
1523, 16364, 10566, 103, 128, 442, 1232, 15079, 6351, 1270, 1116, 1341, 18283, 
560, 6185, 18941, 21504, 1240, 2260, 3432, 354, 568, 2456, 819, 51027, 865, 
161779, 3736, 269, 11, 5512, 1686, 1321, 18300, 683, 1727, 2793, 447, 4634, 
11208, 1856, 628, 45, 4042, 9639, 514, 2886, 230],
+                    [2947, 246, 0, 3112, 1171, 21081, 6202, 10538, 1326, 49, 
1660, 17531, 11485, 103, 130, 442, 1354, 17887, 6907, 1388, 1117, 1693, 19253, 
586, 6968, 20974, 22434, 1336, 2469, 3897, 365, 635, 2722, 819, 54588, 1081, 
172348, 3965, 278, 11, 5878, 1794, 1322, 20051, 725, 1727, 3067, 536, 4891, 
12105, 2103, 679, 50, 4509, 10119, 574, 3068, 239],
+                    [3217, 257, 0, 3393, 1228, 21706, 6513, 11510, 1479, 49, 
1778, 18494, 12159, 103, 133, 465, 1396, 19180, 7435, 1510, 1275, 1693, 20014, 
616, 7694, 22860, 23605, 1427, 2642, 4108, 377, 699, 2702, 885, 58151, 1091, 
181026, 4354, 293, 11, 6250, 1868, 1371, 21719, 788, 2349, 3211, 626, 5132, 
13023, 2207, 711, 51, 5077, 10434, 577, 3213, 261],
+                    [3563, 272, 0, 3542, 1280, 22795, 7307, 12035, 1625, 49, 
1875, 19895, 12452, 103, 133, 499, 1407, 20852, 7928, 1587, 1344, 1963, 20595, 
633, 8225, 25475, 24244, 1621, 2781, 4269, 387, 791, 2836, 929, 61850, 1245, 
189033, 4570, 308, 11, 6604, 1970, 1527, 22938, 897, 2665, 3320, 730, 5508, 
13677, 2303, 727, 51, 5274, 10609, 593, 3341, 270],
+                    [3734, 277, 0, 3705, 1410, 23931, 7691, 13381, 1758, 49, 
1955, 21019, 13315, 103, 133, 504, 1426, 22025, 8359, 1710, 1390, 2018, 21016, 
698, 8936, 26867, 25635, 1621, 2942, 4515, 394, 814, 2990, 985, 64584, 1262, 
195749, 4886, 331, 11, 6975, 2069, 1584, 24292, 903, 2665, 3391, 868, 5610, 
14275, 2363, 748, 51, 5747, 10635, 611, 3428, 275],
+                    [3953, 285, 0, 3809, 1498, 25356, 7950, 13989, 1926, 49, 
2058, 21628, 14578, 103, 133, 511, 1464, 23248, 8527, 1899, 1441, 2048, 21518, 
735, 9472, 28164, 27001, 1695, 3087, 4746, 399, 897, 3134, 922, 68824, 1345, 
203020, 5113, 341, 11, 7285, 2184, 1633, 25465, 923, 3251, 3553, 988, 5827, 
15006, 2417, 752, 51, 6182, 10799, 640, 3555, 282],
+                    [4075, 293, 0, 3964, 1569, 26686, 7956, 14755, 2014, 49, 
2197, 22511, 14987, 103, 135, 524, 1473, 24593, 8960, 1995, 1504, 2210, 21951, 
770, 10032, 29918, 28059, 1809, 3360, 4791, 404, 901, 3211, 1139, 71030, 1484, 
214454, 5340, 365, 13, 7794, 2263, 1663, 26753, 974, 3251, 3656, 1168, 5827, 
15907, 2548, 759, 51, 6500, 10942, 702, 3721, 287],
+                    [4345, 300, 0, 4237, 1620, 27677, 8286, 15884, 2070, 49, 
2350, 23343, 15669, 103, 135, 530, 1587, 25734, 9542, 2141, 1615, 2435, 22532, 
796, 10784, 32181, 28809, 1809, 3624, 5174, 415, 952, 3214, 1139, 75317, 1484, 
223691, 5639, 393, 13, 8414, 2357, 1736, 28258, 1043, 3529, 3931, 1311, 6375, 
16876, 2683, 774, 51, 6889, 11057, 728, 3875, 296],
+                    [4571, 309, 0, 4511, 1695, 29157, 8691, 16809, 2317, 49, 
2476, 24759, 17194, 103, 136, 541, 1609, 27578, 10154, 2332, 1730, 2522, 23118, 
827, 11572, 34402, 30023, 2070, 3793, 5371, 422, 1066, 3524, 1287, 78467, 1597, 
230597, 6045, 393, 13, 9107, 2465, 1785, 29888, 1068, 4177, 4099, 1411, 6263, 
17849, 2793, 779, 51, 7491, 11517, 775, 4053, 305],
+                    [4712, 314, 0, 4724, 1744, 30491, 9047, 17550, 2538, 49, 
2666, 25492, 17669, 103, 136, 574, 1655, 29160, 10641, 2513, 1821, 2707, 23580, 
847, 12326, 36372, 30791, 2209, 3974, 5579, 426, 1249, 3626, 1342, 81420, 1798, 
241712, 6328, 528, 14, 10222, 2465, 1844, 31652, 1118, 4491, 4248, 1542, 6589, 
18704, 2917, 803, 53, 8053, 11776, 785, 4199, 309],
+                    [4888, 319, 0, 4933, 1781, 31431, 9730, 17962, 2538, 49, 
2793, 26314, 18301, 103, 136, 580, 1668, 30357, 11211, 2902, 1905, 2960, 23928, 
867, 12847, 38077, 31424, 2356, 4274, 5743, 433, 1474, 3728, 1390, 85301, 1845, 
247815, 6601, 585, 14, 11602, 2567, 1910, 32902, 1213, 4706, 4377, 1635, 7070, 
19260, 3069, 813, 53, 8542, 12255, 890, 4346, 313],
+                    [5079, 321, 0, 5068, 1973, 33686, 9730, 19815, 2745, 49, 
2927, 27059, 19407, 103, 136, 584, 1672, 31513, 11688, 3159, 2048, 3050, 24523, 
875, 13684, 38077, 32000, 2470, 4512, 5890, 433, 1648, 3830, 1447, 88722, 1971, 
253060, 6895, 627, 14, 12919, 2680, 1957, 33914, 1252, 5090, 4446, 1685, 7238, 
19751, 3213, 816, 53, 8990, 12114, 902, 4499, 317],
+                    [5317, 329, 0, 5256, 1990, 35465, 10473, 20360, 2931, 49, 
3098, 27869, 19881, 103, 136, 586, 1736, 33059, 12097, 3641, 2164, 3204, 24854, 
888, 14193, 41199, 32667, 2567, 4716, 6066, 437, 1685, 3937, 1490, 92387, 1971, 
258361, 7134, 644, 14, 13725, 2807, 2004, 35249, 1298, 5500, 4439, 1755, 7394, 
20574, 3297, 818, 53, 9630, 12392, 908, 4625, 443],
+                    [5593, 335, 0, 5473, 2276, 37344, 10891, 22469, 3200, 49, 
3206, 28309, 21214, 103, 136, 592, 1766, 35107, 12438, 3748, 2331, 3378, 25258, 
907, 14775, 42944, 33966, 2722, 4894, 6277, 439, 1813, 4081, 1588, 95914, 2210, 
263292, 7495, 679, 14, 14117, 2894, 2059, 36082, 1252, 5841, 4761, 1858, 7394, 
21321, 3445, 823, 54, 10266, 12596, 939, 4845, 447],
+                    [5832, 337, 0, 5772, 2599, 39561, 11278, 23100, 3308, 49, 
3361, 29648, 21883, 103, 139, 596, 1836, 36937, 13039, 3924, 2721, 3479, 25739, 
937, 15737, 46023, 35296, 2942, 5153, 6506, 442, 2202, 4208, 1670, 100025, 
2379, 263460, 7820, 709, 14, 14694, 3017, 2127, 38379, 1416, 6256, 4917, 1956, 
8266, 22650, 3612, 825, 54, 10998, 12753, 981, 5052, 453],
+                    [6026, 339, 0, 6045, 2810, 41355, 12256, 23936, 3442, 49, 
3528, 30533, 22491, 103, 141, 601, 1870, 39658, 13681, 4445, 2959, 3779, 26140, 
965, 16616, 50969, 36641, 3185, 5434, 6788, 444, 2424, 4398, 1720, 102196, 
2521, 271590, 8290, 748, 14, 15169, 3121, 2177, 40208, 1276, 6699, 5070, 2040, 
8728, 23642, 3782, 827, 54, 11594, 12977, 1010, 5356, 473],
+                    [6026, 339, 0, 6286, 2911, 42368, 12968, 24583, 3576, 49, 
3699, 30839, 23222, 103, 141, 605, 1887, 41777, 14399, 5092, 3135, 3915, 26512, 
965, 17766, 53348, 37074, 3446, 5718, 6935, 445, 2719, 4539, 1797, 105498, 
2660, 282143, 8768, 803, 14, 15587, 3194, 2253, 41153, 1307, 7129, 5253, 2147, 
9189, 24153, 3948, 843, 55, 12366, 13319, 1010, 5687, 491],
+                    [6421, 340, 0, 6534, 3001, 43558, 13441, 25269, 4034, 49, 
3841, 31532, 23486, 103, 141, 606, 1897, 43903, 15012, 5476, 3277, 4085, 26773, 
1015, 18581, 54938, 37778, 3602, 5911, 7120, 448, 3028, 4734, 1864, 109038, 
2726, 288045, 8997, 867, 14, 15972, 3254, 2311, 42616, 1371, 7439, 5498, 2212, 
9667, 24967, 4123, 851, 57, 12970, 13521, 1055, 5912, 502],
+                    [6539, 345, 0, 6725, 3069, 44966, 13879, 25997, 4162, 49, 
3892, 32138, 24302, 103, 141, 607, 1897, 45883, 15961, 5868, 3473, 4156, 27068, 
1023, 19487, 56462, 38210, 3811, 6094, 7305, 449, 3358, 4700, 1938, 111188, 
2825, 291996, 9428, 942, 14, 16325, 3281, 2354, 43558, 1389, 7708, 5613, 2244, 
9918, 25321, 4236, 855, 57, 13538, 13686, 1063, 6081, 520],
+                    [6750, 351, 0, 6955, 3127, 46164, 14316, 26312, 4575, 49, 
3994, 32848, 24922, 103, 141, 609, 1952, 48102, 16588, 6376, 3652, 4375, 27286, 
1040, 20113, 58302, 39262, 4181, 6342, 7450, 451, 3517, 4821, 2010, 113856, 
2974, 295106, 9755, 991, 14, 16769, 3410, 2385, 45137, 1400, 7927, 5735, 2313, 
10052, 26357, 4345, 862, 57, 14339, 13842, 1095, 6289, 536],
+                    [6912, 355, 0, 7209, 3193, 48747, 14758, 26767, 4655, 49, 
4106, 33193, 25775, 103, 141, 613, 1952, 50358, 17182, 6843, 3839, 4537, 27660, 
1056, 20849, 60265, 40399, 4644, 6569, 7660, 451, 3851, 4934, 2058, 116365, 
3213, 299691, 10180, 1033, 14, 17303, 3473, 2446, 46327, 1433, 8247, 5882, 
2373, 10366, 27257, 4497, 862, 57, 14962, 14070, 1110, 6520, 545],
+                    [7088, 355, 0, 7655, 3281, 50130, 15284, 27700, 4734, 49, 
4323, 33690, 26264, 103, 145, 618, 1984, 52918, 17835, 7145, 4413, 4708, 28001, 
1095, 21742, 62205, 41379, 5136, 6815, 7818, 453, 4281, 5053, 2146, 118652, 
3411, 304372, 10754, 1067, 14, 18027, 3618, 2510, 47971, 1539, 8621, 6095, 
2449, 10735, 28727, 4672, 866, 66, 15847, 14327, 1125, 6854, 559],
+                    [7294, 364, 0, 7969, 3337, 52026, 15793, 28764, 4918, 49, 
4658, 34728, 27489, 103, 145, 619, 2015, 56055, 18630, 7884, 4634, 4882, 28711, 
1123, 23472, 64311, 42356, 5730, 7212, 8067, 453, 5008, 5248, 2310, 121190, 
3513, 308314, 11070, 1107, 14, 18743, 3748, 2579, 49579, 1575, 8962, 6258, 
2525, 11891, 29692, 4828, 879, 66, 16902, 14637, 1152, 7314, 566],
+                    [7611, 365, 0, 8364, 3372, 53347, 16225, 29287, 5038, 49, 
4797, 35463, 28331, 103, 145, 620, 2061, 58505, 19295, 8643, 4885, 4879, 29140, 
1153, 24473, 66263, 43207, 6232, 7441, 8356, 455, 5317, 5389, 2429, 123717, 
3732, 312977, 11588, 1153, 14, 19335, 3851, 2635, 50494, 1757, 9289, 6489, 
2588, 12661, 30917, 4985, 886, 66, 17738, 15003, 1185, 7660, 579],
+                    [7888, 368, 0, 8640, 3437, 54903, 16635, 29287, 5208, 49, 
5016, 36078, 28665, 103, 145, 620, 2061, 61499, 19933, 9175, 5156, 5130, 29340, 
1185, 25462, 68087, 43801, 6663, 7550, 8618, 455, 5661, 5472, 2518, 126744, 
3850, 316415, 11770, 1191, 14, 19914, 3972, 2680, 51225, 1808, 9477, 6626, 
2631, 13177, 31998, 5175, 897, 66, 18672, 15185, 1195, 7964, 586],
+                    [8112, 370, 0, 8924, 3491, 55884, 16918, 29973, 5288, 49, 
5170, 36897, 29451, 103, 145, 621, 2106, 63777, 20507, 9703, 5383, 5245, 29673, 
1205, 26408, 69087, 43990, 7234, 7877, 8946, 457, 6037, 5630, 2588, 128269, 
4031, 318953, 11971, 1225, 14, 20474, 4044, 2759, 52816, 1843, 9652, 6757, 
2668, 13571, 32783, 5317, 902, 66, 19493, 15462, 1224, 8236, 596],
+                    [8437, 371, 0, 9305, 3525, 58456, 17367, 30621, 5371, 49, 
5322, 37439, 29998, 103, 145, 625, 2127, 65889, 21033, 10111, 5648, 5822, 
29996, 1226, 27117, 70271, 44451, 7851, 8207, 9121, 456, 6373, 5660, 2636, 
130593, 4138, 321192, 12510, 1266, 14, 20969, 4127, 2839, 53864, 1924, 9933, 
6841, 2721, 13690, 33912, 5449, 907, 66, 20257, 15594, 1246, 8566, 604],
+                    [8691, 372, 0, 9707, 3611, 60616, 17832, 30995, 5778, 49, 
5461, 38002, 30743, 103, 149, 626, 2158, 68232, 21870, 10404, 5993, 5934, 
30399, 1254, 28163, 72025, 45179, 8579, 8424, 9323, 456, 6689, 5741, 2741, 
131890, 4291, 323978, 13053, 1323, 15, 21576, 4202, 2916, 54800, 1968, 10205, 
6936, 2780, 13938, 34928, 5595, 908, 66, 20257, 15905, 1242, 8901, 631],
+                    [9046, 374, 0, 9945, 3703, 62148, 18370, 31784, 5939, 49, 
5654, 38828, 31618, 103, 149, 629, 2178, 70871, 22503, 11059, 6332, 6129, 
30652, 1330, 29374, 73721, 45745, 9365, 8686, 9581, 456, 7334, 5855, 2843, 
133991, 4493, 327469, 13540, 1371, 15, 22131, 4330, 2989, 55956, 2031, 10530, 
7142, 2906, 14096, 36036, 5724, 916, 66, 21570, 16231, 1287, 9215, 635],
+                    [9385, 377, 0, 10526, 3747, 63779, 18827, 32411, 6111, 49, 
5899, 39199, 32181, 103, 151, 629, 2178, 73760, 23146, 11457, 6667, 6288, 
30855, 1374, 30485, 75333, 46386, 10088, 9090, 9733, 458, 7818, 5920, 2947, 
135840, 4673, 330407, 14006, 1425, 15, 23016, 4424, 3068, 57371, 2156, 10779, 
7367, 3145, 14441, 37246, 5919, 919, 68, 22342, 16388, 1323, 9590, 644],
+                    [9668, 378, 0, 10960, 3747, 66558, 19375, 32984, 6277, 49, 
6102, 40001, 32588, 103, 151, 631, 2205, 76085, 23732, 11671, 6829, 6440, 
31417, 1408, 31534, 76743, 46815, 10790, 9378, 9911, 458, 8093, 6171, 3011, 
137397, 4778, 333122, 14478, 1464, 16, 23697, 4490, 3160, 58560, 2173, 10989, 
7531, 3393, 14768, 38394, 6103, 921, 68, 23196, 16674, 1323, 9939, 653],
+                    [9889, 379, 0, 11119, 4012, 67600, 19703, 33554, 6277, 49, 
6272, 40596, 33580, 103, 151, 632, 2230, 77741, 24126, 11959, 6951, 6440, 
31600, 1436, 32587, 77793, 47182, 11271, 9501, 10068, 458, 8171, 6120, 3071, 
138754, 4863, 335395, 14938, 1491, 16, 24081, 4589, 3228, 59939, 2198, 11274, 
7653, 3517, 14985, 39258, 6251, 927, 69, 24081, 16891, 1360, 10219, 662],
+                    [10164, 379, 0, 11383, 4043, 69329, 19879, 33765, 6565, 
49, 6389, 40982, 34002, 103, 151, 634, 2260, 79007, 24627, 12373, 7159, 6677, 
31815, 1462, 33373, 78462, 47552, 11799, 9674, 10157, 459, 8407, 6152, 3160, 
140206, 5069, 337055, 15274, 1518, 19, 24777, 4613, 3286, 60459, 2256, 11450, 
7792, 3614, 15544, 40555, 6362, 926, 69, 25070, 17122, 1366, 10418, 669],
+                    [10464, 383, 0, 11736, 4164, 70978, 20157, 34333, 6741, 
49, 6485, 41923, 34924, 103, 152, 635, 2293, 83021, 25127, 12912, 7240, 6853, 
32050, 1477, 34061, 79332, 48021, 12494, 9908, 10269, 461, 8532, 6313, 3239, 
140917, 5212, 338485, 15622, 1571, 19, 25250, 4732, 3358, 61310, 2299, 11614, 
7927, 3663, 16111, 41432, 6432, 927, 69, 25800, 17330, 1378, 10611, 675],
+                    [10700, 383, 0, 12216, 4236, 72798, 20475, 34855, 6952, 
49, 6584, 42402, 35427, 103, 152, 638, 2293, 84694, 25473, 13289, 7518, 6853, 
32662, 1515, 34812, 80497, 48391, 12917, 10090, 10404, 462, 8912, 6476, 3299, 
141560, 5364, 340661, 16352, 1647, 19, 25721, 4858, 3416, 62101, 2329, 11835, 
8030, 3732, 16370, 43020, 6620, 929, 69, 26746, 17512, 1398, 10902, 688],
+                    [11101, 383, 0, 12674, 4366, 74871, 20838, 35464, 7223, 
49, 6736, 43210, 35977, 103, 152, 637, 2351, 87937, 26053, 13675, 7705, 7225, 
33489, 1565, 35903, 82182, 49582, 13435, 10483, 10594, 462, 9260, 6504, 3382, 
142704, 5503, 343051, 16968, 1712, 19, 26357, 4963, 3479, 63105, 2427, 12016, 
8189, 3792, 16699, 44480, 6749, 932, 69, 27813, 17773, 1427, 11275, 701],
+                    [11373, 388, 0, 13169, 4463, 76693, 21232, 36085, 7373, 
49, 6871, 44138, 36772, 103, 154, 638, 2351, 90369, 26656, 14049, 7886, 7444, 
33837, 1603, 36986, 83421, 50079, 14240, 10801, 10766, 466, 9610, 6733, 3453, 
143984, 5662, 345813, 17494, 1761, 19, 26954, 5087, 3541, 64136, 2542, 12219, 
8407, 3887, 16960, 45721, 6913, 933, 69, 28672, 17951, 1447, 11685, 716],
+                    [11674, 388, 0, 13666, 4578, 78725, 21633, 36703, 7547, 
49, 7042, 44811, 37212, 103, 154, 639, 2419, 92457, 27280, 14328, 7939, 7688, 
34117, 1648, 37968, 84933, 50538, 14969, 11123, 10959, 468, 10220, 6813, 3556, 
145089, 5847, 348232, 18130, 1848, 21, 27474, 5237, 3612, 65185, 2589, 12434, 
8661, 3959, 17263, 47452, 7068, 934, 69, 29683, 18288, 1470, 12187, 741],
+                    [11771, 388, 0, 13945, 4759, 80166, 21938, 37419, 7670, 
49, 7123, 45588, 37579, 103, 154, 640, 2419, 94191, 27778, 14651, 7953, 7688, 
34432, 1687, 38804, 86010, 51142, 15668, 11296, 11108, 468, 10177, 6949, 3596, 
146504, 5938, 350121, 18673, 1900, 21, 27923, 5310, 3623, 65700, 2646, 12674, 
8816, 3987, 17359, 48396, 7238, 940, 69, 30388, 18433, 1492, 12543, 754],
+                    [12086, 388, 0, 14208, 4813, 81457, 22202, 38116, 7869, 
49, 7270, 46442, 38283, 103, 154, 640, 2455, 96485, 28255, 14955, 8303, 7935, 
34709, 1713, 39762, 87052, 51915, 16372, 11432, 11242, 470, 10625, 7061, 3652, 
148240, 6096, 351371, 19207, 1931, 21, 28454, 5398, 3687, 66669, 2710, 12795, 
8942, 4027, 18011, 49177, 7384, 940, 69, 31140, 18611, 1502, 12687, 766],
+                    [12376, 400, 0, 14576, 4923, 83752, 22482, 38430, 8037, 
49, 7434, 46944, 38855, 103, 154, 641, 2455, 98030, 28705, 15296, 8353, 8069, 
35038, 1741, 41546, 87925, 52350, 17029, 11704, 11393, 471, 10854, 7096, 3721, 
149356, 6192, 352845, 19239, 1994, 21, 28952, 5489, 3726, 67311, 2805, 12951, 
9056, 4085, 18412, 50552, 7518, 944, 69, 32145, 18811, 1502, 12885, 776],
+                    [13052, 401, 0, 14906, 5003, 85997, 22797, 39017, 8194, 
49, 7551, 47471, 39801, 103, 154, 643, 2506, 100418, 29274, 15620, 8507, 8167, 
35316, 1819, 42323, 88970, 53009, 17670, 11967, 11528, 478, 11122, 7388, 3868, 
150776, 6317, 354370, 20262, 2095, 21, 29436, 5532, 3801, 68126, 2866, 13356, 
9175, 4177, 18412, 51673, 7710, 944, 69, 32908, 18971, 1567, 13413, 787],
+                    [13288, 401, 0, 15348, 5458, 88031, 23191, 39208, 8386, 
49, 7788, 48675, 40663, 103, 165, 647, 2506, 102688, 29936, 16170, 8625, 8286, 
36504, 1877, 43531, 90084, 53510, 18200, 12222, 11689, 479, 11427, 7400, 3935, 
151586, 6472, 356458, 20512, 2229, 22, 30167, 5680, 3817, 69252, 2913, 13571, 
9381, 4177, 18961, 53053, 7874, 950, 69, 34137, 19117, 1593, 13885, 801],
+                    [13670, 403, 0, 15624, 5612, 90252, 23487, 39640, 8529, 
49, 7893, 49451, 41482, 103, 165, 642, 2595, 105444, 30409, 16492, 8909, 8426, 
36925, 1948, 44424, 90889, 53913, 19005, 12625, 11836, 479, 11662, 7525, 4014, 
152579, 6625, 358154, 22110, 2317, 22, 30794, 5849, 3864, 70211, 3030, 13736, 
9638, 4356, 19394, 53539, 8057, 952, 69, 34950, 19265, 1705, 14396, 803],
+                    [14117, 407, 0, 16053, 5775, 92539, 23964, 40022, 8529, 
49, 7966, 50127, 42242, 103, 165, 643, 2595, 107796, 30901, 16898, 8946, 8571, 
36925, 2013, 45495, 91662, 54365, 19845, 13005, 11966, 479, 11963, 7526, 4089, 
153140, 6625, 359926, 22864, 2365, 22, 31408, 5960, 3888, 71009, 3100, 13952, 
9895, 4464, 19785, 54776, 8260, 954, 69, 35749, 19265, 1705, 14877, 813],
+                    [14478, 407, 0, 16377, 5922, 94020, 24174, 40468, 8809, 
49, 8110, 50867, 42902, 103, 166, 643, 2626, 110304, 31376, 17251, 9004, 8571, 
37169, 2055, 46313, 92675, 54679, 20573, 13260, 12149, 479, 12134, 7881, 4149, 
154154, 6943, 361515, 23365, 2418, 22, 31911, 6037, 3927, 71563, 3189, 14065, 
10096, 4563, 20111, 55861, 8392, 956, 69, 36244, 19828, 1759, 15277, 838],
+                    [14986, 408, 0, 16575, 6029, 96400, 24256, 40873, 8965, 
49, 8225, 51746, 43400, 103, 166, 643, 2626, 112017, 31715, 17557, 9125, 8571, 
37809, 2074, 47152, 93271, 54881, 21315, 13458, 12476, 479, 12362, 7956, 4197, 
155092, 7026, 362764, 24057, 2457, 22, 32477, 6090, 3949, 71925, 3260, 14065, 
10178, 4586, 20535, 56409, 8521, 962, 69, 37727, 20065, 1774, 15584, 843],
+                    [15650, 410, 0, 16864, 6180, 99387, 24552, 41303, 9066, 
49, 8334, 52255, 43983, 103, 167, 643, 2626, 113195, 32078, 17703, 9199, 8951, 
38054, 2109, 47687, 93693, 55104, 21960, 13731, 12579, 479, 12619, 8057, 4231, 
155764, 7130, 363836, 24455, 2422, 22, 33006, 6138, 3967, 72778, 3324, 14210, 
10416, 4653, 20895, 57230, 8620, 967, 69, 39342, 20181, 1774, 15863, 850],
+                    [16032, 411, 0, 17318, 6277, 101050, 24754, 41288, 9096, 
49, 8406, 52634, 44638, 103, 170, 644, 2699, 114306, 32437, 18369, 9291, 9077, 
38497, 2137, 48423, 94220, 55608, 22464, 14044, 12816, 481, 12984, 8150, 4286, 
156628, 7252, 364965, 24916, 2439, 22, 33439, 6229, 4038, 73557, 3397, 14353, 
10623, 4710, 21285, 58542, 8706, 971, 69, 40249, 20406, 1899, 16462, 860],
+                    [16530, 424, 0, 17877, 6538, 103813, 25107, 41559, 9171, 
49, 8492, 53285, 45266, 103, 171, 647, 2770, 115833, 33068, 18586, 9371, 9185, 
38802, 2189, 49709, 94895, 56014, 22947, 14372, 12981, 485, 13249, 8248, 4389, 
157185, 7364, 366733, 25800, 2481, 22, 33915, 6273, 4086, 74220, 3486, 14494, 
10788, 4793, 21679, 60395, 8921, 974, 69, 41401, 20764, 1935, 16974, 876],
+                    [17031, 429, 0, 18472, 6777, 106622, 25598, 41762, 9236, 
49, 8538, 54497, 45881, 103, 172, 649, 2770, 117455, 33558, 18957, 9662, 9464, 
38802, 2226, 50988, 95512, 56621, 23531, 14793, 13084, 493, 13648, 8376, 4492, 
158844, 7493, 368284, 26885, 2520, 22, 34566, 6338, 4131, 74984, 3647, 14635, 
11131, 4866, 22063, 60901, 9264, 975, 69, 42533, 21071, 1951, 17707, 891],
+                    [17359, 433, 0, 19258, 7013, 109895, 26084, 42022, 9422, 
49, 8717, 55424, 46331, 103, 172, 651, 2803, 118917, 34211, 19244, 9690, 9704, 
39577, 2282, 52015, 96301, 56969, 24190, 15229, 13298, 505, 13905, 8517, 4492, 
159608, 7624, 369660, 27794, 2554, 22, 35033, 6418, 4185, 75697, 3718, 14819, 
11394, 4960, 22566, 62675, 9533, 977, 69, 43611, 21349, 1989, 18230, 898],
+                    [17952, 459, 0, 19936, 7253, 111951, 26364, 42201, 9498, 
49, 8801, 56163, 47063, 103, 172, 652, 2839, 120260, 34574, 19552, 9700, 9704, 
39916, 2325, 52778, 96965, 57397, 24850, 15523, 13438, 515, 14101, 8628, 4651, 
160445, 7689, 370770, 28785, 2577, 22, 35513, 6418, 4243, 76129, 3776, 14928, 
11861, 4993, 22566, 64652, 9797, 981, 69, 44607, 21702, 2010, 18403, 903],
+                    [18630, 466, 0, 20129, 7443, 114733, 26563, 42740, 9605, 
49, 8857, 56830, 47902, 103, 175, 652, 2839, 121234, 34830, 19699, 9920, 10046, 
40341, 2349, 53327, 100805, 57532, 25208, 15752, 13724, 519, 14345, 8702, 4685, 
160918, 7800, 371711, 29592, 2625, 22, 35984, 6573, 4302, 76646, 3873, 14991, 
12148, 5034, 22566, 65593, 9999, 983, 70, 45398, 21977, 2028, 18543, 910],
+                    [18766, 486, 0, 21264, 7818, 117215, 26774, 42979, 9685, 
49, 8886, 57447, 48207, 103, 175, 653, 2933, 122848, 35237, 20019, 9965, 10185, 
40746, 2377, 54175, 101163, 57731, 25508, 16041, 14015, 523, 14616, 8858, 4749, 
161545, 8024, 373040, 30023, 2646, 23, 36350, 6692, 4335, 77225, 3935, 15112, 
12415, 5067, 24342, 67310, 10202, 988, 70, 46239, 22157, 2056, 18917, 912],
+                    [18851, 504, 0, 22356, 8067, 119348, 27046, 43091, 9712, 
49, 9016, 58764, 48894, 103, 177, 653, 2933, 123830, 35712, 20300, 10092, 
10410, 41133, 2418, 54982, 101592, 58035, 25870, 16322, 14189, 525, 14885, 
8951, 4795, 162068, 8140, 374085, 31276, 2679, 24, 36792, 6805, 4399, 77780, 
4023, 15219, 12415, 5162, 24833, 68877, 10497, 990, 70, 46905, 22484, 2077, 
19400, 915],
+                    [19072, 512, 0, 22886, 8425, 122168, 27346, 43239, 9746, 
49, 9120, 60183, 49859, 103, 179, 655, 2990, 124759, 36096, 20806, 10167, 
10705, 41562, 2446, 55858, 102063, 58241, 26273, 16560, 14438, 539, 15139, 
9129, 4876, 162530, 8353, 375133, 32075, 2706, 26, 37282, 6907, 4474, 78335, 
4508, 15325, 12415, 5247, 25190, 70555, 10813, 1026, 71, 47856, 22729, 2102, 
19892, 921],
+                    [19387, 523, 0, 24439, 8651, 125738, 27601, 43460, 9773, 
49, 9199, 61488, 50621, 103, 179, 664, 3111, 125915, 36578, 21154, 10306, 
10977, 41989, 2482, 56770, 102557, 63777, 26980, 16769, 14572, 541, 15406, 
9309, 4953, 163336, 8672, 376208, 33295, 2745, 26, 37758, 7007, 4570, 78815, 
4620, 15441, 13453, 5277, 25664, 72548, 11252, 1027, 71, 48532, 22993, 2119, 
20249, 933],
+                    [20043, 535, 0, 25451, 9101, 128593, 27834, 43818, 9845, 
49, 9269, 62758, 51359, 103, 179, 673, 3139, 126890, 36997, 21478, 10361, 
11287, 42486, 2524, 57482, 103132, 64229, 27501, 17039, 14951, 540, 15572, 
9491, 5019, 163893, 8800, 377316, 34718, 2816, 26, 38111, 7059, 4570, 79505, 
4915, 15441, 13453, 5367, 26177, 74470, 11798, 1046, 71, 49397, 23442, 2136, 
20571, 939],
+                    [20500, 543, 0, 26989, 9426, 130615, 27987, 43968, 9942, 
49, 9332, 63938, 51898, 103, 179, 675, 3139, 127757, 37397, 21712, 10406, 
11287, 42816, 2570, 57973, 103436, 64648, 27886, 17270, 15023, 545, 15664, 
9669, 5043, 164164, 8940, 378097, 35625, 2861, 27, 38476, 7150, 4662, 79908, 
4985, 15441, 14286, 5438, 26493, 75408, 12066, 1063, 71, 50679, 23729, 2144, 
20835, 947],
+                    [20925, 562, 0, 27678, 9740, 133816, 28169, 44092, 9972, 
49, 9389, 64904, 52497, 103, 179, 676, 3189, 128415, 37623, 22007, 10544, 
11476, 43050, 2588, 58404, 103626, 64944, 28224, 17768, 15158, 548, 15786, 
9816, 5079, 164497, 9062, 378799, 36517, 2880, 28, 38837, 7205, 4922, 80339, 
5046, 15642, 14800, 5471, 27005, 76463, 12322, 1075, 71, 51251, 24041, 2161, 
21038, 960],
+                    [21422, 572, 0, 28296, 10080, 136641, 28333, 44179, 10020, 
49, 9474, 66000, 53249, 103, 180, 682, 3221, 129212, 38033, 22237, 10609, 
11707, 43612, 2606, 58904, 103889, 64998, 28523, 18123, 15352, 554, 15918, 
10045, 5079, 164796, 9105, 379482, 37227, 2901, 30, 39162, 7363, 4988, 80870, 
5185, 15691, 15228, 5523, 27575, 78208, 12559, 1084, 71, 51738, 24354, 2169, 
21308, 970],
+                    [21989, 592, 0, 29852, 10368, 139715, 28484, 44347, 10056, 
49, 9537, 67371, 53980, 103, 180, 685, 3260, 129837, 38337, 22626, 10750, 
11883, 44030, 2637, 59465, 104156, 65182, 28869, 18483, 15512, 561, 16058, 
10218, 5178, 165346, 9250, 380156, 38473, 2941, 30, 39575, 7483, 5060, 81316, 
5329, 15756, 15759, 5604, 27930, 80777, 12864, 1095, 72, 52177, 24354, 2194, 
21593, 980],
+                    [22845, 609, 0, 31267, 10816, 143377, 28632, 44461, 10106, 
49, 9589, 69069, 54973, 103, 183, 692, 3260, 130603, 38748, 22973, 10823, 
11945, 44472, 2667, 60197, 104667, 65449, 29316, 18483, 15699, 563, 16315, 
10473, 5209, 165816, 9367, 380892, 39584, 2980, 30, 40004, 7626, 5237, 81848, 
5352, 15862, 16441, 5665, 28340, 82658, 13252, 1110, 72, 52647, 24779, 2217, 
21926, 1009],
+                    [23710, 624, 0, 33039, 11547, 146659, 28807, 44689, 10173, 
49, 9654, 70971, 55783, 103, 183, 706, 3353, 131198, 39146, 23350, 10973, 
12166, 44995, 2721, 60613, 105059, 65672, 29795, 19091, 15997, 573, 16522, 
10704, 5251, 166164, 9526, 381714, 41417, 3016, 30, 40424, 7849, 5377, 82481, 
5536, 15947, 17170, 5742, 29118, 84927, 13577, 1119, 72, 53211, 25171, 2249, 
22246, 1027],
+                    [24601, 653, 0, 34660, 12095, 150018, 29002, 44994, 10229, 
49, 9709, 73552, 56804, 103, 183, 723, 3353, 131871, 39543, 23717, 11020, 
12445, 46283, 2757, 61305, 105395, 65836, 30172, 19348, 16232, 588, 16640, 
10997, 5299, 166605, 9621, 382630, 42845, 3058, 30, 40851, 8073, 5377, 82944, 
5690, 15947, 17955, 5833, 29549, 86915, 13981, 1125, 72, 53869, 25538, 2274, 
22518, 1050],
+                    [25615, 660, 0, 35706, 12501, 152300, 29115, 45088, 10264, 
49, 9767, 75568, 57681, 103, 183, 728, 3399, 132543, 39909, 23926, 11101, 
12445, 46619, 2793, 61701, 105603, 66054, 30471, 19516, 16262, 601, 16730, 
11201, 5318, 166881, 9723, 383324, 44264, 3080, 30, 41148, 8231, 5377, 83203, 
5811, 15947, 18795, 5898, 30343, 88523, 14313, 1127, 72, 54506, 25834, 2290, 
22758, 1060],
+                    [26272, 663, 0, 36844, 12917, 155726, 29284, 45235, 10340, 
49, 9799, 77326, 58414, 103, 185, 736, 3399, 133016, 40430, 24082, 11319, 
12647, 47172, 2810, 62032, 105690, 66085, 30693, 19799, 16611, 609, 16851, 
11315, 5345, 167103, 9845, 383944, 45114, 3101, 30, 41576, 8417, 5820, 83589, 
5890, 16093, 19378, 5928, 31004, 90211, 14608, 1128, 72, 54886, 26158, 2322, 
22932, 1079],
+                    [26912, 675, 0, 39185, 13191, 158961, 29427, 45349, 10403, 
49, 9818, 80109, 59078, 103, 186, 736, 3462, 133639, 40786, 24179, 11411, 
12647, 47706, 2819, 62409, 105885, 66269, 30882, 20152, 16857, 614, 17038, 
11683, 5364, 167426, 9933, 384575, 45907, 3124, 30, 42010, 8645, 6098, 83978, 
5951, 16164, 19990, 5966, 31751, 93569, 14937, 1131, 72, 55331, 26531, 2341, 
23198, 1089],
+                    [27312, 695, 0, 40937, 13606, 162798, 29656, 45429, 10444, 
49, 9847, 82719, 60030, 103, 188, 744, 3632, 134185, 41013, 24460, 11644, 
12995, 48634, 2836, 62969, 106151, 66497, 31296, 20641, 17069, 630, 17231, 
11854, 5436, 167703, 10065, 385142, 46934, 3166, 30, 42422, 8904, 6218, 84289, 
6003, 16213, 20556, 6050, 32114, 97699, 15344, 1130, 73, 55775, 26784, 2376, 
23456, 1114]
+                ];
+
+                return {
+                    days: days,
+                    countries: countries,
+                    data: data
+                };
+            }
+
+            function makeAllOption0({
+                timelineDuration,
+                barDurationUpdate,
+                axisDurationUpdate,
+                currentIndex
+            }) {
+                var rawData = makeRawData0();
+
+                var option = {
+                    timeline: {
+                        axisType: 'category',
+                        autoPlay: false,
+                        playInterval: timelineDuration,
+                        data: rawData.days,
+                        currentIndex: currentIndex || 0
+                    },
+
+                    tooltip: {
+                    },
+                    grid: {
+                        left: 150,
+                        bottom: 100
+                    },
+                    xAxis: {
+                    },
+                    yAxis: [{
+                        inverse: true,
+                        type: 'category',
+                        max: 9,
+                        animationDurationUpdate: axisDurationUpdate,
+                        animationEasingUpdate: 'linear'
+                    }],
+                    series: [{
+                        type: 'bar',
+                        realtimeSort: true,
+                        barWidth: '40%',
+                        datasetIndex: 0,
+                        animationDurationUpdate: barDurationUpdate,
+                        animationEasingUpdate: 'linear',
+                        label: {
+                            valueAnimation: true,
+                            show: true,
+                            fontSize: 14,
+                            position: 'right',
+                            formatter: '{@[1]} cases'
+                        },
+                        datasetIndex: 0,
+                        encode: {
+                            x: 1,
+                            y: 0
+                        }
+                    }],
+                    options: []
+                };
+
+                for (var n = 0; n < rawData.days.length; n++) {
+                    var datasetSource = [];
+                    for (var j = 0; j < rawData.data[n].length; j++) {
+                        datasetSource.push([
+                            rawData.countries[j],
+                            rawData.data[n][j]
+                        ]);
+                    }
+
+                    option.options.push({
+                        dataset: {
+                            source: datasetSource
+                        }
+                    });
+                }
+
+                return option;
+            }
+
+        </script>
+
+
+
+
+
+
+
+        <script>
+        require(['echarts'], function (echarts) {
+            var option = {
+                animationDurationUpdate: 2000,
+                animationEasing: 'linear',
+                xAxis: {
+                    type: 'category',
+                    animationDurationUpdate: 500
+                },
+                yAxis: {},
+                tooltip: {},
+                series: {
+                    type: 'bar',
+                    realtimeSort: true,
+                    label: {
+                        show: true,
+                        position: 'top'
+                    },
+                    data: [
+                        ['a-init-15', 15],
+                        ['b-init-30', 30],
+                        ['c-init-20', 20],
+                        ['d-init-10', 10]
+                    ]
+                }
+            };
+
+            var chart = testHelper.create(echarts, 'main-i0', {
+                title: [
+                    'bars should be ordered **asc**.',
+                    'xAxis label value should be the same as bar label value.',
+                    '"rendered" should be **stopped** finally'
+                ],
+                height: 300,
+                option: option,
+                info: ' '
+            });
+
+            monitorChangeAxisOrderTriggering(chart);
+        });
+        </script>
+
+
+
+
+        <script>
+        require(['echarts'], function (echarts) {
+            var data = [
+                // referece to xAxis data.
+                [1, 30],
+                [3, 10],
+                [2, 20],
+                [0, 15]
+            ];
+            var option = {
+                animationDurationUpdate: 2000,
+                animationEasing: 'linear',
+                xAxis: {
+                    type: 'category',
+                    min: -2,
+                    max: 5,
+                    inverse: true,
+                    boundaryGap: false,
+                    data: [
+                        'a-init-15', // 0
+                        'b-init-30', // 1
+                        'c-init-20', // 2
+                        'd-init-10'  // 3
+                    ],
+                    animationDurationUpdate: 500
+                },
+                yAxis: {},
+                tooltip: {},
+                series: {
+                    type: 'bar',
+                    realtimeSort: true,
+                    label: {
+                        show: true,
+                        position: 'top'
+                    },
+                    data: data
+                }
+            };
+
+            var chart = testHelper.create(echarts, 'main-i1', {
+                title: [
+                    'bars should be ordered **desc**.',
+                    'both left and right should always have 2 empty ticks',
+                    'xAxis label value should be the same as bar label value.',
+                    'click "a + 10", should realtime sort.',
+                    '"rendered" should be **stopped** finally'
+                ],
+                height: 300,
+                option: option,
+                info: ' ',
+                buttons: [{
+                    text: 'a + 10',
+                    onclick: function () {
+                        // find a
+                        for (var i = 0; i < data.length; i++) {
+                            if (option.xAxis.data[data[i][0]].indexOf('a') === 
0) {
+                                data[i][1] += 10;
+                            }
+                        }
+                        chart.setOption({
+                            series: {
+                                data: data
+                            }
+                        });
+                    }
+                }]
+            });
+
+            monitorChangeAxisOrderTriggering(chart);
+        });
+        </script>
+
+
+
+
+        <script>
+        require(['echarts'], function (echarts) {
+            var data = [
+                // referece to xAxis data.
+                [6, 30],
+                [8, 10],
+                [7, 20],
+                [5, 15]
+            ];
+            var option = {
+                animationDurationUpdate: 3000,
+                animationEasing: 'linear',
+                // animationEasing: 'elasticOut',
+                xAxis: {
+                    type: 'category',
+                    data: [
+                        'empty-I', // 0
+                        'empty-II', // 1
+                        'empty-III', // 2
+                        'empty-IV', // 3
+                        'empty-V', // 4
+                        'a-init-15', // 5
+                        'b-init-30', // 6
+                        'c-init-20', // 7
+                        'd-init-10'  // 8
+                    ],
+                    animationDurationUpdate: 500
+                },
+                yAxis: {},
+                tooltip: {},
+                series: {
+                    type: 'bar',
+                    animationDuration: 0,
+                    realtimeSort: true,
+                    label: {
+                        show: true,
+                        position: 'top'
+                    },
+                    data: data
+                }
+            };
+
+            var chart = testHelper.create(echarts, 'main-i2', {
+                title: [
+                    'bars should be ordered **desc** at the **most left**.',
+                    'xAxis label value should be the same as bar label value.',
+                    'bar should **not** on tick "before-X"',
+                    'click "a + 10", should realtime sort.',
+                    '"rendered" should be **stopped** finally'
+                ],
+                height: 300,
+                option: option,
+                info: ' ',
+                buttons: [{
+                    text: 'a + 10',
+                    onclick: function () {
+                        // find a
+                        for (var i = 0; i < data.length; i++) {
+                            if (option.xAxis.data[data[i][0]].indexOf('a') === 
0) {
+                                data[i][1] += 10;
+                            }
+                        }
+                        chart.setOption({
+                            series: {
+                                data: data
+                            }
+                        });
+                    }
+                }]
+            });
+
+            monitorChangeAxisOrderTriggering(chart);
+
+        });
+        </script>
+
+
+
+
+
+        <script>
+        require(['echarts'/*, 'map/js/china' */], function (echarts) {
+            var option = makeAllOption0({
+                currentIndex: 1,
+                timelineDuration: 600,
+                barDurationUpdate: 590,
+                axisDurationUpdate: 200
+            });
+
+            var chart = testHelper.create(echarts, 'main0', {
+                title: [
+                    'Check: the **swith**, **bar clip**, **label animation**.',
+                    '(1) Click to change the time tick.',
+                    '(2) Play the timeline.'
+                ],
+                option: option
+                // height: 300,
+                // buttons: [{text: 'btn-txt', onclick: function () {}}],
+                // recordCanvas: true,
+            });
+        });
+        </script>
+
+
+
+
+
+        <script>
+        require(['echarts'/*, 'map/js/china' */], function (echarts) {
+            var option = makeAllOption0({
+                timelineDuration: 2000,
+                barDurationUpdate: 1990,
+                axisDurationUpdate: 500,
+                currentIndex: 47
+            });
+
+            var chart = testHelper.create(echarts, 'main1', {
+                title: [
+                    '(1) Check that init animation should be OK.',
+                    '(2) Click to ">" of timeline.',
+                    'Check **Massachusetts**, should switch just when it 
overtakes **California**.'
+                ],
+                info: ' ',
+                option: option
+                // height: 300,
+                // buttons: [{text: 'btn-txt', onclick: function () {}}],
+                // recordCanvas: true,
+            });
+
+            monitorChangeAxisOrderTriggering(chart);
+        });
+        </script>
+
+
+
+
+    </body>
+</html>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to