| import { cubicSubdivide } from '../core/curve.js'; | 
| import Path from '../graphic/Path.js'; | 
| import { defaults, map } from '../core/util.js'; | 
| import { lerp } from '../core/vector.js'; | 
| import { clonePath } from './path.js'; | 
| import Transformable from '../core/Transformable.js'; | 
| import { split } from './dividePath.js'; | 
| import { pathToBezierCurves } from './convertPath.js'; | 
| function alignSubpath(subpath1, subpath2) { | 
|     var len1 = subpath1.length; | 
|     var len2 = subpath2.length; | 
|     if (len1 === len2) { | 
|         return [subpath1, subpath2]; | 
|     } | 
|     var tmpSegX = []; | 
|     var tmpSegY = []; | 
|     var shorterPath = len1 < len2 ? subpath1 : subpath2; | 
|     var shorterLen = Math.min(len1, len2); | 
|     var diff = Math.abs(len2 - len1) / 6; | 
|     var shorterBezierCount = (shorterLen - 2) / 6; | 
|     var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1; | 
|     var newSubpath = [shorterPath[0], shorterPath[1]]; | 
|     var remained = diff; | 
|     for (var i = 2; i < shorterLen;) { | 
|         var x0 = shorterPath[i - 2]; | 
|         var y0 = shorterPath[i - 1]; | 
|         var x1 = shorterPath[i++]; | 
|         var y1 = shorterPath[i++]; | 
|         var x2 = shorterPath[i++]; | 
|         var y2 = shorterPath[i++]; | 
|         var x3 = shorterPath[i++]; | 
|         var y3 = shorterPath[i++]; | 
|         if (remained <= 0) { | 
|             newSubpath.push(x1, y1, x2, y2, x3, y3); | 
|             continue; | 
|         } | 
|         var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1; | 
|         for (var k = 1; k <= actualSubDivCount; k++) { | 
|             var p = k / actualSubDivCount; | 
|             cubicSubdivide(x0, x1, x2, x3, p, tmpSegX); | 
|             cubicSubdivide(y0, y1, y2, y3, p, tmpSegY); | 
|             x0 = tmpSegX[3]; | 
|             y0 = tmpSegY[3]; | 
|             newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0); | 
|             x1 = tmpSegX[5]; | 
|             y1 = tmpSegY[5]; | 
|             x2 = tmpSegX[6]; | 
|             y2 = tmpSegY[6]; | 
|         } | 
|         remained -= actualSubDivCount - 1; | 
|     } | 
|     return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath]; | 
| } | 
| function createSubpath(lastSubpathSubpath, otherSubpath) { | 
|     var len = lastSubpathSubpath.length; | 
|     var lastX = lastSubpathSubpath[len - 2]; | 
|     var lastY = lastSubpathSubpath[len - 1]; | 
|     var newSubpath = []; | 
|     for (var i = 0; i < otherSubpath.length;) { | 
|         newSubpath[i++] = lastX; | 
|         newSubpath[i++] = lastY; | 
|     } | 
|     return newSubpath; | 
| } | 
| export function alignBezierCurves(array1, array2) { | 
|     var _a; | 
|     var lastSubpath1; | 
|     var lastSubpath2; | 
|     var newArray1 = []; | 
|     var newArray2 = []; | 
|     for (var i = 0; i < Math.max(array1.length, array2.length); i++) { | 
|         var subpath1 = array1[i]; | 
|         var subpath2 = array2[i]; | 
|         var newSubpath1 = void 0; | 
|         var newSubpath2 = void 0; | 
|         if (!subpath1) { | 
|             newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2); | 
|             newSubpath2 = subpath2; | 
|         } | 
|         else if (!subpath2) { | 
|             newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1); | 
|             newSubpath1 = subpath1; | 
|         } | 
|         else { | 
|             _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1]; | 
|             lastSubpath1 = newSubpath1; | 
|             lastSubpath2 = newSubpath2; | 
|         } | 
|         newArray1.push(newSubpath1); | 
|         newArray2.push(newSubpath2); | 
|     } | 
|     return [newArray1, newArray2]; | 
| } | 
| export function centroid(array) { | 
|     var signedArea = 0; | 
|     var cx = 0; | 
|     var cy = 0; | 
|     var len = array.length; | 
|     for (var i = 0, j = len - 2; i < len; j = i, i += 2) { | 
|         var x0 = array[j]; | 
|         var y0 = array[j + 1]; | 
|         var x1 = array[i]; | 
|         var y1 = array[i + 1]; | 
|         var a = x0 * y1 - x1 * y0; | 
|         signedArea += a; | 
|         cx += (x0 + x1) * a; | 
|         cy += (y0 + y1) * a; | 
|     } | 
|     if (signedArea === 0) { | 
|         return [array[0] || 0, array[1] || 0]; | 
|     } | 
|     return [cx / signedArea / 3, cy / signedArea / 3, signedArea]; | 
| } | 
| function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) { | 
|     var bezierCount = (fromSubBeziers.length - 2) / 6; | 
|     var bestScore = Infinity; | 
|     var bestOffset = 0; | 
|     var len = fromSubBeziers.length; | 
|     var len2 = len - 2; | 
|     for (var offset = 0; offset < bezierCount; offset++) { | 
|         var cursorOffset = offset * 6; | 
|         var score = 0; | 
|         for (var k = 0; k < len; k += 2) { | 
|             var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2); | 
|             var x0 = fromSubBeziers[idx] - fromCp[0]; | 
|             var y0 = fromSubBeziers[idx + 1] - fromCp[1]; | 
|             var x1 = toSubBeziers[k] - toCp[0]; | 
|             var y1 = toSubBeziers[k + 1] - toCp[1]; | 
|             var dx = x1 - x0; | 
|             var dy = y1 - y0; | 
|             score += dx * dx + dy * dy; | 
|         } | 
|         if (score < bestScore) { | 
|             bestScore = score; | 
|             bestOffset = offset; | 
|         } | 
|     } | 
|     return bestOffset; | 
| } | 
| function reverse(array) { | 
|     var newArr = []; | 
|     var len = array.length; | 
|     for (var i = 0; i < len; i += 2) { | 
|         newArr[i] = array[len - i - 2]; | 
|         newArr[i + 1] = array[len - i - 1]; | 
|     } | 
|     return newArr; | 
| } | 
| function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) { | 
|     var result = []; | 
|     var fromNeedsReverse; | 
|     for (var i = 0; i < fromArr.length; i++) { | 
|         var fromSubpathBezier = fromArr[i]; | 
|         var toSubpathBezier = toArr[i]; | 
|         var fromCp = centroid(fromSubpathBezier); | 
|         var toCp = centroid(toSubpathBezier); | 
|         if (fromNeedsReverse == null) { | 
|             fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0; | 
|         } | 
|         var newFromSubpathBezier = []; | 
|         var newToSubpathBezier = []; | 
|         var bestAngle = 0; | 
|         var bestScore = Infinity; | 
|         var tmpArr = []; | 
|         var len = fromSubpathBezier.length; | 
|         if (fromNeedsReverse) { | 
|             fromSubpathBezier = reverse(fromSubpathBezier); | 
|         } | 
|         var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6; | 
|         var len2 = len - 2; | 
|         for (var k = 0; k < len2; k += 2) { | 
|             var idx = (offset + k) % len2 + 2; | 
|             newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0]; | 
|             newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1]; | 
|         } | 
|         newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0]; | 
|         newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1]; | 
|         if (searchAngleIteration > 0) { | 
|             var step = searchAngleRange / searchAngleIteration; | 
|             for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) { | 
|                 var sa = Math.sin(angle); | 
|                 var ca = Math.cos(angle); | 
|                 var score = 0; | 
|                 for (var k = 0; k < fromSubpathBezier.length; k += 2) { | 
|                     var x0 = newFromSubpathBezier[k]; | 
|                     var y0 = newFromSubpathBezier[k + 1]; | 
|                     var x1 = toSubpathBezier[k] - toCp[0]; | 
|                     var y1 = toSubpathBezier[k + 1] - toCp[1]; | 
|                     var newX1 = x1 * ca - y1 * sa; | 
|                     var newY1 = x1 * sa + y1 * ca; | 
|                     tmpArr[k] = newX1; | 
|                     tmpArr[k + 1] = newY1; | 
|                     var dx = newX1 - x0; | 
|                     var dy = newY1 - y0; | 
|                     score += dx * dx + dy * dy; | 
|                 } | 
|                 if (score < bestScore) { | 
|                     bestScore = score; | 
|                     bestAngle = angle; | 
|                     for (var m = 0; m < tmpArr.length; m++) { | 
|                         newToSubpathBezier[m] = tmpArr[m]; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         else { | 
|             for (var i_1 = 0; i_1 < len; i_1 += 2) { | 
|                 newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0]; | 
|                 newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1]; | 
|             } | 
|         } | 
|         result.push({ | 
|             from: newFromSubpathBezier, | 
|             to: newToSubpathBezier, | 
|             fromCp: fromCp, | 
|             toCp: toCp, | 
|             rotation: -bestAngle | 
|         }); | 
|     } | 
|     return result; | 
| } | 
| export function isCombineMorphing(path) { | 
|     return path.__isCombineMorphing; | 
| } | 
| export function isMorphing(el) { | 
|     return el.__morphT >= 0; | 
| } | 
| var SAVED_METHOD_PREFIX = '__mOriginal_'; | 
| function saveAndModifyMethod(obj, methodName, modifiers) { | 
|     var savedMethodName = SAVED_METHOD_PREFIX + methodName; | 
|     var originalMethod = obj[savedMethodName] || obj[methodName]; | 
|     if (!obj[savedMethodName]) { | 
|         obj[savedMethodName] = obj[methodName]; | 
|     } | 
|     var replace = modifiers.replace; | 
|     var after = modifiers.after; | 
|     var before = modifiers.before; | 
|     obj[methodName] = function () { | 
|         var args = arguments; | 
|         var res; | 
|         before && before.apply(this, args); | 
|         if (replace) { | 
|             res = replace.apply(this, args); | 
|         } | 
|         else { | 
|             res = originalMethod.apply(this, args); | 
|         } | 
|         after && after.apply(this, args); | 
|         return res; | 
|     }; | 
| } | 
| function restoreMethod(obj, methodName) { | 
|     var savedMethodName = SAVED_METHOD_PREFIX + methodName; | 
|     if (obj[savedMethodName]) { | 
|         obj[methodName] = obj[savedMethodName]; | 
|         obj[savedMethodName] = null; | 
|     } | 
| } | 
| function applyTransformOnBeziers(bezierCurves, mm) { | 
|     for (var i = 0; i < bezierCurves.length; i++) { | 
|         var subBeziers = bezierCurves[i]; | 
|         for (var k = 0; k < subBeziers.length;) { | 
|             var x = subBeziers[k]; | 
|             var y = subBeziers[k + 1]; | 
|             subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4]; | 
|             subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5]; | 
|         } | 
|     } | 
| } | 
| function prepareMorphPath(fromPath, toPath) { | 
|     var fromPathProxy = fromPath.getUpdatedPathProxy(); | 
|     var toPathProxy = toPath.getUpdatedPathProxy(); | 
|     var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1]; | 
|     var fromPathTransform = fromPath.getComputedTransform(); | 
|     var toPathTransform = toPath.getComputedTransform(); | 
|     function updateIdentityTransform() { | 
|         this.transform = null; | 
|     } | 
|     fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform); | 
|     toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform); | 
|     saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform }); | 
|     toPath.transform = null; | 
|     var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI); | 
|     var tmpArr = []; | 
|     saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) { | 
|             var t = toPath.__morphT; | 
|             var onet = 1 - t; | 
|             var newCp = []; | 
|             for (var i = 0; i < morphingData.length; i++) { | 
|                 var item = morphingData[i]; | 
|                 var from = item.from; | 
|                 var to = item.to; | 
|                 var angle = item.rotation * t; | 
|                 var fromCp = item.fromCp; | 
|                 var toCp = item.toCp; | 
|                 var sa = Math.sin(angle); | 
|                 var ca = Math.cos(angle); | 
|                 lerp(newCp, fromCp, toCp, t); | 
|                 for (var m = 0; m < from.length; m += 2) { | 
|                     var x0_1 = from[m]; | 
|                     var y0_1 = from[m + 1]; | 
|                     var x1 = to[m]; | 
|                     var y1 = to[m + 1]; | 
|                     var x = x0_1 * onet + x1 * t; | 
|                     var y = y0_1 * onet + y1 * t; | 
|                     tmpArr[m] = (x * ca - y * sa) + newCp[0]; | 
|                     tmpArr[m + 1] = (x * sa + y * ca) + newCp[1]; | 
|                 } | 
|                 var x0 = tmpArr[0]; | 
|                 var y0 = tmpArr[1]; | 
|                 path.moveTo(x0, y0); | 
|                 for (var m = 2; m < from.length;) { | 
|                     var x1 = tmpArr[m++]; | 
|                     var y1 = tmpArr[m++]; | 
|                     var x2 = tmpArr[m++]; | 
|                     var y2 = tmpArr[m++]; | 
|                     var x3 = tmpArr[m++]; | 
|                     var y3 = tmpArr[m++]; | 
|                     if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) { | 
|                         path.lineTo(x3, y3); | 
|                     } | 
|                     else { | 
|                         path.bezierCurveTo(x1, y1, x2, y2, x3, y3); | 
|                     } | 
|                     x0 = x3; | 
|                     y0 = y3; | 
|                 } | 
|             } | 
|         } }); | 
| } | 
| export function morphPath(fromPath, toPath, animationOpts) { | 
|     if (!fromPath || !toPath) { | 
|         return toPath; | 
|     } | 
|     var oldDone = animationOpts.done; | 
|     var oldDuring = animationOpts.during; | 
|     prepareMorphPath(fromPath, toPath); | 
|     toPath.__morphT = 0; | 
|     function restoreToPath() { | 
|         restoreMethod(toPath, 'buildPath'); | 
|         restoreMethod(toPath, 'updateTransform'); | 
|         toPath.__morphT = -1; | 
|         toPath.createPathProxy(); | 
|         toPath.dirtyShape(); | 
|     } | 
|     toPath.animateTo({ | 
|         __morphT: 1 | 
|     }, defaults({ | 
|         during: function (p) { | 
|             toPath.dirtyShape(); | 
|             oldDuring && oldDuring(p); | 
|         }, | 
|         done: function () { | 
|             restoreToPath(); | 
|             oldDone && oldDone(); | 
|         } | 
|     }, animationOpts)); | 
|     return toPath; | 
| } | 
| function hilbert(x, y, minX, minY, maxX, maxY) { | 
|     var bits = 16; | 
|     x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX)); | 
|     y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY)); | 
|     var d = 0; | 
|     var tmp; | 
|     for (var s = (1 << bits) / 2; s > 0; s /= 2) { | 
|         var rx = 0; | 
|         var ry = 0; | 
|         if ((x & s) > 0) { | 
|             rx = 1; | 
|         } | 
|         if ((y & s) > 0) { | 
|             ry = 1; | 
|         } | 
|         d += s * s * ((3 * rx) ^ ry); | 
|         if (ry === 0) { | 
|             if (rx === 1) { | 
|                 x = s - 1 - x; | 
|                 y = s - 1 - y; | 
|             } | 
|             tmp = x; | 
|             x = y; | 
|             y = tmp; | 
|         } | 
|     } | 
|     return d; | 
| } | 
| function sortPaths(pathList) { | 
|     var xMin = Infinity; | 
|     var yMin = Infinity; | 
|     var xMax = -Infinity; | 
|     var yMax = -Infinity; | 
|     var cps = map(pathList, function (path) { | 
|         var rect = path.getBoundingRect(); | 
|         var m = path.getComputedTransform(); | 
|         var x = rect.x + rect.width / 2 + (m ? m[4] : 0); | 
|         var y = rect.y + rect.height / 2 + (m ? m[5] : 0); | 
|         xMin = Math.min(x, xMin); | 
|         yMin = Math.min(y, yMin); | 
|         xMax = Math.max(x, xMax); | 
|         yMax = Math.max(y, yMax); | 
|         return [x, y]; | 
|     }); | 
|     var items = map(cps, function (cp, idx) { | 
|         return { | 
|             cp: cp, | 
|             z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax), | 
|             path: pathList[idx] | 
|         }; | 
|     }); | 
|     return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; }); | 
| } | 
| ; | 
| function defaultDividePath(param) { | 
|     return split(param.path, param.count); | 
| } | 
| function createEmptyReturn() { | 
|     return { | 
|         fromIndividuals: [], | 
|         toIndividuals: [], | 
|         count: 0 | 
|     }; | 
| } | 
| export function combineMorph(fromList, toPath, animationOpts) { | 
|     var fromPathList = []; | 
|     function addFromPath(fromList) { | 
|         for (var i = 0; i < fromList.length; i++) { | 
|             var from = fromList[i]; | 
|             if (isCombineMorphing(from)) { | 
|                 addFromPath(from.childrenRef()); | 
|             } | 
|             else if (from instanceof Path) { | 
|                 fromPathList.push(from); | 
|             } | 
|         } | 
|     } | 
|     addFromPath(fromList); | 
|     var separateCount = fromPathList.length; | 
|     if (!separateCount) { | 
|         return createEmptyReturn(); | 
|     } | 
|     var dividePath = animationOpts.dividePath || defaultDividePath; | 
|     var toSubPathList = dividePath({ | 
|         path: toPath, count: separateCount | 
|     }); | 
|     if (toSubPathList.length !== separateCount) { | 
|         console.error('Invalid morphing: unmatched splitted path'); | 
|         return createEmptyReturn(); | 
|     } | 
|     fromPathList = sortPaths(fromPathList); | 
|     toSubPathList = sortPaths(toSubPathList); | 
|     var oldDone = animationOpts.done; | 
|     var oldDuring = animationOpts.during; | 
|     var individualDelay = animationOpts.individualDelay; | 
|     var identityTransform = new Transformable(); | 
|     for (var i = 0; i < separateCount; i++) { | 
|         var from = fromPathList[i]; | 
|         var to = toSubPathList[i]; | 
|         to.parent = toPath; | 
|         to.copyTransform(identityTransform); | 
|         if (!individualDelay) { | 
|             prepareMorphPath(from, to); | 
|         } | 
|     } | 
|     toPath.__isCombineMorphing = true; | 
|     toPath.childrenRef = function () { | 
|         return toSubPathList; | 
|     }; | 
|     function addToSubPathListToZr(zr) { | 
|         for (var i = 0; i < toSubPathList.length; i++) { | 
|             toSubPathList[i].addSelfToZr(zr); | 
|         } | 
|     } | 
|     saveAndModifyMethod(toPath, 'addSelfToZr', { | 
|         after: function (zr) { | 
|             addToSubPathListToZr(zr); | 
|         } | 
|     }); | 
|     saveAndModifyMethod(toPath, 'removeSelfFromZr', { | 
|         after: function (zr) { | 
|             for (var i = 0; i < toSubPathList.length; i++) { | 
|                 toSubPathList[i].removeSelfFromZr(zr); | 
|             } | 
|         } | 
|     }); | 
|     function restoreToPath() { | 
|         toPath.__isCombineMorphing = false; | 
|         toPath.__morphT = -1; | 
|         toPath.childrenRef = null; | 
|         restoreMethod(toPath, 'addSelfToZr'); | 
|         restoreMethod(toPath, 'removeSelfFromZr'); | 
|     } | 
|     var toLen = toSubPathList.length; | 
|     if (individualDelay) { | 
|         var animating_1 = toLen; | 
|         var eachDone = function () { | 
|             animating_1--; | 
|             if (animating_1 === 0) { | 
|                 restoreToPath(); | 
|                 oldDone && oldDone(); | 
|             } | 
|         }; | 
|         for (var i = 0; i < toLen; i++) { | 
|             var indivdualAnimationOpts = individualDelay ? defaults({ | 
|                 delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]), | 
|                 done: eachDone | 
|             }, animationOpts) : animationOpts; | 
|             morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts); | 
|         } | 
|     } | 
|     else { | 
|         toPath.__morphT = 0; | 
|         toPath.animateTo({ | 
|             __morphT: 1 | 
|         }, defaults({ | 
|             during: function (p) { | 
|                 for (var i = 0; i < toLen; i++) { | 
|                     var child = toSubPathList[i]; | 
|                     child.__morphT = toPath.__morphT; | 
|                     child.dirtyShape(); | 
|                 } | 
|                 oldDuring && oldDuring(p); | 
|             }, | 
|             done: function () { | 
|                 restoreToPath(); | 
|                 for (var i = 0; i < fromList.length; i++) { | 
|                     restoreMethod(fromList[i], 'updateTransform'); | 
|                 } | 
|                 oldDone && oldDone(); | 
|             } | 
|         }, animationOpts)); | 
|     } | 
|     if (toPath.__zr) { | 
|         addToSubPathListToZr(toPath.__zr); | 
|     } | 
|     return { | 
|         fromIndividuals: fromPathList, | 
|         toIndividuals: toSubPathList, | 
|         count: toLen | 
|     }; | 
| } | 
| export function separateMorph(fromPath, toPathList, animationOpts) { | 
|     var toLen = toPathList.length; | 
|     var fromPathList = []; | 
|     var dividePath = animationOpts.dividePath || defaultDividePath; | 
|     function addFromPath(fromList) { | 
|         for (var i = 0; i < fromList.length; i++) { | 
|             var from = fromList[i]; | 
|             if (isCombineMorphing(from)) { | 
|                 addFromPath(from.childrenRef()); | 
|             } | 
|             else if (from instanceof Path) { | 
|                 fromPathList.push(from); | 
|             } | 
|         } | 
|     } | 
|     if (isCombineMorphing(fromPath)) { | 
|         addFromPath(fromPath.childrenRef()); | 
|         var fromLen = fromPathList.length; | 
|         if (fromLen < toLen) { | 
|             var k = 0; | 
|             for (var i = fromLen; i < toLen; i++) { | 
|                 fromPathList.push(clonePath(fromPathList[k++ % fromLen])); | 
|             } | 
|         } | 
|         fromPathList.length = toLen; | 
|     } | 
|     else { | 
|         fromPathList = dividePath({ path: fromPath, count: toLen }); | 
|         var fromPathTransform = fromPath.getComputedTransform(); | 
|         for (var i = 0; i < fromPathList.length; i++) { | 
|             fromPathList[i].setLocalTransform(fromPathTransform); | 
|         } | 
|         if (fromPathList.length !== toLen) { | 
|             console.error('Invalid morphing: unmatched splitted path'); | 
|             return createEmptyReturn(); | 
|         } | 
|     } | 
|     fromPathList = sortPaths(fromPathList); | 
|     toPathList = sortPaths(toPathList); | 
|     var individualDelay = animationOpts.individualDelay; | 
|     for (var i = 0; i < toLen; i++) { | 
|         var indivdualAnimationOpts = individualDelay ? defaults({ | 
|             delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i]) | 
|         }, animationOpts) : animationOpts; | 
|         morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts); | 
|     } | 
|     return { | 
|         fromIndividuals: fromPathList, | 
|         toIndividuals: toPathList, | 
|         count: toPathList.length | 
|     }; | 
| } | 
| export { split as defaultDividePath }; |