You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1 lines
3.3 MiB

{"version":3,"file":"js/898-legacy.13f30c0d.js","mappings":"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","sources":["webpack://databasir-frontend/./node_modules/core-js/internals/array-from.js","webpack://databasir-frontend/./node_modules/core-js/internals/array-slice-simple.js","webpack://databasir-frontend/./node_modules/core-js/internals/array-sort.js","webpack://databasir-frontend/./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://databasir-frontend/./node_modules/core-js/internals/create-property.js","webpack://databasir-frontend/./node_modules/core-js/internals/native-url.js","webpack://databasir-frontend/./node_modules/core-js/internals/string-punycode-to-ascii.js","webpack://databasir-frontend/./node_modules/core-js/modules/es.array.filter.js","webpack://databasir-frontend/./node_modules/core-js/modules/es.array.from.js","webpack://databasir-frontend/./node_modules/core-js/modules/es.string.split.js","webpack://databasir-frontend/./node_modules/core-js/modules/web.url-search-params.js","webpack://databasir-frontend/./node_modules/core-js/modules/web.url.js","webpack://databasir-frontend/./node_modules/jquery-mousewheel/jquery.mousewheel.js","webpack://databasir-frontend/./node_modules/jquery/dist/jquery.js","webpack://databasir-frontend/./node_modules/mousetrap/mousetrap.js","webpack://databasir-frontend/./src/views/Document.vue","webpack://databasir-frontend/./src/api/Document.js","webpack://databasir-frontend/./src/components/document/Diagram.vue","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/platform/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/polyfill/index.js","webpack://databasir-frontend/./node_modules/lodash-es/isArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_freeGlobal.js","webpack://databasir-frontend/./node_modules/lodash-es/_root.js","webpack://databasir-frontend/./node_modules/lodash-es/_Symbol.js","webpack://databasir-frontend/./node_modules/lodash-es/_getRawTag.js","webpack://databasir-frontend/./node_modules/lodash-es/_objectToString.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseGetTag.js","webpack://databasir-frontend/./node_modules/lodash-es/isObject.js","webpack://databasir-frontend/./node_modules/lodash-es/isFunction.js","webpack://databasir-frontend/./node_modules/lodash-es/isLength.js","webpack://databasir-frontend/./node_modules/lodash-es/isArrayLike.js","webpack://databasir-frontend/./node_modules/lodash-es/_coreJsData.js","webpack://databasir-frontend/./node_modules/lodash-es/_isMasked.js","webpack://databasir-frontend/./node_modules/lodash-es/_toSource.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsNative.js","webpack://databasir-frontend/./node_modules/lodash-es/_getValue.js","webpack://databasir-frontend/./node_modules/lodash-es/_getNative.js","webpack://databasir-frontend/./node_modules/lodash-es/_nativeCreate.js","webpack://databasir-frontend/./node_modules/lodash-es/_hashClear.js","webpack://databasir-frontend/./node_modules/lodash-es/_hashDelete.js","webpack://databasir-frontend/./node_modules/lodash-es/_hashGet.js","webpack://databasir-frontend/./node_modules/lodash-es/_hashHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_hashSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_Hash.js","webpack://databasir-frontend/./node_modules/lodash-es/_listCacheClear.js","webpack://databasir-frontend/./node_modules/lodash-es/eq.js","webpack://databasir-frontend/./node_modules/lodash-es/_assocIndexOf.js","webpack://databasir-frontend/./node_modules/lodash-es/_listCacheDelete.js","webpack://databasir-frontend/./node_modules/lodash-es/_listCacheGet.js","webpack://databasir-frontend/./node_modules/lodash-es/_listCacheHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_listCacheSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_ListCache.js","webpack://databasir-frontend/./node_modules/lodash-es/_Map.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapCacheClear.js","webpack://databasir-frontend/./node_modules/lodash-es/_isKeyable.js","webpack://databasir-frontend/./node_modules/lodash-es/_getMapData.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapCacheDelete.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapCacheGet.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapCacheHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapCacheSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_MapCache.js","webpack://databasir-frontend/./node_modules/lodash-es/_setCacheAdd.js","webpack://databasir-frontend/./node_modules/lodash-es/_setCacheHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_SetCache.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseFindIndex.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsNaN.js","webpack://databasir-frontend/./node_modules/lodash-es/_strictIndexOf.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIndexOf.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayIncludes.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayIncludesWith.js","webpack://databasir-frontend/./node_modules/lodash-es/_cacheHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_Set.js","webpack://databasir-frontend/./node_modules/lodash-es/noop.js","webpack://databasir-frontend/./node_modules/lodash-es/_setToArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_createSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseUniq.js","webpack://databasir-frontend/./node_modules/lodash-es/uniq.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayPush.js","webpack://databasir-frontend/./node_modules/lodash-es/isObjectLike.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsArguments.js","webpack://databasir-frontend/./node_modules/lodash-es/isArguments.js","webpack://databasir-frontend/./node_modules/lodash-es/_isFlattenable.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseFlatten.js","webpack://databasir-frontend/./node_modules/lodash-es/identity.js","webpack://databasir-frontend/./node_modules/lodash-es/_apply.js","webpack://databasir-frontend/./node_modules/lodash-es/_overRest.js","webpack://databasir-frontend/./node_modules/lodash-es/constant.js","webpack://databasir-frontend/./node_modules/lodash-es/_defineProperty.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSetToString.js","webpack://databasir-frontend/./node_modules/lodash-es/_shortOut.js","webpack://databasir-frontend/./node_modules/lodash-es/_setToString.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseRest.js","webpack://databasir-frontend/./node_modules/lodash-es/isArrayLikeObject.js","webpack://databasir-frontend/./node_modules/lodash-es/union.js","webpack://databasir-frontend/./node_modules/lodash-es/isSymbol.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSortedIndexBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSortedIndex.js","webpack://databasir-frontend/./node_modules/lodash-es/sortedIndex.js","webpack://databasir-frontend/./node_modules/lodash-es/_stackClear.js","webpack://databasir-frontend/./node_modules/lodash-es/_stackDelete.js","webpack://databasir-frontend/./node_modules/lodash-es/_stackGet.js","webpack://databasir-frontend/./node_modules/lodash-es/_stackHas.js","webpack://databasir-frontend/./node_modules/lodash-es/_stackSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_Stack.js","webpack://databasir-frontend/./node_modules/lodash-es/_arraySome.js","webpack://databasir-frontend/./node_modules/lodash-es/_equalArrays.js","webpack://databasir-frontend/./node_modules/lodash-es/_Uint8Array.js","webpack://databasir-frontend/./node_modules/lodash-es/_mapToArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_equalByTag.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseGetAllKeys.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayFilter.js","webpack://databasir-frontend/./node_modules/lodash-es/stubArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_getSymbols.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseTimes.js","webpack://databasir-frontend/./node_modules/lodash-es/stubFalse.js","webpack://databasir-frontend/./node_modules/lodash-es/isBuffer.js","webpack://databasir-frontend/./node_modules/lodash-es/_isIndex.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseUnary.js","webpack://databasir-frontend/./node_modules/lodash-es/_nodeUtil.js","webpack://databasir-frontend/./node_modules/lodash-es/isTypedArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://databasir-frontend/./node_modules/lodash-es/_isPrototype.js","webpack://databasir-frontend/./node_modules/lodash-es/_overArg.js","webpack://databasir-frontend/./node_modules/lodash-es/_nativeKeys.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseKeys.js","webpack://databasir-frontend/./node_modules/lodash-es/keys.js","webpack://databasir-frontend/./node_modules/lodash-es/_getAllKeys.js","webpack://databasir-frontend/./node_modules/lodash-es/_equalObjects.js","webpack://databasir-frontend/./node_modules/lodash-es/_DataView.js","webpack://databasir-frontend/./node_modules/lodash-es/_Promise.js","webpack://databasir-frontend/./node_modules/lodash-es/_WeakMap.js","webpack://databasir-frontend/./node_modules/lodash-es/_getTag.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsEqualDeep.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsEqual.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsMatch.js","webpack://databasir-frontend/./node_modules/lodash-es/_isStrictComparable.js","webpack://databasir-frontend/./node_modules/lodash-es/_getMatchData.js","webpack://databasir-frontend/./node_modules/lodash-es/_matchesStrictComparable.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseMatches.js","webpack://databasir-frontend/./node_modules/lodash-es/_isKey.js","webpack://databasir-frontend/./node_modules/lodash-es/memoize.js","webpack://databasir-frontend/./node_modules/lodash-es/_memoizeCapped.js","webpack://databasir-frontend/./node_modules/lodash-es/_stringToPath.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayMap.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseToString.js","webpack://databasir-frontend/./node_modules/lodash-es/toString.js","webpack://databasir-frontend/./node_modules/lodash-es/_castPath.js","webpack://databasir-frontend/./node_modules/lodash-es/_toKey.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseGet.js","webpack://databasir-frontend/./node_modules/lodash-es/get.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseHasIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_hasPath.js","webpack://databasir-frontend/./node_modules/lodash-es/hasIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseMatchesProperty.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseProperty.js","webpack://databasir-frontend/./node_modules/lodash-es/_basePropertyDeep.js","webpack://databasir-frontend/./node_modules/lodash-es/property.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIteratee.js","webpack://databasir-frontend/./node_modules/lodash-es/sortedIndexBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_createBaseFor.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseFor.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseForOwn.js","webpack://databasir-frontend/./node_modules/lodash-es/_createBaseEach.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseEach.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseMap.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSortBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_compareAscending.js","webpack://databasir-frontend/./node_modules/lodash-es/_compareMultiple.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseOrderBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_isIterateeCall.js","webpack://databasir-frontend/./node_modules/lodash-es/sortBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseAssignValue.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayAggregator.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseAggregator.js","webpack://databasir-frontend/./node_modules/lodash-es/_createAggregator.js","webpack://databasir-frontend/./node_modules/lodash-es/groupBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseDifference.js","webpack://databasir-frontend/./node_modules/lodash-es/difference.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseHas.js","webpack://databasir-frontend/./node_modules/lodash-es/has.js","webpack://databasir-frontend/./node_modules/lodash-es/_assignValue.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_basePickBy.js","webpack://databasir-frontend/./node_modules/lodash-es/_basePick.js","webpack://databasir-frontend/./node_modules/lodash-es/flatten.js","webpack://databasir-frontend/./node_modules/lodash-es/_flatRest.js","webpack://databasir-frontend/./node_modules/lodash-es/pick.js","webpack://databasir-frontend/./node_modules/lodash-es/_nativeKeysIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseKeysIn.js","webpack://databasir-frontend/./node_modules/lodash-es/keysIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_assignMergeValue.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneBuffer.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneTypedArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_copyArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseCreate.js","webpack://databasir-frontend/./node_modules/lodash-es/_getPrototype.js","webpack://databasir-frontend/./node_modules/lodash-es/_initCloneObject.js","webpack://databasir-frontend/./node_modules/lodash-es/isPlainObject.js","webpack://databasir-frontend/./node_modules/lodash-es/_safeGet.js","webpack://databasir-frontend/./node_modules/lodash-es/_copyObject.js","webpack://databasir-frontend/./node_modules/lodash-es/toPlainObject.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseMergeDeep.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseMerge.js","webpack://databasir-frontend/./node_modules/lodash-es/_createAssigner.js","webpack://databasir-frontend/./node_modules/lodash-es/merge.js","webpack://databasir-frontend/./node_modules/lodash-es/assignIn.js","webpack://databasir-frontend/./node_modules/lodash-es/isEqual.js","webpack://databasir-frontend/./node_modules/lodash-es/isEmpty.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayEach.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseAssign.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseAssignIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_copySymbols.js","webpack://databasir-frontend/./node_modules/lodash-es/_getSymbolsIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_copySymbolsIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_getAllKeysIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_initCloneArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneDataView.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneRegExp.js","webpack://databasir-frontend/./node_modules/lodash-es/_cloneSymbol.js","webpack://databasir-frontend/./node_modules/lodash-es/_initCloneByTag.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsMap.js","webpack://databasir-frontend/./node_modules/lodash-es/isMap.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsSet.js","webpack://databasir-frontend/./node_modules/lodash-es/isSet.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseClone.js","webpack://databasir-frontend/./node_modules/lodash-es/clone.js","webpack://databasir-frontend/./node_modules/lodash-es/cloneDeep.js","webpack://databasir-frontend/./node_modules/lodash-es/defaults.js","webpack://databasir-frontend/./node_modules/lodash-es/_customDefaultsMerge.js","webpack://databasir-frontend/./node_modules/lodash-es/mergeWith.js","webpack://databasir-frontend/./node_modules/lodash-es/defaultsDeep.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/object/mixins.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/object/inherit.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/object/object.js","webpack://databasir-frontend/./node_modules/lodash-es/_basePropertyOf.js","webpack://databasir-frontend/./node_modules/lodash-es/_escapeHtmlChar.js","webpack://databasir-frontend/./node_modules/lodash-es/escape.js","webpack://databasir-frontend/./node_modules/lodash-es/_unescapeHtmlChar.js","webpack://databasir-frontend/./node_modules/lodash-es/unescape.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseClamp.js","webpack://databasir-frontend/./node_modules/lodash-es/_trimmedEndIndex.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseTrim.js","webpack://databasir-frontend/./node_modules/lodash-es/toNumber.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseSlice.js","webpack://databasir-frontend/./node_modules/lodash-es/_castSlice.js","webpack://databasir-frontend/./node_modules/lodash-es/_hasUnicode.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseIsRegExp.js","webpack://databasir-frontend/./node_modules/lodash-es/isRegExp.js","webpack://databasir-frontend/./node_modules/lodash-es/_asciiToArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_unicodeToArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_stringToArray.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseRepeat.js","webpack://databasir-frontend/./node_modules/lodash-es/_asciiSize.js","webpack://databasir-frontend/./node_modules/lodash-es/repeat.js","webpack://databasir-frontend/./node_modules/lodash-es/_unicodeSize.js","webpack://databasir-frontend/./node_modules/lodash-es/_createPadding.js","webpack://databasir-frontend/./node_modules/lodash-es/pad.js","webpack://databasir-frontend/./node_modules/lodash-es/truncate.js","webpack://databasir-frontend/./node_modules/lodash-es/assignInWith.js","webpack://databasir-frontend/./node_modules/lodash-es/isError.js","webpack://databasir-frontend/./node_modules/lodash-es/attempt.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseValues.js","webpack://databasir-frontend/./node_modules/lodash-es/_customDefaultsAssignIn.js","webpack://databasir-frontend/./node_modules/lodash-es/_escapeStringChar.js","webpack://databasir-frontend/./node_modules/lodash-es/_reInterpolate.js","webpack://databasir-frontend/./node_modules/lodash-es/_reEscape.js","webpack://databasir-frontend/./node_modules/lodash-es/_reEvaluate.js","webpack://databasir-frontend/./node_modules/lodash-es/templateSettings.js","webpack://databasir-frontend/./node_modules/lodash-es/template.js","webpack://databasir-frontend/./node_modules/lodash-es/uniqueId.js","webpack://databasir-frontend/./node_modules/lodash-es/_arrayReduce.js","webpack://databasir-frontend/./node_modules/lodash-es/_deburrLetter.js","webpack://databasir-frontend/./node_modules/lodash-es/deburr.js","webpack://databasir-frontend/./node_modules/lodash-es/_asciiWords.js","webpack://databasir-frontend/./node_modules/lodash-es/_hasUnicodeWord.js","webpack://databasir-frontend/./node_modules/lodash-es/_unicodeWords.js","webpack://databasir-frontend/./node_modules/lodash-es/words.js","webpack://databasir-frontend/./node_modules/lodash-es/_createCompounder.js","webpack://databasir-frontend/./node_modules/lodash-es/_createCaseFirst.js","webpack://databasir-frontend/./node_modules/lodash-es/upperFirst.js","webpack://databasir-frontend/./node_modules/lodash-es/startCase.js","webpack://databasir-frontend/./node_modules/lodash-es/capitalize.js","webpack://databasir-frontend/./node_modules/lodash-es/camelCase.js","webpack://databasir-frontend/./node_modules/lodash-es/upperCase.js","webpack://databasir-frontend/./node_modules/lodash-es/lowerCase.js","webpack://databasir-frontend/./node_modules/lodash-es/lowerFirst.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/string/format.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/string/hashcode.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/string/uuid.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/string/html.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/string/suggestion.js","webpack://databasir-frontend/./node_modules/lodash-es/isNumber.js","webpack://databasir-frontend/./node_modules/lodash-es/isFinite.js","webpack://databasir-frontend/./node_modules/lodash-es/clamp.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseInRange.js","webpack://databasir-frontend/./node_modules/lodash-es/parseInt.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/number/number.js","webpack://databasir-frontend/./node_modules/lodash-es/once.js","webpack://databasir-frontend/./node_modules/lodash-es/now.js","webpack://databasir-frontend/./node_modules/lodash-es/debounce.js","webpack://databasir-frontend/./node_modules/lodash-es/_baseDelay.js","webpack://databasir-frontend/./node_modules/lodash-es/defer.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/function/function.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/function/async.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/class.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/elem.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/attr.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/text/annotate.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/text/sanitize.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/json/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/datauri/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/unit/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/af.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/prefix.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/style.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/selection.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/angle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/geometry.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/point.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/rectangle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/line.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/ellipse.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/polyline.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/curve.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/segment.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/lineto.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/close.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/moveto.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/curveto.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/normalize.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/geometry/path/path.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/vector/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/text.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/path.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/matrix.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/geom.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/transform.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/mousewheel.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/dom/vector.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/size-sensor/sensors/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/size-sensor/sensors/object.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/size-sensor/sensors/observer.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/size-sensor/sensors/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/size-sensor/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/util/scheduler/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/registry.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/raw.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/ref.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/fill.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/stroke.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/text.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/title.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/align.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/style.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/html.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/filter.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/port.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/classic.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/diamond.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/path.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/cross.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/async.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/circle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/ellipse.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/marker/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/marker.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/connection.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/attr/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/grid/dot.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/grid/fixed-dot.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/grid/mesh.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/grid/double-mesh.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/grid/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/outline.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/highlight.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/blur.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/drop-shadow.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/gray-scale.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/sepia.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/saturate.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/hue-rotate.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/invert.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/brightness.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/contrast.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/filter/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/background/flip-x.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/background/flip-y.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/background/flip-xy.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/background/watermark.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/background/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/global/config.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/global/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/highlighter/class.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/highlighter/opacity.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/highlighter/stroke.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/highlighter/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-layout/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-layout/absolute.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-layout/ellipse.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-layout/line.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-layout/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-label-layout/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-label-layout/side.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-label-layout/inout.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-label-layout/radial.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/port-label-layout/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/events.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/color.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/disposable.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/basecoat.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/disablable.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/dictionary.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/algorithm/dijkstra.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/animation/timing.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/animation/interp.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/localstorage.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/view.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/common/algorithm/priorityqueue.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-strategy/noop.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-strategy/pin.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-strategy/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/markup.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/cache.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/attr.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/flag.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/cell.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/tool.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/button.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/boundary.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/vertices.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/segments.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/anchor.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/arrowhead.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/editor.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/tool/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/bbox.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/orth.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/node-center.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/middle-side.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/node-anchor/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/edge-anchor/ratio.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/edge-anchor/length.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/edge-anchor/closest.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/edge-anchor/orth.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/edge-anchor/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/bbox.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/rect.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/boundary.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/anchor.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connection-point/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/normal.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/oneside.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/orth.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/options.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/sorted-set.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/obstacle-map.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/router.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/manhattan/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/metro.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/er.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/loop.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/router/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/normal.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/loop.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/rounded.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/smooth.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/jumpover.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/connector/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/registry/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/animation.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/store.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/cell.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/registry.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/port.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/node.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/base.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/rect.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/circle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/ellipse.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/polygon.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/polyline.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/image.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/path.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/rhombus.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/cylinder.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/edge.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/edge.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/view/node.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/text.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/collection.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/model/model.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/basic/text-block.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/empty.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/rect.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/rect-headered.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/circle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/cylinder.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/ellipse.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/poly.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/polygon.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/polyline.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/path.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/text-block.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/image.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/image-bordered.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/image-embedded.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/image-inscribed.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/edge.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/edge-shadow.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/edge-doubled.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/shape/standard/html.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/autosave/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/base.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/view.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/decorator.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/style/raw.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/css.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/common/handle.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/common/widget.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/knob/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/minimap/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/snapline/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/renderer.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/background.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/scroller/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/transform/util.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/selection/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/transform/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/options.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/defs.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/grid.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/coord.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/snapline.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/types/modifier.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/scroller.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/clipboard.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/highlight.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/transform.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/selection.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/history.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/minimap.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/keyboard.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/mousewheel.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/print.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/format.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/knob.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/panning.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/size.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/hook.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/graph/graph.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/clipboard/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/halo/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/halo/node-preset.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/halo/edge-preset.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/dnd/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/layout/grid.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/addon/stencil/index.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/global/version.js","webpack://databasir-frontend/./node_modules/@antv/x6/es/global/track.js","webpack://databasir-frontend/./src/utils/DatabaseFieldFormatter.js","webpack://databasir-frontend/./src/components/document/Diagram.vue?b915","webpack://databasir-frontend/./src/components/document/DocumentRemark.vue","webpack://databasir-frontend/./src/api/DocumentRemark.js","webpack://databasir-frontend/./src/components/document/DocumentRemark.vue?e5ee","webpack://databasir-frontend/./src/components/document/DocumentList.vue","webpack://databasir-frontend/./src/components/document/DocumentList.vue?9701","webpack://databasir-frontend/./src/views/Document.vue?4cdc"],"sourcesContent":["'use strict';\nvar global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar Array = global.Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var IS_CONSTRUCTOR = isConstructor(this);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n result = IS_CONSTRUCTOR ? new this() : [];\n for (;!(step = call(next, iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = lengthOfArrayLike(O);\n result = IS_CONSTRUCTOR ? new this(length) : Array(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var global = require('../internals/global');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\n\nvar Array = global.Array;\nvar max = Math.max;\n\nmodule.exports = function (O, start, end) {\n var length = lengthOfArrayLike(O);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n var result = Array(max(fin - k, 0));\n for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n};\n","var arraySlice = require('../internals/array-slice-simple');\n\nvar floor = Math.floor;\n\nvar mergeSort = function (array, comparefn) {\n var length = array.length;\n var middle = floor(length / 2);\n return length < 8 ? insertionSort(array, comparefn) : merge(\n array,\n mergeSort(arraySlice(array, 0, middle), comparefn),\n mergeSort(arraySlice(array, middle), comparefn),\n comparefn\n );\n};\n\nvar insertionSort = function (array, comparefn) {\n var length = array.length;\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n } return array;\n};\n\nvar merge = function (array, left, right, comparefn) {\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n\n while (lindex < llength || rindex < rlength) {\n array[lindex + rindex] = (lindex < llength && rindex < rlength)\n ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n : lindex < llength ? left[lindex++] : right[rindex++];\n } return array;\n};\n\nmodule.exports = mergeSort;\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","'use strict';\nvar toPropertyKey = require('../internals/to-property-key');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\n\nvar RangeError = global.RangeError;\nvar exec = uncurryThis(regexSeparators.exec);\nvar floor = Math.floor;\nvar fromCharCode = String.fromCharCode;\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar toLowerCase = uncurryThis(''.toLowerCase);\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = charCodeAt(string, counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = charCodeAt(string, counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n push(output, value);\n counter--;\n }\n } else {\n push(output, value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > baseMinusTMin * tMax >> 1) {\n delta = floor(delta / baseMinusTMin);\n k += base;\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n push(output, fromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n push(output, delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n var k = base;\n while (true) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n k += base;\n }\n\n push(output, fromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n handledCPCount++;\n }\n }\n\n delta++;\n n++;\n }\n return join(output, '');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = split(replace(toLowerCase(input), regexSeparators, '\\u002E'), '.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label);\n }\n return join(encoded, '.');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.es/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n // eslint-disable-next-line es/no-array-from -- required for testing\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.es/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar arraySlice = require('../internals/array-slice-simple');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar fails = require('../internals/fails');\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\nvar MAX_UINT32 = 0xFFFFFFFF;\nvar min = Math.min;\nvar $push = [].push;\nvar exec = uncurryThis(/./.exec);\nvar push = uncurryThis($push);\nvar stringSlice = uncurryThis(''.slice);\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = toString(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return call(nativeSplit, string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = call(regexpExec, separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n push(output, stringSlice(string, lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) apply($push, output, arraySlice(match, 1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !exec(separatorCopy, '')) push(output, '');\n } else push(output, stringSlice(string, lastLastIndex));\n return output.length > lim ? arraySlice(output, 0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT);\n return splitter\n ? call(splitter, separator, O, limit)\n : call(internalSplit, toString(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (string, limit) {\n var rx = anObject(this);\n var S = toString(string);\n var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\n\n if (res.done) return res.value;\n\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (UNSUPPORTED_Y ? 'g' : 'y');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\n var z = callRegExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n push(A, stringSlice(S, p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n push(A, z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n push(A, stringSlice(S, p));\n return A;\n }\n ];\n}, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar $toString = require('../internals/to-string');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arraySort = require('../internals/array-sort');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar n$Fetch = getBuiltIn('fetch');\nvar N$Request = getBuiltIn('Request');\nvar Headers = getBuiltIn('Headers');\nvar RequestPrototype = N$Request && N$Request.prototype;\nvar HeadersPrototype = Headers && Headers.prototype;\nvar RegExp = global.RegExp;\nvar TypeError = global.TypeError;\nvar decodeURIComponent = global.decodeURIComponent;\nvar encodeURIComponent = global.encodeURIComponent;\nvar charAt = uncurryThis(''.charAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar splice = uncurryThis([].splice);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = replace(it, plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = replace(result, percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replacements = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replacements[match];\n};\n\nvar serialize = function (it) {\n return replace(encodeURIComponent(it), find, replacer);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n}, true);\n\nvar URLSearchParamsState = function (init) {\n this.entries = [];\n this.url = null;\n\n if (init !== undefined) {\n if (isObject(init)) this.parseObject(init);\n else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init));\n }\n};\n\nURLSearchParamsState.prototype = {\n type: URL_SEARCH_PARAMS,\n bindURL: function (url) {\n this.url = url;\n this.update();\n },\n parseObject: function (object) {\n var iteratorMethod = getIteratorMethod(object);\n var iterator, next, step, entryIterator, entryNext, first, second;\n\n if (iteratorMethod) {\n iterator = getIterator(object, iteratorMethod);\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = call(entryNext, entryIterator)).done ||\n (second = call(entryNext, entryIterator)).done ||\n !call(entryNext, entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n push(this.entries, { key: $toString(first.value), value: $toString(second.value) });\n }\n } else for (var key in object) if (hasOwn(object, key)) {\n push(this.entries, { key: key, value: $toString(object[key]) });\n }\n },\n parseQuery: function (query) {\n if (query) {\n var attributes = split(query, '&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = split(attribute, '=');\n push(this.entries, {\n key: deserialize(shift(entry)),\n value: deserialize(join(entry, '='))\n });\n }\n }\n }\n },\n serialize: function () {\n var entries = this.entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n push(result, serialize(entry.key) + '=' + serialize(entry.value));\n } return join(result, '&');\n },\n update: function () {\n this.entries.length = 0;\n this.parseQuery(this.url.query);\n },\n updateURL: function () {\n if (this.url) this.url.update();\n }\n};\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsPrototype);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n setInternalState(this, new URLSearchParamsState(init));\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n push(state.entries, { key: $toString(name), value: $toString(value) });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = $toString(name);\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) splice(entries, index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = $toString(name);\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = $toString(name);\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) push(result, entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = $toString(name);\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = $toString(name);\n var val = $toString(value);\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) splice(entries, index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) push(entries, { key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n arraySort(state.entries, function (a, b) {\n return a.key > b.key ? 1 : -1;\n });\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n return getInternalParamsState(this).serialize();\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`\nif (!USE_NATIVE_URL && isCallable(Headers)) {\n var headersHas = uncurryThis(HeadersPrototype.has);\n var headersSet = uncurryThis(HeadersPrototype.set);\n\n var wrapRequestOptions = function (init) {\n if (isObject(init)) {\n var body = init.body;\n var headers;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headersHas(headers, 'content-type')) {\n headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n return create(init, {\n body: createPropertyDescriptor(0, $toString(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n } return init;\n };\n\n if (isCallable(n$Fetch)) {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n return n$Fetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n }\n });\n }\n\n if (isCallable(N$Request)) {\n var RequestConstructor = function Request(input /* , init */) {\n anInstance(this, RequestPrototype);\n return new N$Request(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n };\n\n RequestPrototype.constructor = RequestConstructor;\n RequestConstructor.prototype = RequestPrototype;\n\n $({ global: true, forced: true }, {\n Request: RequestConstructor\n });\n }\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has-own-property');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar arraySlice = require('../internals/array-slice-simple');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar $toString = require('../internals/to-string');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\n\nvar NativeURL = global.URL;\nvar TypeError = global.TypeError;\nvar parseInt = global.parseInt;\nvar floor = Math.floor;\nvar pow = Math.pow;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(/./.exec);\nvar join = uncurryThis([].join);\nvar numberToString = uncurryThis(1.0.toString);\nvar pop = uncurryThis([].pop);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar toLowerCase = uncurryThis(''.toLowerCase);\nvar unshift = uncurryThis([].unshift);\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[a-z]/i;\n// eslint-disable-next-line regexp/no-obscure-range -- safe\nvar ALPHANUMERIC = /[\\d+-.a-z]/i;\nvar DIGIT = /\\d/;\nvar HEX_START = /^0x/i;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\da-f]+$/i;\n/* eslint-disable regexp/no-control-character -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/;\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u0020]+|[\\u0000-\\u0020]+$/g;\nvar TAB_AND_NEW_LINE = /[\\t\\n\\r]/g;\n/* eslint-enable regexp/no-control-character -- safe */\nvar EOF;\n\n// https://url.spec.whatwg.org/#ipv4-number-parser\nvar parseIPv4 = function (input) {\n var parts = split(input, '.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.length--;\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && charAt(part, 0) == '0') {\n radix = exec(HEX_START, part) ? 16 : 8;\n part = stringSlice(part, radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!exec(radix == 10 ? DEC : radix == 8 ? OCT : HEX, part)) return input;\n number = parseInt(part, radix);\n }\n push(numbers, number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = pop(numbers);\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// https://url.spec.whatwg.org/#concept-ipv6-parser\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var chr = function () {\n return charAt(input, pointer);\n };\n\n if (chr() == ':') {\n if (charAt(input, 1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (chr()) {\n if (pieceIndex == 8) return;\n if (chr() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && exec(HEX, chr())) {\n value = value * 16 + parseInt(chr(), 16);\n pointer++;\n length++;\n }\n if (chr() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (chr()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (chr() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!exec(DIGIT, chr())) return;\n while (exec(DIGIT, chr())) {\n number = parseInt(chr(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (chr() == ':') {\n pointer++;\n if (!chr()) return;\n } else if (chr()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\n// https://url.spec.whatwg.org/#host-serializing\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n unshift(result, host % 256);\n host = floor(host / 256);\n } return join(result, '.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += numberToString(host[index], 16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (chr, set) {\n var code = codeAt(chr, 0);\n return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);\n};\n\n// https://url.spec.whatwg.org/#special-scheme\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\n// https://url.spec.whatwg.org/#windows-drive-letter\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && exec(ALPHA, charAt(string, 0))\n && ((second = charAt(string, 1)) == ':' || (!normalized && second == '|'));\n};\n\n// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (\n string.length == 2 ||\n ((third = charAt(string, 2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\n// https://url.spec.whatwg.org/#single-dot-path-segment\nvar isSingleDot = function (segment) {\n return segment === '.' || toLowerCase(segment) === '%2e';\n};\n\n// https://url.spec.whatwg.org/#double-dot-path-segment\nvar isDoubleDot = function (segment) {\n segment = toLowerCase(segment);\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\nvar URLState = function (url, isBase, base) {\n var urlString = $toString(url);\n var baseState, failure, searchParams;\n if (isBase) {\n failure = this.parse(urlString);\n if (failure) throw TypeError(failure);\n this.searchParams = null;\n } else {\n if (base !== undefined) baseState = new URLState(base, true);\n failure = this.parse(urlString, null, baseState);\n if (failure) throw TypeError(failure);\n searchParams = getInternalSearchParamsState(new URLSearchParams());\n searchParams.bindURL(this);\n this.searchParams = searchParams;\n }\n};\n\nURLState.prototype = {\n type: 'URL',\n // https://url.spec.whatwg.org/#url-parsing\n // eslint-disable-next-line max-statements -- TODO\n parse: function (input, stateOverride, base) {\n var url = this;\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, chr, bufferCodePoints, failure;\n\n input = $toString(input);\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = replace(input, TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n chr = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (chr && exec(ALPHA, chr)) {\n buffer += toLowerCase(chr);\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) {\n buffer += toLowerCase(chr);\n } else if (chr == ':') {\n if (stateOverride && (\n (url.isSpecial() != hasOwn(specialSchemes, buffer)) ||\n (buffer == 'file' && (url.includesCredentials() || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (url.isSpecial() && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (url.isSpecial() && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (url.isSpecial()) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n push(url.path, '');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && chr == '#') {\n url.scheme = base.scheme;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (chr == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (chr == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (chr == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n } else if (chr == '/' || (chr == '\\\\' && url.isSpecial())) {\n state = RELATIVE_SLASH;\n } else if (chr == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n } else if (chr == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.path.length--;\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (url.isSpecial() && (chr == '/' || chr == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (chr == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (chr != '/' && chr != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (chr == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n chr == EOF || chr == '/' || chr == '?' || chr == '#' ||\n (chr == '\\\\' && url.isSpecial())\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += chr;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (chr == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n chr == EOF || chr == '/' || chr == '?' || chr == '#' ||\n (chr == '\\\\' && url.isSpecial())\n ) {\n if (url.isSpecial() && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (url.includesCredentials() || url.port !== null)) return;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (chr == '[') seenBracket = true;\n else if (chr == ']') seenBracket = false;\n buffer += chr;\n } break;\n\n case PORT:\n if (exec(DIGIT, chr)) {\n buffer += chr;\n } else if (\n chr == EOF || chr == '/' || chr == '?' || chr == '#' ||\n (chr == '\\\\' && url.isSpecial()) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (chr == '/' || chr == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (chr == EOF) {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n } else if (chr == '?') {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n } else if (chr == '#') {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.shortenPath();\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (chr == '/' || chr == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (chr == EOF || chr == '/' || chr == '\\\\' || chr == '?' || chr == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = url.parseHost(buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += chr;\n break;\n\n case PATH_START:\n if (url.isSpecial()) {\n state = PATH;\n if (chr != '/' && chr != '\\\\') continue;\n } else if (!stateOverride && chr == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && chr == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr != EOF) {\n state = PATH;\n if (chr != '/') continue;\n } break;\n\n case PATH:\n if (\n chr == EOF || chr == '/' ||\n (chr == '\\\\' && url.isSpecial()) ||\n (!stateOverride && (chr == '?' || chr == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n url.shortenPath();\n if (chr != '/' && !(chr == '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else if (isSingleDot(buffer)) {\n if (chr != '/' && !(chr == '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter\n }\n push(url.path, buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n shift(url.path);\n }\n }\n if (chr == '?') {\n url.query = '';\n state = QUERY;\n } else if (chr == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(chr, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (chr == '?') {\n url.query = '';\n state = QUERY;\n } else if (chr == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr != EOF) {\n url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && chr == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr != EOF) {\n if (chr == \"'\" && url.isSpecial()) url.query += '%27';\n else if (chr == '#') url.query += '%23';\n else url.query += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n },\n // https://url.spec.whatwg.org/#host-parsing\n parseHost: function (input) {\n var result, codePoints, index;\n if (charAt(input, 0) == '[') {\n if (charAt(input, input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(stringSlice(input, 1, -1));\n if (!result) return INVALID_HOST;\n this.host = result;\n // opaque host\n } else if (!this.isSpecial()) {\n if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n this.host = result;\n } else {\n input = toASCII(input);\n if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n this.host = result;\n }\n },\n // https://url.spec.whatwg.org/#cannot-have-a-username-password-port\n cannotHaveUsernamePasswordPort: function () {\n return !this.host || this.cannotBeABaseURL || this.scheme == 'file';\n },\n // https://url.spec.whatwg.org/#include-credentials\n includesCredentials: function () {\n return this.username != '' || this.password != '';\n },\n // https://url.spec.whatwg.org/#is-special\n isSpecial: function () {\n return hasOwn(specialSchemes, this.scheme);\n },\n // https://url.spec.whatwg.org/#shorten-a-urls-path\n shortenPath: function () {\n var path = this.path;\n var pathSize = path.length;\n if (pathSize && (this.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.length--;\n }\n },\n // https://url.spec.whatwg.org/#concept-url-serializer\n serialize: function () {\n var url = this;\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (url.includesCredentials()) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n },\n // https://url.spec.whatwg.org/#dom-url-href\n setHref: function (href) {\n var failure = this.parse(href);\n if (failure) throw TypeError(failure);\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-origin\n getOrigin: function () {\n var scheme = this.scheme;\n var port = this.port;\n if (scheme == 'blob') try {\n return new URLConstructor(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !this.isSpecial()) return 'null';\n return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');\n },\n // https://url.spec.whatwg.org/#dom-url-protocol\n getProtocol: function () {\n return this.scheme + ':';\n },\n setProtocol: function (protocol) {\n this.parse($toString(protocol) + ':', SCHEME_START);\n },\n // https://url.spec.whatwg.org/#dom-url-username\n getUsername: function () {\n return this.username;\n },\n setUsername: function (username) {\n var codePoints = arrayFrom($toString(username));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-password\n getPassword: function () {\n return this.password;\n },\n setPassword: function (password) {\n var codePoints = arrayFrom($toString(password));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-host\n getHost: function () {\n var host = this.host;\n var port = this.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n },\n setHost: function (host) {\n if (this.cannotBeABaseURL) return;\n this.parse(host, HOST);\n },\n // https://url.spec.whatwg.org/#dom-url-hostname\n getHostname: function () {\n var host = this.host;\n return host === null ? '' : serializeHost(host);\n },\n setHostname: function (hostname) {\n if (this.cannotBeABaseURL) return;\n this.parse(hostname, HOSTNAME);\n },\n // https://url.spec.whatwg.org/#dom-url-port\n getPort: function () {\n var port = this.port;\n return port === null ? '' : $toString(port);\n },\n setPort: function (port) {\n if (this.cannotHaveUsernamePasswordPort()) return;\n port = $toString(port);\n if (port == '') this.port = null;\n else this.parse(port, PORT);\n },\n // https://url.spec.whatwg.org/#dom-url-pathname\n getPathname: function () {\n var path = this.path;\n return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n },\n setPathname: function (pathname) {\n if (this.cannotBeABaseURL) return;\n this.path = [];\n this.parse(pathname, PATH_START);\n },\n // https://url.spec.whatwg.org/#dom-url-search\n getSearch: function () {\n var query = this.query;\n return query ? '?' + query : '';\n },\n setSearch: function (search) {\n search = $toString(search);\n if (search == '') {\n this.query = null;\n } else {\n if ('?' == charAt(search, 0)) search = stringSlice(search, 1);\n this.query = '';\n this.parse(search, QUERY);\n }\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-searchparams\n getSearchParams: function () {\n return this.searchParams.facade;\n },\n // https://url.spec.whatwg.org/#dom-url-hash\n getHash: function () {\n var fragment = this.fragment;\n return fragment ? '#' + fragment : '';\n },\n setHash: function (hash) {\n hash = $toString(hash);\n if (hash == '') {\n this.fragment = null;\n return;\n }\n if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1);\n this.fragment = '';\n this.parse(hash, FRAGMENT);\n },\n update: function () {\n this.query = this.searchParams.serialize() || null;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLPrototype);\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var state = setInternalState(that, new URLState(url, false, base));\n if (!DESCRIPTORS) {\n that.href = state.serialize();\n that.origin = state.getOrigin();\n that.protocol = state.getProtocol();\n that.username = state.getUsername();\n that.password = state.getPassword();\n that.host = state.getHost();\n that.hostname = state.getHostname();\n that.port = state.getPort();\n that.pathname = state.getPathname();\n that.search = state.getSearch();\n that.searchParams = state.getSearchParams();\n that.hash = state.getHash();\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar accessorDescriptor = function (getter, setter) {\n return {\n get: function () {\n return getInternalURLState(this)[getter]();\n },\n set: setter && function (value) {\n return getInternalURLState(this)[setter](value);\n },\n configurable: true,\n enumerable: true\n };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor('serialize', 'setHref'),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor('getOrigin'),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor('getProtocol', 'setProtocol'),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor('getUsername', 'setUsername'),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor('getPassword', 'setPassword'),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor('getHost', 'setHost'),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor('getHostname', 'setHostname'),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor('getPort', 'setPort'),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor('getPathname', 'setPathname'),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor('getSearch', 'setSearch'),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor('getSearchParams'),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor('getHash', 'setHash')\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","/*!\n * jQuery Mousewheel 3.1.13\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n */\n\n(function (factory) {\n if ( typeof define === 'function' && define.amd ) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } else if (typeof exports === 'object') {\n // Node/CommonJS style for Browserify\n module.exports = factory;\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function ($) {\n\n var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n slice = Array.prototype.slice,\n nullLowestDeltaTimeout, lowestDelta;\n\n if ( $.event.fixHooks ) {\n for ( var i = toFix.length; i; ) {\n $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n }\n }\n\n var special = $.event.special.mousewheel = {\n version: '3.1.12',\n\n setup: function() {\n if ( this.addEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.addEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = handler;\n }\n // Store the line height and page height for this particular element\n $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n },\n\n teardown: function() {\n if ( this.removeEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.removeEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = null;\n }\n // Clean up the data we added to the element\n $.removeData(this, 'mousewheel-line-height');\n $.removeData(this, 'mousewheel-page-height');\n },\n\n getLineHeight: function(elem) {\n var $elem = $(elem),\n $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();\n if (!$parent.length) {\n $parent = $('body');\n }\n return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;\n },\n\n getPageHeight: function(elem) {\n return $(elem).height();\n },\n\n settings: {\n adjustOldDeltas: true, // see shouldAdjustOldDeltas() below\n normalizeOffset: true // calls getBoundingClientRect for each event\n }\n };\n\n $.fn.extend({\n mousewheel: function(fn) {\n return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n },\n\n unmousewheel: function(fn) {\n return this.unbind('mousewheel', fn);\n }\n });\n\n\n function handler(event) {\n var orgEvent = event || window.event,\n args = slice.call(arguments, 1),\n delta = 0,\n deltaX = 0,\n deltaY = 0,\n absDelta = 0,\n offsetX = 0,\n offsetY = 0;\n event = $.event.fix(orgEvent);\n event.type = 'mousewheel';\n\n // Old school scrollwheel delta\n if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }\n if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }\n if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }\n if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n deltaX = deltaY * -1;\n deltaY = 0;\n }\n\n // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n delta = deltaY === 0 ? deltaX : deltaY;\n\n // New school wheel delta (wheel event)\n if ( 'deltaY' in orgEvent ) {\n deltaY = orgEvent.deltaY * -1;\n delta = deltaY;\n }\n if ( 'deltaX' in orgEvent ) {\n deltaX = orgEvent.deltaX;\n if ( deltaY === 0 ) { delta = deltaX * -1; }\n }\n\n // No change actually happened, no reason to go any further\n if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n // Need to convert lines and pages to pixels if we aren't already in pixels\n // There are three delta modes:\n // * deltaMode 0 is by pixels, nothing to do\n // * deltaMode 1 is by lines\n // * deltaMode 2 is by pages\n if ( orgEvent.deltaMode === 1 ) {\n var lineHeight = $.data(this, 'mousewheel-line-height');\n delta *= lineHeight;\n deltaY *= lineHeight;\n deltaX *= lineHeight;\n } else if ( orgEvent.deltaMode === 2 ) {\n var pageHeight = $.data(this, 'mousewheel-page-height');\n delta *= pageHeight;\n deltaY *= pageHeight;\n deltaX *= pageHeight;\n }\n\n // Store lowest absolute delta to normalize the delta values\n absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n if ( !lowestDelta || absDelta < lowestDelta ) {\n lowestDelta = absDelta;\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n lowestDelta /= 40;\n }\n }\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n // Divide all the things by 40!\n delta /= 40;\n deltaX /= 40;\n deltaY /= 40;\n }\n\n // Get a whole, normalized value for the deltas\n delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);\n deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n // Normalise offsetX and offsetY properties\n if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {\n var boundingRect = this.getBoundingClientRect();\n offsetX = event.clientX - boundingRect.left;\n offsetY = event.clientY - boundingRect.top;\n }\n\n // Add information to the event object\n event.deltaX = deltaX;\n event.deltaY = deltaY;\n event.deltaFactor = lowestDelta;\n event.offsetX = offsetX;\n event.offsetY = offsetY;\n // Go ahead and set deltaMode to 0 since we converted to pixels\n // Although this is a little odd since we overwrite the deltaX/Y\n // properties with normalized deltas.\n event.deltaMode = 0;\n\n // Add event and delta to the front of the arguments\n args.unshift(event, delta, deltaX, deltaY);\n\n // Clearout lowestDelta after sometime to better\n // handle multiple device types that give different\n // a different lowestDelta\n // Ex: trackpad = 3 and mouse wheel = 120\n if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n return ($.event.dispatch || $.event.handle).apply(this, args);\n }\n\n function nullLowestDelta() {\n lowestDelta = null;\n }\n\n function shouldAdjustOldDeltas(orgEvent, absDelta) {\n // If this is an older event and the delta is divisable by 120,\n // then we are assuming that the browser is treating this as an\n // older mouse wheel event and that we should divide the deltas\n // by 40 to try and get a more usable deltaFactor.\n // Side note, this actually impacts the reported scroll distance\n // in older browsers and can cause scrolling to be slower than native.\n // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n }\n\n}));\n","/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-03-02T17:08Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/*global define:false */\n/**\n * Copyright 2012-2017 Craig Campbell\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.6.5\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n // Check if mousetrap is used inside browser, if not, return\n if (!window) {\n return;\n }\n\n /**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\n var _MAP = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 224: 'meta'\n };\n\n /**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\n var _KEYCODE_MAP = {\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111 : '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: '\\''\n };\n\n /**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\n var _SHIFT_MAP = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\\\"': '\\'',\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n };\n\n /**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\n var _SPECIAL_ALIASES = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'plus': '+',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n };\n\n /**\n * variable to store the flipped version of _MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\n var _REVERSE_MAP;\n\n /**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\n for (var i = 1; i < 20; ++i) {\n _MAP[111 + i] = 'f' + i;\n }\n\n /**\n * loop through to map numbers on the numeric keypad\n */\n for (i = 0; i <= 9; ++i) {\n\n // This needs to use a string cause otherwise since 0 is falsey\n // mousetrap will never fire for numpad 0 pressed as part of a keydown\n // event.\n //\n // @see https://github.com/ccampbell/mousetrap/pull/258\n _MAP[i + 96] = i.toString();\n }\n\n /**\n * cross browser add event method\n *\n * @param {Element|HTMLDocument} object\n * @param {string} type\n * @param {Function} callback\n * @returns void\n */\n function _addEvent(object, type, callback) {\n if (object.addEventListener) {\n object.addEventListener(type, callback, false);\n return;\n }\n\n object.attachEvent('on' + type, callback);\n }\n\n /**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\n function _characterFromEvent(e) {\n\n // for keypress events we should return the character as is\n if (e.type == 'keypress') {\n var character = String.fromCharCode(e.which);\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase();\n }\n\n return character;\n }\n\n // for non keypress events the special maps are needed\n if (_MAP[e.which]) {\n return _MAP[e.which];\n }\n\n if (_KEYCODE_MAP[e.which]) {\n return _KEYCODE_MAP[e.which];\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase();\n }\n\n /**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\n function _modifiersMatch(modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n }\n\n /**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\n function _eventModifiers(e) {\n var modifiers = [];\n\n if (e.shiftKey) {\n modifiers.push('shift');\n }\n\n if (e.altKey) {\n modifiers.push('alt');\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl');\n }\n\n if (e.metaKey) {\n modifiers.push('meta');\n }\n\n return modifiers;\n }\n\n /**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _preventDefault(e) {\n if (e.preventDefault) {\n e.preventDefault();\n return;\n }\n\n e.returnValue = false;\n }\n\n /**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _stopPropagation(e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n return;\n }\n\n e.cancelBubble = true;\n }\n\n /**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\n function _isModifier(key) {\n return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n }\n\n /**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\n function _getReverseMap() {\n if (!_REVERSE_MAP) {\n _REVERSE_MAP = {};\n for (var key in _MAP) {\n\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue;\n }\n\n if (_MAP.hasOwnProperty(key)) {\n _REVERSE_MAP[_MAP[key]] = key;\n }\n }\n }\n return _REVERSE_MAP;\n }\n\n /**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\n function _pickBestAction(key, modifiers, action) {\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action == 'keypress' && modifiers.length) {\n action = 'keydown';\n }\n\n return action;\n }\n\n /**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\n function _keysFromString(combination) {\n if (combination === '+') {\n return ['+'];\n }\n\n combination = combination.replace(/\\+{2}/g, '+plus');\n return combination.split('+');\n }\n\n /**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\n function _getKeyInfo(combination, action) {\n var keys;\n var key;\n var i;\n var modifiers = [];\n\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = _keysFromString(combination);\n\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n\n // normalize key names\n if (_SPECIAL_ALIASES[key]) {\n key = _SPECIAL_ALIASES[key];\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n key = _SHIFT_MAP[key];\n modifiers.push('shift');\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (_isModifier(key)) {\n modifiers.push(key);\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = _pickBestAction(key, modifiers, action);\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n };\n }\n\n function _belongsTo(element, ancestor) {\n if (element === null || element === document) {\n return false;\n }\n\n if (element === ancestor) {\n return true;\n }\n\n return _belongsTo(element.parentNode, ancestor);\n }\n\n function Mousetrap(targetElement) {\n var self = this;\n\n targetElement = targetElement || document;\n\n if (!(self instanceof Mousetrap)) {\n return new Mousetrap(targetElement);\n }\n\n /**\n * element to attach key events to\n *\n * @type {Element}\n */\n self.target = targetElement;\n\n /**\n * a list of all the callbacks setup via Mousetrap.bind()\n *\n * @type {Object}\n */\n self._callbacks = {};\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self._directMap = {};\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n var _sequenceLevels = {};\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n var _resetTimer;\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n var _ignoreNextKeyup = false;\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n var _ignoreNextKeypress = false;\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n var _nextExpectedAction = false;\n\n /**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\n function _resetSequences(doNotReset) {\n doNotReset = doNotReset || {};\n\n var activeSequences = false,\n key;\n\n for (key in _sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true;\n continue;\n }\n _sequenceLevels[key] = 0;\n }\n\n if (!activeSequences) {\n _nextExpectedAction = false;\n }\n }\n\n /**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\n function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n var i;\n var callback;\n var matches = [];\n var action = e.type;\n\n // if there are no events related to this keycode\n if (!self._callbacks[character]) {\n return [];\n }\n\n // if a modifier key is coming up on its own we should allow it\n if (action == 'keyup' && _isModifier(character)) {\n modifiers = [character];\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (i = 0; i < self._callbacks[character].length; ++i) {\n callback = self._callbacks[character][i];\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n continue;\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action != callback.action) {\n continue;\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo == combination;\n var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n if (deleteCombo || deleteSequence) {\n self._callbacks[character].splice(i, 1);\n }\n\n matches.push(callback);\n }\n }\n\n return matches;\n }\n\n /**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\n function _fireCallback(callback, e, combo, sequence) {\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return;\n }\n\n if (callback(e, combo) === false) {\n _preventDefault(e);\n _stopPropagation(e);\n }\n }\n\n /**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\n self._handleKey = function(character, modifiers, e) {\n var callbacks = _getMatches(character, modifiers, e);\n var i;\n var doNotReset = {};\n var maxLevel = 0;\n var processedSequenceCallback = false;\n\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (i = 0; i < callbacks.length; ++i) {\n if (callbacks[i].seq) {\n maxLevel = Math.max(maxLevel, callbacks[i].level);\n }\n }\n\n // loop through matching callbacks for this key event\n for (i = 0; i < callbacks.length; ++i) {\n\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[i].seq) {\n\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the _resetSequences call\n if (callbacks[i].level != maxLevel) {\n continue;\n }\n\n processedSequenceCallback = true;\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[i].seq] = 1;\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n continue;\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n _resetSequences(doNotReset);\n }\n\n _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n };\n\n /**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\n function _handleKeyEvent(e) {\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode;\n }\n\n var character = _characterFromEvent(e);\n\n // no character found then stop\n if (!character) {\n return;\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n _ignoreNextKeyup = false;\n return;\n }\n\n self.handleKey(character, _eventModifiers(e), e);\n }\n\n /**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\n function _resetSequenceTimer() {\n clearTimeout(_resetTimer);\n _resetTimer = setTimeout(_resetSequences, 1000);\n }\n\n /**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\n function _bindSequence(combo, keys, callback, action) {\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n _sequenceLevels[combo] = 0;\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function _increaseSequence(nextAction) {\n return function() {\n _nextExpectedAction = nextAction;\n ++_sequenceLevels[combo];\n _resetSequenceTimer();\n };\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function _callbackAndReset(e) {\n _fireCallback(callback, e, combo);\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n _ignoreNextKeyup = _characterFromEvent(e);\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(_resetSequences, 10);\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var i = 0; i < keys.length; ++i) {\n var isFinal = i + 1 === keys.length;\n var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n _bindSingle(keys[i], wrappedCallback, action, combo, i);\n }\n }\n\n /**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\n function _bindSingle(combination, callback, action, sequenceName, level) {\n\n // store a direct mapped reference for use with Mousetrap.trigger\n self._directMap[combination + ':' + action] = callback;\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ');\n\n var sequence = combination.split(' ');\n var info;\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n _bindSequence(combination, sequence, callback, action);\n return;\n }\n\n info = _getKeyInfo(combination, action);\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n // remove an existing match if there is one\n _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n });\n }\n\n /**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\n self._bindMultiple = function(combinations, callback, action) {\n for (var i = 0; i < combinations.length; ++i) {\n _bindSingle(combinations[i], callback, action);\n }\n };\n\n // start!\n _addEvent(targetElement, 'keypress', _handleKeyEvent);\n _addEvent(targetElement, 'keydown', _handleKeyEvent);\n _addEvent(targetElement, 'keyup', _handleKeyEvent);\n }\n\n /**\n * binds an event to mousetrap\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n * @returns void\n */\n Mousetrap.prototype.bind = function(keys, callback, action) {\n var self = this;\n keys = keys instanceof Array ? keys : [keys];\n self._bindMultiple.call(self, keys, callback, action);\n return self;\n };\n\n /**\n * unbinds an event to mousetrap\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * _directMap dict.\n *\n * TODO: actually remove this from the _callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\n Mousetrap.prototype.unbind = function(keys, action) {\n var self = this;\n return self.bind.call(self, keys, function() {}, action);\n };\n\n /**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\n Mousetrap.prototype.trigger = function(keys, action) {\n var self = this;\n if (self._directMap[keys + ':' + action]) {\n self._directMap[keys + ':' + action]({}, keys);\n }\n return self;\n };\n\n /**\n * resets the library back to its initial state. this is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\n Mousetrap.prototype.reset = function() {\n var self = this;\n self._callbacks = {};\n self._directMap = {};\n return self;\n };\n\n /**\n * should we stop this event before firing off callbacks\n *\n * @param {Event} e\n * @param {Element} element\n * @return {boolean}\n */\n Mousetrap.prototype.stopCallback = function(e, element) {\n var self = this;\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n if (_belongsTo(element, self.target)) {\n return false;\n }\n\n // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,\n // not the initial event target in the shadow tree. Note that not all events cross the\n // shadow boundary.\n // For shadow trees with `mode: 'open'`, the initial event target is the first element in\n // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event\n // target cannot be obtained.\n if ('composedPath' in e && typeof e.composedPath === 'function') {\n // For open shadow trees, update `element` so that the following check works.\n var initialEventTarget = e.composedPath()[0];\n if (initialEventTarget !== e.target) {\n element = initialEventTarget;\n }\n }\n\n // stop for input, select, and textarea\n return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n };\n\n /**\n * exposes _handleKey publicly so it can be overwritten by extensions\n */\n Mousetrap.prototype.handleKey = function() {\n var self = this;\n return self._handleKey.apply(self, arguments);\n };\n\n /**\n * allow custom key mappings\n */\n Mousetrap.addKeycodes = function(object) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n _MAP[key] = object[key];\n }\n }\n _REVERSE_MAP = null;\n };\n\n /**\n * Init the global mousetrap functions\n *\n * This method is needed to allow the global mousetrap functions to work\n * now that mousetrap is a constructor function.\n */\n Mousetrap.init = function() {\n var documentMousetrap = Mousetrap(document);\n for (var method in documentMousetrap) {\n if (method.charAt(0) !== '_') {\n Mousetrap[method] = (function(method) {\n return function() {\n return documentMousetrap[method].apply(documentMousetrap, arguments);\n };\n } (method));\n }\n }\n };\n\n Mousetrap.init();\n\n // expose mousetrap to the global object\n window.Mousetrap = Mousetrap;\n\n // expose as a common js module\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = Mousetrap;\n }\n\n // expose mousetrap as an AMD module\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Mousetrap;\n });\n }\n}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);\n","<template>\r\n <template v-if=\"isShowNoDataPage\">\r\n <el-empty description=\"似乎还没有同步过文档\" >\r\n <el-button type=\"primary\" icon='refresh' round size='large' @click=\"onSyncProjectDocument\" :loading=\"loadings.handleSync\">同步</el-button>\r\n </el-empty>\r\n </template>\r\n <template v-else-if=\"isShowLoadingPage\">\r\n <el-skeleton v-loading=\"!loadings.init\" :rows=\"12\" />\r\n </template>\r\n <template v-else>\r\n <el-container >\r\n <el-aside>\r\n <el-space direction=\"vertical\" :size=\"26\" alignment=\"left\" class=\"doc-toc-aside\">\r\n <el-switch \r\n v-model=\"tocData.isMultiSelectionMode\" \r\n active-text=\"多选模式\" \r\n inactive-text=\"单选模式\" \r\n @change=\"onMultiSelectionModeChange\"\r\n :loading=\"loadings.multiSelectionModeChanging\"/>\r\n \r\n <el-tree \r\n ref=\"treeRef\"\r\n :data=\"tocData.value\" \r\n :default-checked-keys=\"tocData.checkedNodes\"\r\n :show-checkbox=\"tocData.isMultiSelectionMode\"\r\n node-key=\"id\" \r\n highlight-current\r\n :props=\"tocData.treeProps\"\r\n @node-click=\"onTocNodeClick\" \r\n @check-change=\"onTocNodeCheckChange\" \r\n >\r\n <template #default=\"{ node }\">\r\n <span class=\"span-ellipsis\" >\r\n <el-tooltip :content='node.comment ? node.label + \"(\"+node.comment+\")\":node.label' effect=\"light\">\r\n <span>{{ node.label }}</span>\r\n </el-tooltip>\r\n </span>\r\n </template>\r\n </el-tree>\r\n\r\n </el-space>\r\n </el-aside>\r\n <el-container>\r\n <el-header>\r\n <div>\r\n <el-space :size=\"28\" style=\"margin-bottom: 33px;\">\r\n <el-button \r\n v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+projectData.groupId, 'GROUP_MEMBER?groupId='+projectData.groupId]\"\r\n type=\"success\" \r\n style=\"width:100%\" \r\n icon=\"Refresh\" \r\n @click=\"onSyncProjectDocument\" \r\n :loading=\"loadings.handleSync\">\r\n 同步\r\n </el-button>\r\n <el-button \r\n v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+projectData.groupId, 'GROUP_MEMBER?groupId='+projectData.groupId]\"\r\n type=\"primary\" \r\n style=\"width:100%\" \r\n icon=\"Download\"\r\n @click=\"onDocumentExport()\" \r\n :loading=\"loadings.export\">\r\n 导出\r\n </el-button>\r\n <el-select @change=\"onProjectDocumentVersionChange\" v-model=\"projectData.documentFilter.version\" placeholder=\"历史版本\" v-select-more=\"loadMoreDocumentVersions\" v-loading=\"loadings.loadingVersions\" clearable>\r\n <el-option\r\n v-for=\"item in versionData.versions\"\r\n :key=\"item.version\"\r\n :label=\"'['+item.createAt +']->'+item.version+''\"\r\n :value=\"item.version\"\r\n >\r\n </el-option>\r\n </el-select>\r\n </el-space>\r\n </div>\r\n </el-header>\r\n <el-main>\r\n <el-tabs model-value=\"tableDocument\">\r\n <!-- multi list documentation -->\r\n <el-tab-pane label=\"列表\" name=\"tableDocument\">\r\n <DocumentList \r\n :tablesData=\"documentData.tables\"\r\n :overviewData=\"documentData.overview\"\r\n @onRemark=\"showRemarkDrawer\"/>\r\n </el-tab-pane>\r\n\r\n <!-- model UML -->\r\n <el-tab-pane label=\"UML\" name=\"umlPanel\" style=\"width: 100%;\" :lazy=\"true\">\r\n <el-row>\r\n <el-col :span=\"5\">\r\n <el-switch v-model=\"umlData.showComment\" active-text=\"显示注释\" inactive-text=\"隐藏注释\"/>\r\n </el-col>\r\n </el-row>\r\n <diagram :model-data=\"umlData.tables\" :show-comment=\"umlData.showComment\"></diagram>\r\n </el-tab-pane>\r\n </el-tabs>\r\n\r\n <!-- table / column remark -->\r\n <document-remark \r\n :groupId=\"documentRemarkData.groupId\" \r\n :projectId=\"documentRemarkData.projectId\" \r\n :tableName=\"documentRemarkData.tableName\" \r\n :columnName=\"documentRemarkData.columnName\" \r\n :isShowDrawer=\"documentRemarkData.isShowDrawer\"\r\n @onClose=\"documentRemarkData.isShowDrawer = false\"\r\n />\r\n </el-main>\r\n </el-container>\r\n </el-container>\r\n </template>\r\n</template>\r\n\r\n<style>\r\n\r\n.span-ellipsis {\r\n width: 100%;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 14px;\r\n flex: 1;\r\n display: flex;\r\n align-items: left;\r\n justify-content: space-between;\r\n font-size: 14px;\r\n} \r\n\r\n.doc-toc-aside {\r\n overflow-wrap: break-word;\r\n text-overflow: ellipsis;\r\n bottom: 0px;\r\n top: 100px;\r\n position: fixed;\r\n overflow-y: hidden;\r\n overflow-x: hidden;\r\n max-width: var(--el-aside-width);\r\n width: var(--el-aside-width);\r\n border-width: 0px 1px 0px 0px;\r\n border-color: #ddd;\r\n border-style: solid;\r\n}\r\n\r\n.doc-toc-aside:hover {\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n}\r\n</style>\r\n\r\n<script>\r\nimport { reactive, computed, ref } from 'vue'\r\nimport { useRoute } from 'vue-router'\r\nimport { getSimpleOneByProjectId, syncByProjectId, getVersionByProjectId, exportDocument, getTables } from '@/api/Document'\r\nimport { ElMessage } from 'element-plus'\r\nimport Diagram from '../components/document/Diagram.vue'\r\nimport DocumentRemark from '../components/document/DocumentRemark.vue'\r\nimport DocumentList from '../components/document/DocumentList.vue'\r\n\r\nexport default {\r\n components: {\r\n Diagram,\r\n DocumentRemark,\r\n DocumentList\r\n },\r\n setup() {\r\n const route = useRoute()\r\n\r\n // loading state\r\n const loadings = reactive({\r\n handleSync: false,\r\n loadingVersions: false,\r\n export: false,\r\n init: false,\r\n multiSelectionModeChanging: false,\r\n })\r\n // project data\r\n const projectData = reactive ({\r\n simpleDocumentData: null,\r\n documentFilter: {\r\n version: null\r\n },\r\n projectId: route.params.projectId,\r\n groupId: route.params.groupId,\r\n })\r\n // version data\r\n const versionData = reactive({\r\n pageFilter: {\r\n page: 0,\r\n size: 10\r\n },\r\n totalPage: 0,\r\n versions: []\r\n })\r\n // toc\r\n const tocData = reactive({\r\n value: [{id: -1, name: '概览'}],\r\n treeProps: {\r\n children: 'children',\r\n label: 'name',\r\n },\r\n checkedNodes: [],\r\n isMultiSelectionMode: false\r\n })\r\n // document component\r\n const documentData = reactive({\r\n tables: [],\r\n overview: {}\r\n })\r\n // uml component\r\n const umlData = reactive({\r\n showComment: false,\r\n tables: []\r\n })\r\n const treeRef = ref()\r\n\r\n const fetchDocumentTables = (tableIds, callback) => {\r\n let documentId = projectData.simpleDocumentData.id\r\n getTables(route.params.projectId, documentId, tableIds).then(resp => {\r\n if (!resp.errCode) {\r\n callback(resp.data)\r\n } else {\r\n messageNotify('warn', '加载数据异常,请稍后再试')\r\n }\r\n })\r\n }\r\n\r\n const onTocNodeClick = (node) => {\r\n if(tocData.isMultiSelectionMode) {\r\n if (node.id == -1) {\r\n scrollToElement('overview[-1]')\r\n } else {\r\n scrollToElement(node.name+'['+node.id+']')\r\n }\r\n return\r\n }\r\n\r\n if (node.id == -1) {\r\n documentData.overview = projectData.simpleDocumentData\r\n documentData.tables = []\r\n umlData.tables = []\r\n } else {\r\n fetchDocumentTables([node.id], data => {\r\n documentData.overview = null\r\n documentData.tables = data\r\n umlData.tables = data\r\n })\r\n }\r\n }\r\n\r\n const scrollToElement = (id) => {\r\n const ele = document.getElementById(id)\r\n if (ele) {\r\n var headerOffset = -100;\r\n var actualTop = ele.offsetTop;\r\n var current = ele.offsetParent;\r\n while (current !== null){\r\n actualTop += current.offsetTop;\r\n current = current.offsetParent;\r\n }\r\n window.scrollTo({\r\n top: actualTop + headerOffset,\r\n behavior: \"smooth\"\r\n })\r\n }\r\n }\r\n\r\n const onTocNodeCheckChange = () => {\r\n fetchDocumentTables(treeRef.value.getCheckedKeys(), data => {\r\n if (treeRef.value.getCheckedKeys().some(n => n== -1)) {\r\n documentData.overview = projectData.simpleDocumentData\r\n } else {\r\n documentData.overview = null\r\n }\r\n documentData.tables = data\r\n umlData.tables = data\r\n })\r\n }\r\n\r\n const onMultiSelectionModeChange = (val) => {\r\n loadings.multiSelectionModeChanging = true\r\n if (val) {\r\n onTocNodeCheckChange()\r\n } else {\r\n const curr = treeRef.value.getCurrentNode()\r\n if (curr == null) {\r\n onTocNodeClick({id: -1})\r\n } else {\r\n onTocNodeClick(curr)\r\n }\r\n }\r\n loadings.multiSelectionModeChanging = false\r\n }\r\n\r\n const initPageData = async () => {\r\n // init version data\r\n const versionResp = await getVersionByProjectId(route.params.projectId)\r\n versionData.versions = versionResp.data.content\r\n versionData.totalPage = versionResp.data.totalPages\r\n\r\n // get simple document\r\n const documentResp = await getSimpleOneByProjectId(route.params.projectId, projectData.documentFilter)\r\n if (documentResp.errCode) {\r\n messageNotify('error', '同步失败:'+documentResp.errMessage)\r\n } else if (documentResp.data) {\r\n // init project data\r\n projectData.simpleDocumentData = documentResp.data\r\n projectData.groupId = route.params.groupId\r\n projectData.projectId = route.params.projectId\r\n // init toc data\r\n tocData.value = documentResp.data.tables\r\n tocData.value.unshift({ id: -1, name: '概览'})\r\n tocData.checkedNodes = tocData.value.map(d => d.id)\r\n // init document data\r\n documentData.overview = documentResp.data\r\n documentData.tables = []\r\n } else {\r\n messageNotify('warn', '无可用数据')\r\n }\r\n loadings.init = true\r\n }\r\n initPageData()\r\n\r\n const isShowNoDataPage = computed(() => !projectData.simpleDocumentData && loadings.init)\r\n const isShowLoadingPage = computed(() => !projectData.simpleDocumentData && !loadings.init)\r\n const messageNotify = (type, msg) => {\r\n ElMessage({\r\n showClose: true,\r\n message: msg,\r\n type: type,\r\n duration: 3 * 1000\r\n });\r\n }\r\n\r\n const onProjectDocumentVersionChange = async () => {\r\n loadings.loadingVersions = true\r\n initPageData()\r\n messageNotify('success', '切换成功')\r\n loadings.loadingVersions = false\r\n }\r\n\r\n const onSyncProjectDocument = () => {\r\n const projectId = route.params.projectId\r\n loadings.handleSync = true\r\n syncByProjectId(projectId)\r\n .then(resp => {\r\n if (!resp.errCode) {\r\n initPageData()\r\n messageNotify('success', '同步成功')\r\n }\r\n loadings.handleSync = false\r\n })\r\n .catch(() => loadings.handleSync = false)\r\n }\r\n\r\n const onDocumentExport = () => {\r\n const projectId = route.params.projectId\r\n loadings.export = true\r\n exportDocument(projectId, {\r\n version: projectData.documentFilter.version\r\n }, projectData.simpleDocumentData.databaseName, () => loadings.export = false)\r\n }\r\n\r\n const loadMoreDocumentVersions = debounce(async () => {\r\n loadings.loadingVersions = true\r\n if (versionData.pageFilter.page + 1 < versionData.totalPage) {\r\n versionData.pageFilter.page++\r\n const versionResp = await getVersionByProjectId(route.params.projectId, versionData.pageFilter)\r\n versionData.totalPage = versionResp.data.totalPages\r\n if (versionResp.data.content.length > 0){\r\n versionResp.data.content.forEach(element => versionData.versions.push(element))\r\n }\r\n }\r\n loadings.loadingVersions = false\r\n }, 800)\r\n\r\n // 节流\r\n function debounce(fn, delay) {\r\n let timer = null\r\n return function () {\r\n let context = this\r\n let args = arguments\r\n if(timer) {\r\n clearTimeout(timer)\r\n }\r\n timer = setTimeout(function () {\r\n fn.apply(context, args)\r\n }, delay)\r\n }\r\n }\r\n\r\n // Document Remark\r\n const documentRemarkData = ref({\r\n tableName: null,\r\n columnName: null,\r\n groupId: null,\r\n projectId: null,\r\n isShowDrawer: false\r\n })\r\n\r\n const showRemarkDrawer = (tableName, columnName) => {\r\n documentRemarkData.value = {\r\n tableName: tableName,\r\n columnName: columnName,\r\n isShowDrawer: true,\r\n groupId: projectData.groupId,\r\n projectId: projectData.projectId\r\n }\r\n }\r\n\r\n return {\r\n tocData,\r\n documentData,\r\n projectData,\r\n versionData,\r\n umlData,\r\n loadings,\r\n isShowNoDataPage,\r\n isShowLoadingPage,\r\n treeRef,\r\n onTocNodeClick,\r\n onTocNodeCheckChange,\r\n onMultiSelectionModeChange,\r\n loadMoreDocumentVersions,\r\n onProjectDocumentVersionChange,\r\n onSyncProjectDocument,\r\n onDocumentExport,\r\n documentRemarkData,\r\n showRemarkDrawer,\r\n }\r\n }\r\n}\r\n\r\n</script>","import axios from '@/utils/fetch';\r\n\r\nconst base = '/api/v1.0'\r\n\r\nexport const getOneByProjectId = (projectId, parameters) => {\r\n return axios.get(base + '/projects/'+projectId+'/documents', {\r\n params: parameters\r\n })\r\n}\r\n\r\nexport const getTables = (projectId,documentId, tableIds) => {\r\n return axios.post(base + '/projects/'+projectId+'/documents/'+documentId+'/table_documents', tableIds)\r\n}\r\n\r\nexport const getSimpleOneByProjectId = (projectId, parameters) => {\r\n return axios.get(base + '/projects/'+projectId+'/documents/simple', {\r\n params: parameters\r\n })\r\n}\r\n\r\nexport const syncByProjectId = (projectId) => {\r\n return axios.post(base + \"/projects/\"+projectId+\"/documents\")\r\n}\r\n\r\nexport const getVersionByProjectId =(projectId, parameters) => {\r\n return axios.get(base + \"/projects/\"+projectId+\"/document_versions\", {\r\n params: parameters\r\n })\r\n}\r\n\r\nexport const exportDocument = (projectId, params, name, callback) => {\r\n return fileDownload(base + \"/projects/\"+projectId+\"/document_files\", params, name, callback)\r\n}\r\n\r\nfunction fileDownload(path, params, name, callback){\r\n axios.get(path, {\r\n responseType: 'blob', \r\n params: params\r\n }).then(response => {\r\n let urlObj = window.URL || window.webkitURL || window;\r\n const link = document.createElement('a');\r\n link.href = urlObj.createObjectURL(new Blob([response]));\r\n link.download = name +\".md\"; //or any other extension\r\n document.body.appendChild(link);\r\n link.click();\r\n callback()\r\n }).catch(() => callback())\r\n }\r\n","<template>\r\n <div id=\"diagram-container\" style=\"min-width: 100vw; min-height:100vh;\">\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { Graph, DataUri } from '@antv/x6'\r\nimport { formatter as databaseFieldFormatter } from '@/utils/DatabaseFieldFormatter'\r\n\r\nString.prototype.byteLength = function() {\r\n var length = 0;\r\n Array.from(this).map(function(char){\r\n if(char.charCodeAt(0)>255) {//字符编码大于255,说明是双字节字符\r\n length += 2;\r\n }else {\r\n length++;\r\n }\r\n });\r\n \r\n return length;\r\n}\r\n\r\nString.prototype.pxWidth = function() {\r\n var canvas = String.prototype.pxWidth.canvas || (String.prototype.pxWidth.canvas = document.createElement(\"canvas\")),\r\n context = canvas.getContext(\"2d\"); \r\n context.font = \"normal 12px ms\"\r\n var metrics = context.measureText(this);\r\n return metrics.width;\r\n}\r\n\r\nexport default {\r\n props: {\r\n modelData: Array,\r\n showComment: {\r\n default: true\r\n }\r\n },\r\n data() {\r\n return {\r\n graph: null\r\n }\r\n },\r\n watch: {\r\n 'showComment': {\r\n deep: true,\r\n handler() {\r\n this.graph.clearCells()\r\n this.redendarUml(this.graph)\r\n }\r\n },\r\n 'modelData': {\r\n handler() {\r\n this.graph.clearCells()\r\n this.redendarUml(this.graph)\r\n }\r\n }\r\n },\r\n mounted() {\r\n this.init()\r\n },\r\n methods: {\r\n init() {\r\n this.registerNewNode()\r\n const graph = this.createGraphInstance()\r\n this.redendarUml(graph)\r\n },\r\n\r\n exportUml() {\r\n this.graph.toPNG((dataUri) => {\r\n // 下载\r\n DataUri.downloadDataUri(dataUri, 'uml.png')\r\n })\r\n },\r\n\r\n redendarUml(graph) {\r\n const nodeData = this.modelData.map(data => {\r\n return {\r\n id: data.id,\r\n tableName: data.name,\r\n columns: data.columns\r\n }\r\n })\r\n\r\n let x = 20, y = 20, selectMaxRowHeight = 20\r\n nodeData.forEach((data, index) => {\r\n // 每张表的最长行长度\r\n let selectMaxRowWidth = data.tableName.pxWidth()\r\n let currentRowHeight = 30 * data.columns.length + 40\r\n selectMaxRowHeight = selectMaxRowHeight > currentRowHeight ? selectMaxRowHeight : currentRowHeight\r\n data.columns.forEach(column => {\r\n const columnType = databaseFieldFormatter.formatColumnType(column)\r\n const columnName = databaseFieldFormatter.formatColumnName(column, this.showComment)\r\n let distance = 80\r\n let width = distance + columnName.pxWidth() + columnType.pxWidth()\r\n if (width > selectMaxRowWidth) {\r\n selectMaxRowWidth = width\r\n }\r\n })\r\n \r\n const ports = data.columns.map(column => {\r\n const columnType = databaseFieldFormatter.formatColumnType(column)\r\n const columnName = databaseFieldFormatter.formatColumnName(column, this.showComment)\r\n\r\n let columnNameWeight = column.nullable == 'YES' ? 'normal' : 'bold'\r\n return {\r\n id: data.id + \"-\" + column.id,\r\n group: \"columnGroup\",\r\n attrs: {\r\n portBody: {\r\n width: selectMaxRowWidth,\r\n height: 30,\r\n refY: 11\r\n },\r\n portNameLabel: {\r\n height: 30,\r\n text: columnName,\r\n fontWeight: columnNameWeight,\r\n refY: 11\r\n },\r\n portTypeLabel: {\r\n text: columnType,\r\n height: 30,\r\n refY: 11,\r\n refX: selectMaxRowWidth - columnType.pxWidth() - 22,\r\n }\r\n }\r\n }\r\n })\r\n graph.addNode({\r\n id: data.id,\r\n x: x,\r\n y: y,\r\n shape: 'er-rect',\r\n width: selectMaxRowWidth,\r\n height: 40,\r\n label: data.tableName,\r\n ports: ports\r\n })\r\n x += selectMaxRowWidth + 60\r\n if ((index + 1) % 5 == 0) {\r\n y += selectMaxRowHeight + 60\r\n x = 20\r\n }\r\n })\r\n },\r\n\r\n createGraphInstance() {\r\n const graph = new Graph({\r\n container: document.getElementById('diagram-container'),\r\n grid: true,\r\n panning: true,\r\n keyboard: true,\r\n mousewheel: {\r\n enabled: true,\r\n modifiers: ['ctrl', 'meta'],\r\n },\r\n connecting: {\r\n router: {\r\n name: 'er',\r\n args: {\r\n padding: 1,\r\n offset: 25,\r\n direction: 'H',\r\n },\r\n },\r\n },\r\n })\r\n graph.bindKey(['meta+z', 'ctrl+z'], () => {\r\n if (graph.history.canUndo()) {\r\n graph.history.undo()\r\n }\r\n return false\r\n })\r\n graph.bindKey(['meta+shift+z', 'ctrl+shift+z'], () => {\r\n if (graph.history.canRedo()) {\r\n graph.history.redo()\r\n }\r\n return false\r\n })\r\n graph.bindKey('backspace', () => {\r\n const cells = graph.getSelectedCells()\r\n if (cells.length) {\r\n graph.removeCells(cells)\r\n }\r\n })\r\n if (graph.isHistoryEnabled()) {\r\n graph.disableHistory()\r\n } else {\r\n graph.enableHistory()\r\n }\r\n this.graph = graph\r\n return graph;\r\n },\r\n\r\n registerNewNode() {\r\n const LINE_HEIGHT = 30\r\n Graph.registerPortLayout(\r\n 'erPortPosition',\r\n (portsPositionArgs) => {\r\n return portsPositionArgs.map((_, index) => {\r\n return {\r\n position: {\r\n x: 0,\r\n y: (index + 1) * LINE_HEIGHT,\r\n },\r\n angle: 0,\r\n }\r\n })\r\n },\r\n true,\r\n )\r\n Graph.registerNode(\r\n 'er-rect',\r\n {\r\n inherit: 'rect',\r\n markup: [\r\n {\r\n tagName: 'rect',\r\n selector: 'body',\r\n },\r\n {\r\n tagName: 'text',\r\n selector: 'label',\r\n }\r\n ],\r\n attrs: {\r\n rect: {\r\n strokeWidth: 1,\r\n stroke: '#ddd',\r\n fill: '#f5f7fa',\r\n },\r\n label: {\r\n fontWeight: 'bold',\r\n fill: '#000',\r\n fontSize: 12,\r\n },\r\n },\r\n ports: {\r\n groups: {\r\n columnGroup: {\r\n markup: [\r\n {\r\n tagName: 'rect',\r\n selector: 'portBody',\r\n },\r\n {\r\n tagName: 'text',\r\n selector: 'portNameLabel',\r\n },\r\n {\r\n tagName: 'text',\r\n selector: 'portTypeLabel',\r\n },\r\n ],\r\n attrs: {\r\n portBody: {\r\n width: 100,\r\n height: 30,\r\n refY: 20,\r\n strokeWidth: 1,\r\n stroke: '#ddd',\r\n fill: '#FFF',\r\n magnet: true,\r\n },\r\n portNameLabel: {\r\n ref: 'portBody',\r\n refX: 6,\r\n refY: 22,\r\n fontSize: 12,\r\n },\r\n portTypeLabel: {\r\n ref: 'portBody',\r\n refX: 95,\r\n refY: 22,\r\n fontSize: 12,\r\n },\r\n },\r\n position: 'erPortPosition'\r\n }\r\n }\r\n }\r\n },\r\n true,\r\n )\r\n }\r\n } \r\n}\r\n</script>","const ua = navigator.userAgent;\nexport var Platform;\n(function (Platform) {\n Platform.IS_MAC = navigator.appVersion.indexOf('Mac') > 0;\n Platform.IS_IOS = !!ua.match(/(iPad|iPhone|iPod)/g);\n Platform.IS_WINDOWS = navigator.appVersion.indexOf('Win') > 0;\n Platform.IS_IE = ua.indexOf('MSIE') >= 0;\n Platform.IS_IE11 = !!ua.match(/Trident\\/7\\./);\n Platform.IS_EDGE = !!ua.match(/Edge\\//);\n /**\n * A flag indicating whether the browser is Netscape (including Firefox).\n */\n Platform.IS_NETSCAPE = ua.indexOf('Mozilla/') >= 0 &&\n ua.indexOf('MSIE') < 0 &&\n ua.indexOf('Edge/') < 0;\n /**\n * A flag indicating whether the the this is running inside a Chrome App.\n */\n Platform.IS_CHROME_APP = window.chrome != null &&\n window.chrome.app != null &&\n window.chrome.app.runtime != null;\n Platform.IS_CHROME = ua.indexOf('Chrome/') >= 0 && ua.indexOf('Edge/') < 0;\n Platform.IS_OPERA = ua.indexOf('Opera/') >= 0 || ua.indexOf('OPR/') >= 0;\n Platform.IS_FIREFOX = ua.indexOf('Firefox/') >= 0;\n Platform.IS_SAFARI = ua.indexOf('AppleWebKit/') >= 0 &&\n ua.indexOf('Chrome/') < 0 &&\n ua.indexOf('Edge/') < 0;\n /**\n * A flag indicating whether this device supports touchstart/-move/-end\n * events (Apple iOS, Android, Chromebook and Chrome Browser on touch-enabled\n * devices).\n */\n Platform.SUPPORT_TOUCH = 'ontouchstart' in document.documentElement;\n /**\n * A flag indicating whether this device supports Microsoft pointer events.\n */\n Platform.SUPPORT_POINTER = window.PointerEvent != null && !Platform.IS_MAC;\n Platform.SUPPORT_PASSIVE = false; // eslint-disable-line import/no-mutable-exports\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n Platform.SUPPORT_PASSIVE = true;\n },\n });\n const div = document.createElement('div');\n if (div.addEventListener) {\n div.addEventListener('click', () => { }, options);\n }\n }\n catch (err) {\n // pass\n }\n /**\n * A flag indicating whether foreignObject support is not available. This\n * is the case for Opera, older SVG-based browsers and all versions of IE.\n */\n Platform.NO_FOREIGNOBJECT = !document.createElementNS ||\n `${document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject')}` !== '[object SVGForeignObjectElement]' ||\n ua.indexOf('Opera/') >= 0;\n Platform.SUPPORT_FOREIGNOBJECT = !Platform.NO_FOREIGNOBJECT;\n})(Platform || (Platform = {}));\n(function (Platform) {\n function getHMRStatus() {\n const mod = window.module;\n if (mod != null && mod.hot != null && mod.hot.status != null) {\n return mod.hot.status();\n }\n return 'unkonwn';\n }\n Platform.getHMRStatus = getHMRStatus;\n function isApplyingHMR() {\n return getHMRStatus() === 'apply';\n }\n Platform.isApplyingHMR = isApplyingHMR;\n // This function checks if the specified event is supported by the browser.\n // Source: http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n const TAGNAMES = {\n select: 'input',\n change: 'input',\n submit: 'form',\n reset: 'form',\n error: 'img',\n load: 'img',\n abort: 'img',\n };\n function isEventSupported(event) {\n const elem = document.createElement(TAGNAMES[event] || 'div');\n const eventName = `on${event}`;\n let isSupported = eventName in elem;\n if (!isSupported) {\n elem.setAttribute(eventName, 'return;');\n isSupported = typeof elem[eventName] === 'function';\n }\n return isSupported;\n }\n Platform.isEventSupported = isEventSupported;\n})(Platform || (Platform = {}));\n//# sourceMappingURL=index.js.map","import JQuery from 'jquery';\nimport 'jquery-mousewheel';\nimport { Platform } from '../platform';\nif (Platform.SUPPORT_PASSIVE) {\n JQuery.event.special.touchstart = {\n setup(data, ns, handle) {\n if (!this.addEventListener) {\n return false;\n }\n this.addEventListener('touchstart', handle, {\n passive: true,\n });\n },\n };\n const hook = JQuery.event.special.mousewheel;\n if (hook) {\n const setup = hook.setup;\n hook.setup = function () {\n const addEventListener = this.addEventListener;\n if (!addEventListener) {\n return false;\n }\n this.addEventListener = (name, handler) => {\n addEventListener.call(this, name, handler, { passive: true });\n };\n setup.call(this);\n this.addEventListener = addEventListener;\n };\n }\n}\n// compatible with NodeList.prototype.forEach() before chrome 51\n// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach\nif (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}\n// compatible with ParentNode.append() before chrome 54\n// https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md\n;\n(function (arr) {\n arr.forEach((item) => {\n if (Object.prototype.hasOwnProperty.call(item, 'append')) {\n return;\n }\n Object.defineProperty(item, 'append', {\n configurable: true,\n enumerable: true,\n writable: true,\n value(...args) {\n const docFrag = document.createDocumentFragment();\n args.forEach((arg) => {\n const isNode = arg instanceof Node;\n docFrag.appendChild(isNode ? arg : document.createTextNode(String(arg)));\n });\n this.appendChild(docFrag);\n },\n });\n });\n})([Element.prototype, Document.prototype, DocumentFragment.prototype]);\n//# sourceMappingURL=index.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nexport default baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nexport default baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nexport default strictIndexOf;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIsNaN from './_baseIsNaN.js';\nimport strictIndexOf from './_strictIndexOf.js';\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nexport default baseIndexOf;\n","import baseIndexOf from './_baseIndexOf.js';\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nexport default arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nexport default arrayIncludesWith;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nexport default noop;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Set from './_Set.js';\nimport noop from './noop.js';\nimport setToArray from './_setToArray.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nexport default createSet;\n","import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport cacheHas from './_cacheHas.js';\nimport createSet from './_createSet.js';\nimport setToArray from './_setToArray.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseUniq;\n","import baseUniq from './_baseUniq.js';\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nexport default uniq;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","import Symbol from './_Symbol.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nexport default isFlattenable;\n","import arrayPush from './_arrayPush.js';\nimport isFlattenable from './_isFlattenable.js';\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nexport default baseFlatten;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport baseUniq from './_baseUniq.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nexport default union;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n nativeMin = Math.min;\n\n/**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\nfunction baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n}\n\nexport default baseSortedIndexBy;\n","import baseSortedIndexBy from './_baseSortedIndexBy.js';\nimport identity from './identity.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n/**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\nfunction baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n}\n\nexport default baseSortedIndex;\n","import baseSortedIndex from './_baseSortedIndex.js';\n\n/**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\nfunction sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n}\n\nexport default sortedIndex;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import Stack from './_Stack.js';\nimport baseIsEqual from './_baseIsEqual.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport default baseIsMatch;\n","import isObject from './isObject.js';\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nexport default isStrictComparable;\n","import isStrictComparable from './_isStrictComparable.js';\nimport keys from './keys.js';\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nexport default getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nexport default matchesStrictComparable;\n","import baseIsMatch from './_baseIsMatch.js';\nimport getMatchData from './_getMatchData.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nexport default baseMatches;\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nexport default baseHasIn;\n","import castPath from './_castPath.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isIndex from './_isIndex.js';\nimport isLength from './isLength.js';\nimport toKey from './_toKey.js';\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nexport default hasPath;\n","import baseHasIn from './_baseHasIn.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nexport default hasIn;\n","import baseIsEqual from './_baseIsEqual.js';\nimport get from './get.js';\nimport hasIn from './hasIn.js';\nimport isKey from './_isKey.js';\nimport isStrictComparable from './_isStrictComparable.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\nimport toKey from './_toKey.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nexport default baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nexport default baseProperty;\n","import baseGet from './_baseGet.js';\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nexport default basePropertyDeep;\n","import baseProperty from './_baseProperty.js';\nimport basePropertyDeep from './_basePropertyDeep.js';\nimport isKey from './_isKey.js';\nimport toKey from './_toKey.js';\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nexport default property;\n","import baseMatches from './_baseMatches.js';\nimport baseMatchesProperty from './_baseMatchesProperty.js';\nimport identity from './identity.js';\nimport isArray from './isArray.js';\nimport property from './property.js';\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nexport default baseIteratee;\n","import baseIteratee from './_baseIteratee.js';\nimport baseSortedIndexBy from './_baseSortedIndexBy.js';\n\n/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\nfunction sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2));\n}\n\nexport default sortedIndexBy;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","import baseFor from './_baseFor.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nexport default baseForOwn;\n","import isArrayLike from './isArrayLike.js';\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nexport default createBaseEach;\n","import baseForOwn from './_baseForOwn.js';\nimport createBaseEach from './_createBaseEach.js';\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nexport default baseEach;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nexport default baseSortBy;\n","import isSymbol from './isSymbol.js';\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nexport default compareAscending;\n","import compareAscending from './_compareAscending.js';\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nexport default compareMultiple;\n","import arrayMap from './_arrayMap.js';\nimport baseGet from './_baseGet.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport baseSortBy from './_baseSortBy.js';\nimport baseUnary from './_baseUnary.js';\nimport compareMultiple from './_compareMultiple.js';\nimport identity from './identity.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nexport default baseOrderBy;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import baseFlatten from './_baseFlatten.js';\nimport baseOrderBy from './_baseOrderBy.js';\nimport baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nexport default sortBy;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nexport default arrayAggregator;\n","import baseEach from './_baseEach.js';\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nexport default baseAggregator;\n","import arrayAggregator from './_arrayAggregator.js';\nimport baseAggregator from './_baseAggregator.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nexport default createAggregator;\n","import baseAssignValue from './_baseAssignValue.js';\nimport createAggregator from './_createAggregator.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nexport default groupBy;\n","import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport arrayMap from './_arrayMap.js';\nimport baseUnary from './_baseUnary.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseDifference;\n","import baseDifference from './_baseDifference.js';\nimport baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nexport default difference;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n","import basePickBy from './_basePickBy.js';\nimport hasIn from './hasIn.js';\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nexport default basePick;\n","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import flatten from './flatten.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nexport default flatRest;\n","import basePick from './_basePick.js';\nimport flatRest from './_flatRest.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nexport default pick;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import copyObject from './_copyObject.js';\nimport createAssigner from './_createAssigner.js';\nimport keysIn from './keysIn.js';\n\n/**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\nvar assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n});\n\nexport default assignIn;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","import baseKeys from './_baseKeys.js';\nimport getTag from './_getTag.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLike from './isArrayLike.js';\nimport isBuffer from './isBuffer.js';\nimport isPrototype from './_isPrototype.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport default isEmpty;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n","import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n","import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nexport default getSymbolsIn;\n","import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n","import baseMerge from './_baseMerge.js';\nimport isObject from './isObject.js';\n\n/**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\nfunction customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n}\n\nexport default customDefaultsMerge;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\nvar mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n});\n\nexport default mergeWith;\n","import apply from './_apply.js';\nimport baseRest from './_baseRest.js';\nimport customDefaultsMerge from './_customDefaultsMerge.js';\nimport mergeWith from './mergeWith.js';\n\n/**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\nvar defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n});\n\nexport default defaultsDeep;\n","/**\n * @see https://www.typescriptlang.org/docs/handbook/mixins.html\n */\nexport function applyMixins(derivedCtor, ...baseCtors) {\n baseCtors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n if (name !== 'constructor') {\n Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name));\n }\n });\n });\n}\n//# sourceMappingURL=mixins.js.map","const extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array &&\n function (d, b) {\n d.__proto__ = b; // eslint-disable-line no-proto\n }) ||\n function (d, b) {\n // eslint-disable-next-line no-restricted-syntax\n for (const p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) {\n d[p] = b[p];\n }\n }\n };\n/**\n * @see https://github.com/microsoft/TypeScript/blob/5c85febb0ce9d6088cbe9b09cb42f73f9ee8ea05/src/compiler/transformers/es2015.ts#L4309\n */\n// eslint-disable-next-line\nexport function inherit(cls, base) {\n extendStatics(cls, base);\n function tmp() {\n this.constructor = cls;\n }\n cls.prototype =\n base === null\n ? Object.create(base)\n : ((tmp.prototype = base.prototype), new tmp());\n}\nclass A {\n}\nconst isNativeClass = /^\\s*class\\s+/.test(`${A}`) || /^\\s*class\\s*\\{/.test(`${class {\n}}`);\n/**\n * Extends class with specified class name.\n */\n// eslint-disable-next-line\nexport function createClass(className, base) {\n let cls;\n if (isNativeClass) {\n // eslint-disable-next-line no-new-func\n cls = new Function('base', `return class ${className} extends base { }`)(base);\n }\n else {\n // eslint-disable-next-line no-new-func\n cls = new Function('base', `return function ${className}() { return base.apply(this, arguments) }`)(base);\n inherit(cls, base);\n }\n return cls;\n}\n//# sourceMappingURL=inherit.js.map","export { has, pick, forIn, merge, extend, isEqual, isEmpty, isObject, isPlainObject, clone, cloneDeep, defaults, defaultsDeep, } from 'lodash-es';\nexport * from './mixins';\nexport * from './inherit';\nexport function ensure(value, defaultValue) {\n return value != null ? value : defaultValue;\n}\nexport function getValue(obj, key, defaultValue) {\n const value = obj != null ? obj[key] : null;\n return defaultValue !== undefined ? ensure(value, defaultValue) : value;\n}\nexport function getNumber(obj, key, defaultValue) {\n let value = obj != null ? obj[key] : null;\n if (value == null) {\n return defaultValue;\n }\n value = +value;\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return defaultValue;\n }\n return value;\n}\nexport function getBoolean(obj, key, defaultValue) {\n const value = obj != null ? obj[key] : null;\n if (value == null) {\n return defaultValue;\n }\n return !!value;\n}\nexport function getByPath(obj, path, delimiter = '/') {\n let ret;\n const keys = Array.isArray(path) ? path : path.split(delimiter);\n if (keys.length) {\n ret = obj;\n while (keys.length) {\n const key = keys.shift();\n if (Object(ret) === ret && key && key in ret) {\n ret = ret[key];\n }\n else {\n return undefined;\n }\n }\n }\n return ret;\n}\nexport function setByPath(obj, path, value, delimiter = '/') {\n const keys = Array.isArray(path) ? path : path.split(delimiter);\n const lastKey = keys.pop();\n if (lastKey) {\n let diver = obj;\n keys.forEach((key) => {\n if (diver[key] == null) {\n diver[key] = {};\n }\n diver = diver[key];\n });\n diver[lastKey] = value;\n }\n return obj;\n}\nexport function unsetByPath(obj, path, delimiter = '/') {\n const keys = Array.isArray(path) ? path.slice() : path.split(delimiter);\n const propertyToRemove = keys.pop();\n if (propertyToRemove) {\n if (keys.length > 0) {\n const parent = getByPath(obj, keys);\n if (parent) {\n delete parent[propertyToRemove];\n }\n }\n else {\n delete obj[propertyToRemove];\n }\n }\n return obj;\n}\nexport function flatten(obj, delim = '/', stop) {\n const ret = {};\n Object.keys(obj).forEach((key) => {\n const val = obj[key];\n let deep = typeof val === 'object' || Array.isArray(val);\n if (deep && stop && stop(val)) {\n deep = false;\n }\n if (deep) {\n const flatObject = flatten(val, delim, stop);\n Object.keys(flatObject).forEach((flatKey) => {\n ret[key + delim + flatKey] = flatObject[flatKey];\n });\n }\n else {\n ret[key] = val;\n }\n });\n // eslint-disable-next-line no-restricted-syntax\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n }\n return ret;\n}\n//# sourceMappingURL=object.js.map","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\nexport default basePropertyOf;\n","import basePropertyOf from './_basePropertyOf.js';\n\n/** Used to map characters to HTML entities. */\nvar htmlEscapes = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\n\n/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nvar escapeHtmlChar = basePropertyOf(htmlEscapes);\n\nexport default escapeHtmlChar;\n","import escapeHtmlChar from './_escapeHtmlChar.js';\nimport toString from './toString.js';\n\n/** Used to match HTML entities and HTML characters. */\nvar reUnescapedHtml = /[&<>\"']/g,\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */\nfunction escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n}\n\nexport default escape;\n","import basePropertyOf from './_basePropertyOf.js';\n\n/** Used to map HTML entities to characters. */\nvar htmlUnescapes = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\"\n};\n\n/**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\nvar unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\nexport default unescapeHtmlChar;\n","import toString from './toString.js';\nimport unescapeHtmlChar from './_unescapeHtmlChar.js';\n\n/** Used to match HTML entities and HTML characters. */\nvar reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nfunction unescape(string) {\n string = toString(string);\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, unescapeHtmlChar)\n : string;\n}\n\nexport default unescape;\n","/**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\nfunction baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n}\n\nexport default baseClamp;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nexport default baseSlice;\n","import baseSlice from './_baseSlice.js';\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nexport default castSlice;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nexport default hasUnicode;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nexport default baseIsRegExp;\n","import baseIsRegExp from './_baseIsRegExp.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nexport default isRegExp;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nexport default asciiToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nexport default unicodeToArray;\n","import asciiToArray from './_asciiToArray.js';\nimport hasUnicode from './_hasUnicode.js';\nimport unicodeToArray from './_unicodeToArray.js';\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nexport default stringToArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor;\n\n/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\nfunction baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n}\n\nexport default baseRepeat;\n","import baseProperty from './_baseProperty.js';\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nexport default asciiSize;\n","import baseRepeat from './_baseRepeat.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport toInteger from './toInteger.js';\nimport toString from './toString.js';\n\n/**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\nfunction repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n}\n\nexport default repeat;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n}\n\nexport default unicodeSize;\n","import baseRepeat from './_baseRepeat.js';\nimport baseToString from './_baseToString.js';\nimport castSlice from './_castSlice.js';\nimport hasUnicode from './_hasUnicode.js';\nimport stringSize from './_stringSize.js';\nimport stringToArray from './_stringToArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil;\n\n/**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\nfunction createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n}\n\nexport default createPadding;\n","import createPadding from './_createPadding.js';\nimport stringSize from './_stringSize.js';\nimport toInteger from './toInteger.js';\nimport toString from './toString.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeFloor = Math.floor;\n\n/**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\nfunction pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n}\n\nexport default pad;\n","import baseToString from './_baseToString.js';\nimport castSlice from './_castSlice.js';\nimport hasUnicode from './_hasUnicode.js';\nimport isObject from './isObject.js';\nimport isRegExp from './isRegExp.js';\nimport stringSize from './_stringSize.js';\nimport stringToArray from './_stringToArray.js';\nimport toInteger from './toInteger.js';\nimport toString from './toString.js';\n\n/** Used as default options for `_.truncate`. */\nvar DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\nfunction truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n}\n\nexport default truncate;\n","import copyObject from './_copyObject.js';\nimport createAssigner from './_createAssigner.js';\nimport keysIn from './keysIn.js';\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\nexport default assignInWith;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\nimport isPlainObject from './isPlainObject.js';\n\n/** `Object#toString` result references. */\nvar domExcTag = '[object DOMException]',\n errorTag = '[object Error]';\n\n/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\nfunction isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n}\n\nexport default isError;\n","import apply from './_apply.js';\nimport baseRest from './_baseRest.js';\nimport isError from './isError.js';\n\n/**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n * return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n * elements = [];\n * }\n */\nvar attempt = baseRest(function(func, args) {\n try {\n return apply(func, undefined, args);\n } catch (e) {\n return isError(e) ? e : new Error(e);\n }\n});\n\nexport default attempt;\n","import arrayMap from './_arrayMap.js';\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nexport default baseValues;\n","import eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\nexport default customDefaultsAssignIn;\n","/** Used to escape characters for inclusion in compiled string literals. */\nvar stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\n/**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nfunction escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n}\n\nexport default escapeStringChar;\n","/** Used to match template delimiters. */\nvar reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\nexport default reInterpolate;\n","/** Used to match template delimiters. */\nvar reEscape = /<%-([\\s\\S]+?)%>/g;\n\nexport default reEscape;\n","/** Used to match template delimiters. */\nvar reEvaluate = /<%([\\s\\S]+?)%>/g;\n\nexport default reEvaluate;\n","import escape from './escape.js';\nimport reEscape from './_reEscape.js';\nimport reEvaluate from './_reEvaluate.js';\nimport reInterpolate from './_reInterpolate.js';\n\n/**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\nvar templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': { 'escape': escape }\n }\n};\n\nexport default templateSettings;\n","import assignInWith from './assignInWith.js';\nimport attempt from './attempt.js';\nimport baseValues from './_baseValues.js';\nimport customDefaultsAssignIn from './_customDefaultsAssignIn.js';\nimport escapeStringChar from './_escapeStringChar.js';\nimport isError from './isError.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keys from './keys.js';\nimport reInterpolate from './_reInterpolate.js';\nimport templateSettings from './templateSettings.js';\nimport toString from './toString.js';\n\n/** Error message constants. */\nvar INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n/** Used to match empty string literals in compiled template source. */\nvar reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n/**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\nvar reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n/**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\nvar reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n/** Used to ensure capturing order of template delimiters. */\nvar reNoMatch = /($^)/;\n\n/** Used to match unescaped characters in compiled string literals. */\nvar reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b>&lt;script&gt;</b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * // var __t, __p = '';\n * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * // return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n * var JST = {\\\n * \"main\": ' + _.template(mainText).source + '\\\n * };\\\n * ');\n */\nfunction template(string, options, guard) {\n // Based on John Resig's `tmpl` implementation\n // (http://ejohn.org/blog/javascript-micro-templating/)\n // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n var settings = templateSettings.imports._.templateSettings || templateSettings;\n\n if (guard && isIterateeCall(string, options, guard)) {\n options = undefined;\n }\n string = toString(string);\n options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n importsKeys = keys(imports),\n importsValues = baseValues(imports, importsKeys);\n\n var isEscaping,\n isEvaluating,\n index = 0,\n interpolate = options.interpolate || reNoMatch,\n source = \"__p += '\";\n\n // Compile the regexp to match each delimiter.\n var reDelimiters = RegExp(\n (options.escape || reNoMatch).source + '|' +\n interpolate.source + '|' +\n (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n (options.evaluate || reNoMatch).source + '|$'\n , 'g');\n\n // Use a sourceURL for easier debugging.\n // The sourceURL gets injected into the source that's eval-ed, so be careful\n // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n // and escape the comment, thus injecting code that gets evaled.\n var sourceURL = hasOwnProperty.call(options, 'sourceURL')\n ? ('//# sourceURL=' +\n (options.sourceURL + '').replace(/\\s/g, ' ') +\n '\\n')\n : '';\n\n string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n interpolateValue || (interpolateValue = esTemplateValue);\n\n // Escape characters that can't be included in string literals.\n source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n // Replace delimiters with snippets.\n if (escapeValue) {\n isEscaping = true;\n source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n }\n if (evaluateValue) {\n isEvaluating = true;\n source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n }\n if (interpolateValue) {\n source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n }\n index = offset + match.length;\n\n // The JS engine embedded in Adobe products needs `match` returned in\n // order to produce the correct `offset` value.\n return match;\n });\n\n source += \"';\\n\";\n\n // If `variable` is not specified wrap a with-statement around the generated\n // code to add the data object to the top of the scope chain.\n var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n if (!variable) {\n source = 'with (obj) {\\n' + source + '\\n}\\n';\n }\n // Throw an error if a forbidden character was found in `variable`, to prevent\n // potential command injection attacks.\n else if (reForbiddenIdentifierChars.test(variable)) {\n throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n }\n\n // Cleanup code by stripping empty strings.\n source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n .replace(reEmptyStringMiddle, '$1')\n .replace(reEmptyStringTrailing, '$1;');\n\n // Frame code as the function body.\n source = 'function(' + (variable || 'obj') + ') {\\n' +\n (variable\n ? ''\n : 'obj || (obj = {});\\n'\n ) +\n \"var __t, __p = ''\" +\n (isEscaping\n ? ', __e = _.escape'\n : ''\n ) +\n (isEvaluating\n ? ', __j = Array.prototype.join;\\n' +\n \"function print() { __p += __j.call(arguments, '') }\\n\"\n : ';\\n'\n ) +\n source +\n 'return __p\\n}';\n\n var result = attempt(function() {\n return Function(importsKeys, sourceURL + 'return ' + source)\n .apply(undefined, importsValues);\n });\n\n // Provide the compiled function's source by its `toString` method or\n // the `source` property as a convenience for inlining compiled templates.\n result.source = source;\n if (isError(result)) {\n throw result;\n }\n return result;\n}\n\nexport default template;\n","import toString from './toString.js';\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n}\n\nexport default uniqueId;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nexport default arrayReduce;\n","import basePropertyOf from './_basePropertyOf.js';\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nexport default deburrLetter;\n","import deburrLetter from './_deburrLetter.js';\nimport toString from './toString.js';\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nexport default deburr;\n","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nexport default asciiWords;\n","/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\nexport default hasUnicodeWord;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\nexport default unicodeWords;\n","import asciiWords from './_asciiWords.js';\nimport hasUnicodeWord from './_hasUnicodeWord.js';\nimport toString from './toString.js';\nimport unicodeWords from './_unicodeWords.js';\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nexport default words;\n","import arrayReduce from './_arrayReduce.js';\nimport deburr from './deburr.js';\nimport words from './words.js';\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\nexport default createCompounder;\n","import castSlice from './_castSlice.js';\nimport hasUnicode from './_hasUnicode.js';\nimport stringToArray from './_stringToArray.js';\nimport toString from './toString.js';\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nexport default createCaseFirst;\n","import createCaseFirst from './_createCaseFirst.js';\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nexport default upperFirst;\n","import createCompounder from './_createCompounder.js';\nimport upperFirst from './upperFirst.js';\n\n/**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\nvar startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n});\n\nexport default startCase;\n","import toString from './toString.js';\nimport upperFirst from './upperFirst.js';\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nexport default capitalize;\n","import capitalize from './capitalize.js';\nimport createCompounder from './_createCompounder.js';\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\nexport default camelCase;\n","import createCompounder from './_createCompounder.js';\n\n/**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */\nvar upperCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toUpperCase();\n});\n\nexport default upperCase;\n","import createCompounder from './_createCompounder.js';\n\n/**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\nvar lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n});\n\nexport default lowerCase;\n","import createCaseFirst from './_createCaseFirst.js';\n\n/**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\nvar lowerFirst = createCaseFirst('toLowerCase');\n\nexport default lowerFirst;\n","import { camelCase, startCase, upperCase, lowerCase, upperFirst, } from 'lodash-es';\nexport { \n// kebabCase,\n// startCase,\n// snakeCase,\n// lowerCase,\n// upperCase,\n// capitalize,\nlowerFirst, upperFirst, camelCase, } from 'lodash-es';\n// @see: https://medium.com/@robertsavian/javascript-case-converters-using-lodash-4f2f964091cc\nconst cacheStringFunction = (fn) => {\n const cache = Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nexport const kebabCase = cacheStringFunction((s) => s.replace(/\\B([A-Z])/g, '-$1').toLowerCase());\nexport const pascalCase = cacheStringFunction((s) => startCase(camelCase(s)).replace(/ /g, ''));\nexport const constantCase = cacheStringFunction((s) => upperCase(s).replace(/ /g, '_'));\nexport const dotCase = cacheStringFunction((s) => lowerCase(s).replace(/ /g, '.'));\nexport const pathCase = cacheStringFunction((s) => lowerCase(s).replace(/ /g, '/'));\nexport const sentenceCase = cacheStringFunction((s) => upperFirst(lowerCase(s)));\nexport const titleCase = cacheStringFunction((s) => startCase(camelCase(s)));\n//# sourceMappingURL=format.js.map","/* eslint-disable no-bitwise */\n/**\n * Return a simple hash code from a string.\n * Source from: https://github.com/sindresorhus/fnv1a/blob/master/index.js#L25\n */\nexport function hashcode(str) {\n let hash = 2166136261;\n let isUnicoded = false;\n let string = str;\n for (let i = 0, ii = string.length; i < ii; i += 1) {\n let characterCode = string.charCodeAt(i);\n // Non-ASCII characters trigger the Unicode escape logic\n if (characterCode > 0x7f && !isUnicoded) {\n string = unescape(encodeURIComponent(string));\n characterCode = string.charCodeAt(i);\n isUnicoded = true;\n }\n hash ^= characterCode;\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n }\n return hash >>> 0;\n}\n//# sourceMappingURL=hashcode.js.map","/* eslint-disable no-bitwise */\nexport function uuid() {\n // credit: http://stackoverflow.com/posts/2117523/revisions\n // return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n // const r = (Math.random() * 16) | 0\n // const v = c === 'x' ? r : (r & 0x3) | 0x8\n // return v.toString(16)\n // })\n let res = '';\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n for (let i = 0, len = template.length; i < len; i += 1) {\n const s = template[i];\n const r = (Math.random() * 16) | 0;\n const v = s === 'x' ? r : s === 'y' ? (r & 0x3) | 0x8 : s;\n res += v.toString(16);\n }\n return res;\n}\n//# sourceMappingURL=uuid.js.map","import JQuery from 'jquery';\nexport function sanitizeHTML(html, options = {}) {\n // If documentContext (second parameter) is not specified or given as\n // `null` or `undefined`, a new document is used. Inline events will not\n // execute when the HTML is parsed; this includes, for example, sending\n // GET requests for images.\n // If keepScripts (last parameter) is `false`, scripts are not executed.\n const nodes = JQuery.parseHTML(html, null, false);\n nodes.forEach((node) => {\n const elem = node;\n if (elem) {\n const attrs = elem.attributes;\n if (attrs) {\n for (let i = 0, ii = attrs.length; i < ii; i += 1) {\n const attr = attrs.item(i);\n if (attr) {\n const val = attr.value.toLowerCase();\n const name = attr.name.toLowerCase();\n // Removes attribute name starts with \"on\" (e.g. onload,\n // onerror...).\n // Removes attribute value starts with \"javascript:\" pseudo\n // protocol (e.g. `href=\"javascript:alert(1)\"`).\n if (name.startsWith('on') ||\n val.startsWith('javascript:') || // eslint-disable-line no-script-url\n // ref: https://lgtm.com/rules/1510852698359/\n val.startsWith('data:') ||\n val.startsWith('vbscript:')) {\n elem.removeAttribute(name);\n }\n }\n }\n }\n }\n });\n if (options.raw) {\n return nodes;\n }\n return JQuery('<div/>').append(nodes).html();\n}\n//# sourceMappingURL=html.js.map","// @see: https://github.com/microsoft/TypeScript/blob/master/src/compiler/checker.ts\n/**\n * Given a name and a list of names that are not equal to the name, return a\n * spelling suggestion if there is one that is close enough. Names less than\n * length 3 only check for case-insensitive equality, not Levenshtein distance.\n *\n * - If there is a candidate that's the same except for case, return that.\n * - If there is a candidate that's within one edit of the name, return that.\n * - Otherwise, return the candidate with the smallest Levenshtein distance,\n * except for candidates:\n * * With no name\n * * Whose length differs from the target name by more than 0.34 of the\n * length of the name.\n * * Whose levenshtein distance is more than 0.4 of the length of the\n * name (0.4 allows 1 substitution/transposition for every 5 characters,\n * and 1 insertion/deletion at 3 characters)\n */\nexport function getSpellingSuggestion(name, candidates, getName) {\n const maximumLengthDifference = Math.min(2, Math.floor(name.length * 0.34));\n // If the best result isn't better than this, don't bother.\n let bestDistance = Math.floor(name.length * 0.4) + 1;\n let bestCandidate;\n let justCheckExactMatches = false;\n const nameLowerCase = name.toLowerCase();\n // eslint-disable-next-line\n for (const candidate of candidates) {\n const candidateName = getName(candidate);\n if (candidateName !== undefined &&\n Math.abs(candidateName.length - nameLowerCase.length) <=\n maximumLengthDifference) {\n const candidateNameLowerCase = candidateName.toLowerCase();\n if (candidateNameLowerCase === nameLowerCase) {\n if (candidateName === name) {\n continue;\n }\n return candidate;\n }\n if (justCheckExactMatches) {\n continue;\n }\n if (candidateName.length < 3) {\n // Don't bother, user would have noticed a\n // 2-character name having an extra character.\n continue;\n }\n // Only care about a result better than the best so far.\n const distance = levenshteinWithMax(nameLowerCase, candidateNameLowerCase, bestDistance - 1);\n if (distance === undefined) {\n continue;\n }\n if (distance < 3) {\n justCheckExactMatches = true;\n bestCandidate = candidate;\n }\n else {\n // Debug.assert(distance < bestDistance)\n bestDistance = distance;\n bestCandidate = candidate;\n }\n }\n }\n return bestCandidate;\n}\nfunction levenshteinWithMax(s1, s2, max) {\n let previous = new Array(s2.length + 1); // eslint-disable-line\n let current = new Array(s2.length + 1); // eslint-disable-line\n /** Represents any value > max. We don't care about the particular value. */\n const big = max + 1;\n for (let i = 0; i <= s2.length; i += 1) {\n previous[i] = i;\n }\n for (let i = 1; i <= s1.length; i += 1) {\n const c1 = s1.charCodeAt(i - 1);\n const minJ = i > max ? i - max : 1;\n const maxJ = s2.length > max + i ? max + i : s2.length;\n current[0] = i;\n /** Smallest value of the matrix in the ith column. */\n let colMin = i;\n for (let j = 1; j < minJ; j += 1) {\n current[j] = big;\n }\n for (let j = minJ; j <= maxJ; j += 1) {\n const dist = c1 === s2.charCodeAt(j - 1)\n ? previous[j - 1]\n : Math.min(\n /* delete */ previous[j] + 1, \n /* insert */ current[j - 1] + 1, \n /* substitute */ previous[j - 1] + 2);\n current[j] = dist;\n colMin = Math.min(colMin, dist);\n }\n for (let j = maxJ + 1; j <= s2.length; j += 1) {\n current[j] = big;\n }\n if (colMin > max) {\n // Give up -- everything in this column is > max\n // and it can't get better in future columns.\n return undefined;\n }\n const temp = previous;\n previous = current;\n current = temp;\n }\n const res = previous[s2.length];\n return res > max ? undefined : res;\n}\n//# sourceMappingURL=suggestion.js.map","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nexport default isNumber;\n","import root from './_root.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite;\n\n/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\nfunction isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n}\n\nexport default isFinite;\n","import baseClamp from './_baseClamp.js';\nimport toNumber from './toNumber.js';\n\n/**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\nfunction clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n}\n\nexport default clamp;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\nfunction baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n}\n\nexport default baseInRange;\n","import root from './_root.js';\nimport toString from './toString.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeParseInt = root.parseInt;\n\n/**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\nfunction parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n}\n\nexport default parseInt;\n","export { isNaN, isNumber, isFinite, isInteger, isSafeInteger, clamp, inRange, toFinite, toNumber, toInteger, toSafeInteger, parseInt, } from 'lodash-es';\nexport { isNumeric } from '../lang/lang';\n/**\n * Returns the remainder of division of `n` by `m`. You should use this\n * instead of the built-in operation as the built-in operation does not\n * properly handle negative numbers.\n */\nexport function mod(n, m) {\n return ((n % m) + m) % m;\n}\nexport function random(lower, upper) {\n if (upper == null) {\n upper = lower == null ? 1 : lower; // eslint-disable-line\n lower = 0; // eslint-disable-line\n }\n else if (upper < lower) {\n const tmp = lower;\n lower = upper; // eslint-disable-line\n upper = tmp; // eslint-disable-line\n }\n return Math.floor(Math.random() * (upper - lower + 1) + lower);\n}\nexport function isPercentage(val) {\n return typeof val === 'string' && val.slice(-1) === '%';\n}\nexport function normalizePercentage(num, ref) {\n if (num == null) {\n return 0;\n }\n let raw;\n if (typeof num === 'string') {\n raw = parseFloat(num);\n if (isPercentage(num)) {\n raw /= 100;\n if (Number.isFinite(raw)) {\n return raw * ref;\n }\n }\n }\n else {\n raw = num;\n }\n if (!Number.isFinite(raw)) {\n return 0;\n }\n if (raw > 0 && raw < 1) {\n return raw * ref;\n }\n return raw;\n}\nexport function parseCssNumeric(val, units) {\n function getUnit(regexp) {\n const matches = new RegExp(`(?:\\\\d+(?:\\\\.\\\\d+)*)(${regexp})$`).exec(val);\n if (!matches) {\n return null;\n }\n return matches[1];\n }\n const number = parseFloat(val);\n if (Number.isNaN(number)) {\n return null;\n }\n // determine the unit\n let regexp;\n if (units == null) {\n // accept any unit, as well as no unit\n regexp = '[A-Za-z]*';\n }\n else if (Array.isArray(units)) {\n if (units.length === 0) {\n return null;\n }\n regexp = units.join('|');\n }\n else if (typeof units === 'string') {\n regexp = units;\n }\n const unit = getUnit(regexp);\n if (unit === null) {\n return null;\n }\n return {\n unit,\n value: number,\n };\n}\nexport function normalizeSides(box) {\n if (typeof box === 'object') {\n let left = 0;\n let top = 0;\n let right = 0;\n let bottom = 0;\n if (box.vertical != null && Number.isFinite(box.vertical)) {\n top = bottom = box.vertical;\n }\n if (box.horizontal != null && Number.isFinite(box.horizontal)) {\n right = left = box.horizontal;\n }\n if (box.left != null && Number.isFinite(box.left))\n left = box.left;\n if (box.top != null && Number.isFinite(box.top))\n top = box.top;\n if (box.right != null && Number.isFinite(box.right))\n right = box.right;\n if (box.bottom != null && Number.isFinite(box.bottom))\n bottom = box.bottom;\n return { top, right, bottom, left };\n }\n let val = 0;\n if (box != null && Number.isFinite(box)) {\n val = box;\n }\n return { top: val, right: val, bottom: val, left: val };\n}\n//# sourceMappingURL=number.js.map","import before from './before.js';\n\n/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\nfunction once(func) {\n return before(2, func);\n}\n\nexport default once;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\nfunction baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n}\n\nexport default baseDelay;\n","import baseDelay from './_baseDelay.js';\nimport baseRest from './_baseRest.js';\n\n/**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\nvar defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n});\n\nexport default defer;\n","export { isFunction, once, noop, debounce, defer } from 'lodash-es';\nexport function apply(fn, ctx, args) {\n if (args) {\n switch (args.length) {\n case 0:\n return fn.call(ctx);\n case 1:\n return fn.call(ctx, args[0]);\n case 2:\n return fn.call(ctx, args[0], args[1]);\n case 3:\n return fn.call(ctx, args[0], args[1], args[2]);\n case 4:\n return fn.call(ctx, args[0], args[1], args[2], args[3]);\n case 5:\n return fn.call(ctx, args[0], args[1], args[2], args[3], args[4]);\n case 6:\n return fn.call(ctx, args[0], args[1], args[2], args[3], args[4], args[5]);\n default:\n return fn.apply(ctx, args);\n }\n }\n return fn.call(ctx);\n}\nexport function call(fn, ctx, ...args) {\n return apply(fn, ctx, args);\n}\nfunction repush(array, item) {\n for (let i = 0, ii = array.length; i < ii; i += 1) {\n if (array[i] === item) {\n return array.push(array.splice(i, 1)[0]);\n }\n }\n}\nexport function cacher(fn, ctx, postProcessor) {\n const keys = [];\n const cache = {};\n const f = (...args) => {\n let hasCache = false;\n const key = args.join('\\u2400');\n if (key in cache) {\n hasCache = true;\n repush(keys, key);\n }\n else {\n if (keys.length >= 1000) {\n delete cache[keys.shift()];\n }\n keys.push(key);\n cache[key] = apply(fn, ctx || null, args);\n }\n return postProcessor ? postProcessor(cache[key], hasCache) : cache[key];\n };\n return f;\n}\n//# sourceMappingURL=function.js.map","export function isAsyncLike(obj) {\n return typeof obj === 'object' && obj.then && typeof obj.then === 'function';\n}\nexport function isAsync(obj) {\n return obj != null && (obj instanceof Promise || isAsyncLike(obj));\n}\nexport function toAsyncBoolean(...inputs) {\n const results = [];\n inputs.forEach((arg) => {\n if (Array.isArray(arg)) {\n results.push(...arg);\n }\n else {\n results.push(arg);\n }\n });\n const hasAsync = results.some((res) => isAsync(res));\n if (hasAsync) {\n const deferres = results.map((res) => isAsync(res) ? res : Promise.resolve(res !== false));\n return Promise.all(deferres).then((arr) => arr.reduce((memo, item) => item !== false && memo, true));\n }\n return results.every((res) => res !== false);\n}\nexport function toDeferredBoolean(...inputs) {\n const ret = toAsyncBoolean(inputs);\n return typeof ret === 'boolean' ? Promise.resolve(ret) : ret;\n}\n//# sourceMappingURL=async.js.map","const rclass = /[\\t\\r\\n\\f]/g;\nconst rnotwhite = /\\S+/g;\nconst fillSpaces = (str) => ` ${str} `;\nexport function getClass(elem) {\n return (elem && elem.getAttribute && elem.getAttribute('class')) || '';\n}\nexport function hasClass(elem, selector) {\n if (elem == null || selector == null) {\n return false;\n }\n const classNames = fillSpaces(getClass(elem));\n const className = fillSpaces(selector);\n return elem.nodeType === 1\n ? classNames.replace(rclass, ' ').includes(className)\n : false;\n}\nexport function addClass(elem, selector) {\n if (elem == null || selector == null) {\n return;\n }\n if (typeof selector === 'function') {\n return addClass(elem, selector(getClass(elem)));\n }\n if (typeof selector === 'string' && elem.nodeType === 1) {\n const classes = selector.match(rnotwhite) || [];\n const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ');\n let newValue = classes.reduce((memo, cls) => {\n if (memo.indexOf(fillSpaces(cls)) < 0) {\n return `${memo}${cls} `;\n }\n return memo;\n }, oldValue);\n newValue = newValue.trim();\n if (oldValue !== newValue) {\n elem.setAttribute('class', newValue);\n }\n }\n}\nexport function removeClass(elem, selector) {\n if (elem == null) {\n return;\n }\n if (typeof selector === 'function') {\n return removeClass(elem, selector(getClass(elem)));\n }\n if ((!selector || typeof selector === 'string') && elem.nodeType === 1) {\n const classes = (selector || '').match(rnotwhite) || [];\n const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ');\n let newValue = classes.reduce((memo, cls) => {\n const className = fillSpaces(cls);\n if (memo.indexOf(className) > -1) {\n return memo.replace(className, ' ');\n }\n return memo;\n }, oldValue);\n newValue = selector ? newValue.trim() : '';\n if (oldValue !== newValue) {\n elem.setAttribute('class', newValue);\n }\n }\n}\nexport function toggleClass(elem, selector, stateVal) {\n if (elem == null || selector == null) {\n return;\n }\n if (stateVal != null && typeof selector === 'string') {\n stateVal ? addClass(elem, selector) : removeClass(elem, selector);\n return;\n }\n if (typeof selector === 'function') {\n return toggleClass(elem, selector(getClass(elem), stateVal), stateVal);\n }\n if (typeof selector === 'string') {\n const metches = selector.match(rnotwhite) || [];\n metches.forEach((cls) => {\n hasClass(elem, cls) ? removeClass(elem, cls) : addClass(elem, cls);\n });\n }\n}\n//# sourceMappingURL=class.js.map","import { hasClass } from './class';\nlet idCounter = 0;\nexport function uniqueId() {\n idCounter += 1;\n return `v${idCounter}`;\n}\nexport function ensureId(elem) {\n if (elem.id == null || elem.id === '') {\n elem.id = uniqueId();\n }\n return elem.id;\n}\n/**\n * Returns true if object is an instance of SVGGraphicsElement.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement\n */\nexport function isSVGGraphicsElement(elem) {\n if (elem == null) {\n return false;\n }\n return typeof elem.getScreenCTM === 'function' && elem instanceof SVGElement;\n}\nexport const ns = {\n svg: 'http://www.w3.org/2000/svg',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xlink: 'http://www.w3.org/1999/xlink',\n xhtml: 'http://www.w3.org/1999/xhtml',\n};\nexport const svgVersion = '1.1';\nexport function createElement(tagName, doc = document) {\n return doc.createElement(tagName);\n}\nexport function createElementNS(tagName, namespaceURI = ns.xhtml, doc = document) {\n return doc.createElementNS(namespaceURI, tagName);\n}\nexport function createSvgElement(tagName, doc = document) {\n return createElementNS(tagName, ns.svg, doc);\n}\nexport function createSvgDocument(content) {\n if (content) {\n const xml = `<svg xmlns=\"${ns.svg}\" xmlns:xlink=\"${ns.xlink}\" version=\"${svgVersion}\">${content}</svg>`; // lgtm[js/html-constructed-from-input]\n const { documentElement } = parseXML(xml, { async: false });\n return documentElement;\n }\n const svg = document.createElementNS(ns.svg, 'svg');\n svg.setAttributeNS(ns.xmlns, 'xmlns:xlink', ns.xlink);\n svg.setAttribute('version', svgVersion);\n return svg;\n}\nexport function parseXML(data, options = {}) {\n let xml;\n try {\n const parser = new DOMParser();\n if (options.async != null) {\n const instance = parser;\n instance.async = options.async;\n }\n xml = parser.parseFromString(data, options.mimeType || 'text/xml');\n }\n catch (error) {\n xml = undefined;\n }\n if (!xml || xml.getElementsByTagName('parsererror').length) {\n throw new Error(`Invalid XML: ${data}`);\n }\n return xml;\n}\nexport function tagName(node, lowercase = true) {\n const nodeName = node.nodeName;\n return lowercase ? nodeName.toLowerCase() : nodeName.toUpperCase();\n}\nexport function index(elem) {\n let index = 0;\n let node = elem.previousSibling;\n while (node) {\n if (node.nodeType === 1) {\n index += 1;\n }\n node = node.previousSibling;\n }\n return index;\n}\nexport function find(elem, selector) {\n return elem.querySelectorAll(selector);\n}\nexport function findOne(elem, selector) {\n return elem.querySelector(selector);\n}\nexport function findParentByClass(elem, className, terminator) {\n const ownerSVGElement = elem.ownerSVGElement;\n let node = elem.parentNode;\n while (node && node !== terminator && node !== ownerSVGElement) {\n if (hasClass(node, className)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\nexport function contains(parent, child) {\n const bup = child && child.parentNode;\n return (parent === bup ||\n !!(bup && bup.nodeType === 1 && parent.compareDocumentPosition(bup) & 16) // eslint-disable-line no-bitwise\n );\n}\nexport function remove(elem) {\n if (elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n}\nexport function empty(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n}\nexport function append(elem, elems) {\n const arr = Array.isArray(elems) ? elems : [elems];\n arr.forEach((child) => {\n if (child != null) {\n elem.appendChild(child);\n }\n });\n}\nexport function prepend(elem, elems) {\n const child = elem.firstChild;\n return child ? before(child, elems) : append(elem, elems);\n}\nexport function before(elem, elems) {\n const parent = elem.parentNode;\n if (parent) {\n const arr = Array.isArray(elems) ? elems : [elems];\n arr.forEach((child) => {\n if (child != null) {\n parent.insertBefore(child, elem);\n }\n });\n }\n}\nexport function appendTo(elem, target) {\n if (target != null) {\n target.appendChild(elem);\n }\n}\n// Determines whether a node is an HTML node\nexport function isHTMLElement(elem) {\n try {\n // Using W3 DOM2 (works for FF, Opera and Chrome)\n return elem instanceof HTMLElement;\n }\n catch (e) {\n // Browsers not supporting W3 DOM2 don't have HTMLElement and\n // an exception is thrown and we end up here. Testing some\n // properties that all elements have (works on IE7)\n return (typeof elem === 'object' &&\n elem.nodeType === 1 &&\n typeof elem.style === 'object' &&\n typeof elem.ownerDocument === 'object');\n }\n}\n//# sourceMappingURL=elem.js.map","import { ns } from './elem';\nimport { kebabCase } from '../string/format';\nexport function getAttribute(elem, name) {\n return elem.getAttribute(name);\n}\nexport function removeAttribute(elem, name) {\n const qualified = qualifyAttr(name);\n if (qualified.ns) {\n if (elem.hasAttributeNS(qualified.ns, qualified.local)) {\n elem.removeAttributeNS(qualified.ns, qualified.local);\n }\n }\n else if (elem.hasAttribute(name)) {\n elem.removeAttribute(name);\n }\n}\nexport function setAttribute(elem, name, value) {\n if (value == null) {\n return removeAttribute(elem, name);\n }\n const qualified = qualifyAttr(name);\n if (qualified.ns && typeof value === 'string') {\n elem.setAttributeNS(qualified.ns, name, value);\n }\n else if (name === 'id') {\n elem.id = `${value}`;\n }\n else {\n elem.setAttribute(name, `${value}`);\n }\n}\nexport function setAttributes(elem, attrs) {\n Object.keys(attrs).forEach((name) => {\n setAttribute(elem, name, attrs[name]);\n });\n}\nexport function attr(elem, name, value) {\n if (name == null) {\n const attrs = elem.attributes;\n const ret = {};\n for (let i = 0; i < attrs.length; i += 1) {\n ret[attrs[i].name] = attrs[i].value;\n }\n return ret;\n }\n if (typeof name === 'string' && value === undefined) {\n return elem.getAttribute(name);\n }\n if (typeof name === 'object') {\n setAttributes(elem, name);\n }\n else {\n setAttribute(elem, name, value);\n }\n}\nexport function qualifyAttr(name) {\n if (name.indexOf(':') !== -1) {\n const combinedKey = name.split(':');\n return {\n ns: ns[combinedKey[0]],\n local: combinedKey[1],\n };\n }\n return {\n ns: null,\n local: name,\n };\n}\nexport function kebablizeAttrs(attrs) {\n const result = {};\n Object.keys(attrs).forEach((key) => {\n const name = kebabCase(key);\n result[name] = attrs[key];\n });\n return result;\n}\nexport function styleToObject(styleString) {\n const ret = {};\n const styles = styleString.split(';');\n styles.forEach((item) => {\n const section = item.trim();\n if (section) {\n const pair = section.split('=');\n if (pair.length) {\n ret[pair[0].trim()] = pair[1] ? pair[1].trim() : '';\n }\n }\n });\n return ret;\n}\nexport function mergeAttrs(target, source) {\n Object.keys(source).forEach((attr) => {\n if (attr === 'class') {\n target[attr] = target[attr]\n ? `${target[attr]} ${source[attr]}`\n : source[attr];\n }\n else if (attr === 'style') {\n const to = typeof target[attr] === 'object';\n const so = typeof source[attr] === 'object';\n let tt;\n let ss;\n if (to && so) {\n tt = target[attr];\n ss = source[attr];\n }\n else if (to) {\n tt = target[attr];\n ss = styleToObject(source[attr]);\n }\n else if (so) {\n tt = styleToObject(target[attr]);\n ss = source[attr];\n }\n else {\n tt = styleToObject(target[attr]);\n ss = styleToObject(source[attr]);\n }\n target[attr] = mergeAttrs(tt, ss);\n }\n else {\n target[attr] = source[attr];\n }\n });\n return target;\n}\n//# sourceMappingURL=attr.js.map","import { ObjectExt } from '../object';\nimport { mergeAttrs } from '../dom/attr';\nexport function annotate(t, annotations, opt = {}) {\n const offset = opt.offset || 0;\n const compacted = [];\n const ret = [];\n let curr;\n let prev;\n let batch = null;\n for (let i = 0; i < t.length; i += 1) {\n curr = ret[i] = t[i];\n for (let j = 0, jj = annotations.length; j < jj; j += 1) {\n const annotation = annotations[j];\n const start = annotation.start + offset;\n const end = annotation.end + offset;\n if (i >= start && i < end) {\n if (typeof curr === 'string') {\n curr = ret[i] = {\n t: t[i],\n attrs: annotation.attrs,\n };\n }\n else {\n curr.attrs = mergeAttrs(mergeAttrs({}, curr.attrs), annotation.attrs);\n }\n if (opt.includeAnnotationIndices) {\n if (curr.annotations == null) {\n curr.annotations = [];\n }\n curr.annotations.push(j);\n }\n }\n }\n prev = ret[i - 1];\n if (!prev) {\n batch = curr;\n }\n else if (ObjectExt.isObject(curr) && ObjectExt.isObject(prev)) {\n batch = batch;\n // Both previous item and the current one are annotations.\n // If the attributes didn't change, merge the text.\n if (JSON.stringify(curr.attrs) === JSON.stringify(prev.attrs)) {\n batch.t += curr.t;\n }\n else {\n compacted.push(batch);\n batch = curr;\n }\n }\n else if (ObjectExt.isObject(curr)) {\n // Previous item was a string, current item is an annotation.\n batch = batch;\n compacted.push(batch);\n batch = curr;\n }\n else if (ObjectExt.isObject(prev)) {\n // Previous item was an annotation, current item is a string.\n batch = batch;\n compacted.push(batch);\n batch = curr;\n }\n else {\n // Both previous and current item are strings.\n batch = (batch || '') + curr;\n }\n }\n if (batch != null) {\n compacted.push(batch);\n }\n return compacted;\n}\nexport function findAnnotationsAtIndex(annotations, index) {\n return annotations\n ? annotations.filter((a) => a.start < index && index <= a.end)\n : [];\n}\nexport function findAnnotationsBetweenIndexes(annotations, start, end) {\n return annotations\n ? annotations.filter((a) => (start >= a.start && start < a.end) ||\n (end > a.start && end <= a.end) ||\n (a.start >= start && a.end < end))\n : [];\n}\nexport function shiftAnnotations(annotations, index, offset) {\n if (annotations) {\n annotations.forEach((a) => {\n if (a.start < index && a.end >= index) {\n a.end += offset;\n }\n else if (a.start >= index) {\n a.start += offset;\n a.end += offset;\n }\n });\n }\n return annotations;\n}\n//# sourceMappingURL=annotate.js.map","/**\n * Replaces all spaces with the Unicode No-break space.\n * ref: http://www.fileformat.info/info/unicode/char/a0/index.htm\n *\n * IE would otherwise collapse all spaces into one. This is useful\n * e.g. in tests when you want to compare the actual DOM text content\n * without having to add the unicode character in the place of all spaces.\n */\nexport function sanitize(text) {\n return text.replace(/ /g, '\\u00A0');\n}\n//# sourceMappingURL=sanitize.js.map","/**\n * The namespace for JSON-specific functions.\n */\nexport var JSONExt;\n(function (JSONExt) {\n /**\n * A shared frozen empty JSONObject\n */\n JSONExt.emptyObject = Object.freeze({});\n /**\n * A shared frozen empty JSONArray\n */\n JSONExt.emptyArray = Object.freeze([]);\n /**\n * Test whether a JSON value is a primitive.\n *\n * @param value - The JSON value of interest.\n *\n * @returns `true` if the value is a primitive,`false` otherwise.\n */\n function isPrimitive(value) {\n return (value === null ||\n value === undefined ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string');\n }\n JSONExt.isPrimitive = isPrimitive;\n function isArray(value) {\n return Array.isArray(value);\n }\n JSONExt.isArray = isArray;\n function isObject(value) {\n return !isPrimitive(value) && !isArray(value);\n }\n JSONExt.isObject = isObject;\n /**\n * Compare two JSON values for deep equality.\n *\n * @param first - The first JSON value of interest.\n *\n * @param second - The second JSON value of interest.\n *\n * @returns `true` if the values are equivalent, `false` otherwise.\n */\n function deepEqual(first, second) {\n // Check referential and primitive equality first.\n if (first === second) {\n return true;\n }\n // If one is a primitive, the `===` check ruled out the other.\n if (isPrimitive(first) || isPrimitive(second)) {\n return false;\n }\n // Test whether they are arrays.\n const a1 = isArray(first);\n const a2 = isArray(second);\n // Bail if the types are different.\n if (a1 !== a2) {\n return false;\n }\n // If they are both arrays, compare them.\n if (a1 && a2) {\n return deepArrayEqual(first, second);\n }\n // At this point, they must both be objects.\n return deepObjectEqual(first, second);\n }\n JSONExt.deepEqual = deepEqual;\n /**\n * Create a deep copy of a JSON value.\n *\n * @param value - The JSON value to copy.\n *\n * @returns A deep copy of the given JSON value.\n */\n function deepCopy(value) {\n // Do nothing for primitive values.\n if (isPrimitive(value)) {\n return value;\n }\n // Deep copy an array.\n if (isArray(value)) {\n return deepArrayCopy(value);\n }\n // Deep copy an object.\n return deepObjectCopy(value);\n }\n JSONExt.deepCopy = deepCopy;\n /**\n * Compare two JSON arrays for deep equality.\n */\n function deepArrayEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Test the arrays for equal length.\n if (first.length !== second.length) {\n return false;\n }\n // Compare the values for equality.\n for (let i = 0, n = first.length; i < n; i += 1) {\n if (!deepEqual(first[i], second[i])) {\n return false;\n }\n }\n // At this point, the arrays are equal.\n return true;\n }\n /**\n * Compare two JSON objects for deep equality.\n */\n function deepObjectEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Check for the first object's keys in the second object.\n // eslint-disable-next-line\n for (const key in first) {\n if (!(key in second)) {\n return false;\n }\n }\n // Check for the second object's keys in the first object.\n // eslint-disable-next-line\n for (const key in second) {\n if (!(key in first)) {\n return false;\n }\n }\n // Compare the values for equality.\n // eslint-disable-next-line\n for (const key in first) {\n if (!deepEqual(first[key], second[key])) {\n return false;\n }\n }\n // At this point, the objects are equal.\n return true;\n }\n /**\n * Create a deep copy of a JSON array.\n */\n function deepArrayCopy(value) {\n const result = new Array(value.length); // eslint-disable-line\n for (let i = 0, n = value.length; i < n; i += 1) {\n result[i] = deepCopy(value[i]);\n }\n return result;\n }\n /**\n * Create a deep copy of a JSON object.\n */\n function deepObjectCopy(value) {\n const result = {};\n Object.keys(value).forEach((key) => {\n result[key] = deepCopy(value[key]);\n });\n return result;\n }\n})(JSONExt || (JSONExt = {}));\n//# sourceMappingURL=index.js.map","export var DataUri;\n(function (DataUri) {\n function isDataUrl(url) {\n const prefix = 'data:';\n return url.substr(0, prefix.length) === prefix;\n }\n DataUri.isDataUrl = isDataUrl;\n /**\n * Converts an image at `url` to base64-encoded data uri.\n * The mime type of the image is inferred from the `url` file extension.\n */\n function imageToDataUri(url, callback) {\n // No need to convert to data uri if it is already in data uri.\n if (!url || isDataUrl(url)) {\n // Keep the async nature of the function.\n setTimeout(() => callback(null, url));\n return;\n }\n const onError = () => {\n callback(new Error(`Failed to load image: ${url}`));\n };\n const onLoad = window.FileReader\n ? // chrome, IE10+\n (xhr) => {\n if (xhr.status === 200) {\n const reader = new FileReader();\n reader.onload = (evt) => {\n const dataUri = evt.target.result;\n callback(null, dataUri);\n };\n reader.onerror = onError;\n reader.readAsDataURL(xhr.response);\n }\n else {\n onError();\n }\n }\n : (xhr) => {\n const toString = (u8a) => {\n const CHUNK_SZ = 0x8000;\n const c = [];\n for (let i = 0; i < u8a.length; i += CHUNK_SZ) {\n c.push(String.fromCharCode.apply(null, u8a.subarray(i, i + CHUNK_SZ)));\n }\n return c.join('');\n };\n if (xhr.status === 200) {\n let suffix = url.split('.').pop() || 'png';\n if (suffix === 'svg') {\n suffix = 'svg+xml';\n }\n const meta = `data:image/${suffix};base64,`;\n const bytes = new Uint8Array(xhr.response);\n const base64 = meta + btoa(toString(bytes));\n callback(null, base64);\n }\n else {\n onError();\n }\n };\n const xhr = new XMLHttpRequest();\n xhr.responseType = window.FileReader ? 'blob' : 'arraybuffer';\n xhr.open('GET', url, true);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('load', () => onLoad(xhr));\n xhr.send();\n }\n DataUri.imageToDataUri = imageToDataUri;\n function dataUriToBlob(dataUrl) {\n let uri = dataUrl.replace(/\\s/g, '');\n uri = decodeURIComponent(uri);\n const index = uri.indexOf(',');\n const dataType = uri.slice(0, index); // e.g. 'data:image/jpeg;base64'\n const mime = dataType.split(':')[1].split(';')[0]; // e.g. 'image/jpeg'\n const data = uri.slice(index + 1);\n let decodedString;\n if (dataType.indexOf('base64') >= 0) {\n // data may be encoded in base64\n decodedString = atob(data);\n }\n else {\n // convert the decoded string to UTF-8\n decodedString = unescape(encodeURIComponent(data));\n }\n // write the bytes of the string to a typed array\n const ia = new Uint8Array(decodedString.length);\n for (let i = 0; i < decodedString.length; i += 1) {\n ia[i] = decodedString.charCodeAt(i);\n }\n return new Blob([ia], { type: mime });\n }\n DataUri.dataUriToBlob = dataUriToBlob;\n function downloadBlob(blob, fileName) {\n const msSaveBlob = window.navigator.msSaveBlob;\n if (msSaveBlob) {\n // requires IE 10+\n // pulls up a save dialog\n msSaveBlob(blob, fileName);\n }\n else {\n // other browsers\n // downloads directly in Chrome and Safari\n // presents a save/open dialog in Firefox\n // Firefox bug: `from` field in save dialog always shows `from:blob:`\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1053327\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n // mark the url for garbage collection\n window.URL.revokeObjectURL(url);\n }\n }\n DataUri.downloadBlob = downloadBlob;\n function downloadDataUri(dataUrl, fileName) {\n const blob = dataUriToBlob(dataUrl);\n downloadBlob(blob, fileName);\n }\n DataUri.downloadDataUri = downloadDataUri;\n function parseViewBox(svg) {\n const matches = svg.match(/<svg[^>]*viewBox\\s*=\\s*([\"']?)(.+?)\\1[^>]*>/i);\n if (matches && matches[2]) {\n return matches[2].replace(/\\s+/, ' ').split(' ');\n }\n return null;\n }\n function getNumber(str) {\n const ret = parseFloat(str);\n return Number.isNaN(ret) ? null : ret;\n }\n function svgToDataUrl(svg, options = {}) {\n let viewBox = null;\n const getNumberFromViewBox = (index) => {\n if (viewBox == null) {\n viewBox = parseViewBox(svg);\n }\n if (viewBox != null) {\n return getNumber(viewBox[index]);\n }\n return null;\n };\n const getNumberFromMatches = (reg) => {\n const matches = svg.match(reg);\n if (matches && matches[2]) {\n return getNumber(matches[2]);\n }\n return null;\n };\n let w = options.width;\n if (w == null) {\n w = getNumberFromMatches(/<svg[^>]*width\\s*=\\s*([\"']?)(.+?)\\1[^>]*>/i);\n }\n if (w == null) {\n w = getNumberFromViewBox(2);\n }\n if (w == null) {\n throw new Error('Can not parse width from svg string');\n }\n let h = options.height;\n if (h == null) {\n h = getNumberFromMatches(/<svg[^>]*height\\s*=\\s*([\"']?)(.+?)\\1[^>]*>/i);\n }\n if (h == null) {\n h = getNumberFromViewBox(3);\n }\n if (h == null) {\n throw new Error('Can not parse height from svg string');\n }\n const decoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n const header = 'data:image/svg+xml';\n const dataUrl = `${header},${decoded}`;\n return dataUrl;\n }\n DataUri.svgToDataUrl = svgToDataUrl;\n})(DataUri || (DataUri = {}));\n//# sourceMappingURL=index.js.map","import jQuery from 'jquery';\nlet millimeterSize;\nconst supportedUnits = {\n px(val) {\n return val;\n },\n mm(val) {\n return millimeterSize * val;\n },\n cm(val) {\n return millimeterSize * val * 10;\n },\n in(val) {\n return millimeterSize * val * 25.4;\n },\n pt(val) {\n return millimeterSize * ((25.4 * val) / 72);\n },\n pc(val) {\n return millimeterSize * ((25.4 * val) / 6);\n },\n};\n// eslint-disable-next-line\nexport var Unit;\n(function (Unit) {\n function measure(cssWidth, cssHeight, unit) {\n const div = jQuery('<div/>')\n .css({\n display: 'inline-block',\n position: 'absolute',\n left: -15000,\n top: -15000,\n width: cssWidth + (unit || ''),\n height: cssHeight + (unit || ''),\n })\n .appendTo(document.body);\n const size = {\n width: div.width() || 0,\n height: div.height() || 0,\n };\n div.remove();\n return size;\n }\n Unit.measure = measure;\n function toPx(val, unit) {\n if (millimeterSize == null) {\n millimeterSize = measure(`1`, `1`, 'mm').width;\n }\n const convert = unit ? supportedUnits[unit] : null;\n if (convert) {\n return convert(val);\n }\n return val;\n }\n Unit.toPx = toPx;\n})(Unit || (Unit = {}));\n//# sourceMappingURL=index.js.map","export const requestAnimationFrame = (function () {\n let raf;\n const win = window;\n if (win != null) {\n raf =\n win.requestAnimationFrame ||\n win.webkitRequestAnimationFrame ||\n win.mozRequestAnimationFrame ||\n win.oRequestAnimationFrame ||\n win.msRequestAnimationFrame;\n if (raf != null) {\n raf = raf.bind(win);\n }\n }\n if (raf == null) {\n let lastTime = 0;\n raf = (callback) => {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(() => {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n return raf;\n})();\nexport const cancelAnimationFrame = (function () {\n let caf;\n const win = window;\n if (win != null) {\n caf =\n win.cancelAnimationFrame ||\n win.webkitCancelAnimationFrame ||\n win.webkitCancelRequestAnimationFrame ||\n win.msCancelAnimationFrame ||\n win.msCancelRequestAnimationFrame ||\n win.oCancelAnimationFrame ||\n win.oCancelRequestAnimationFrame ||\n win.mozCancelAnimationFrame ||\n win.mozCancelRequestAnimationFrame;\n if (caf) {\n caf = caf.bind(win);\n }\n }\n if (caf == null) {\n caf = clearTimeout;\n }\n return caf;\n})();\n//# sourceMappingURL=af.js.map","const hyphenPattern = /-(.)/g;\nfunction camelize(str) {\n return str.replace(hyphenPattern, (_, char) => char.toUpperCase());\n}\nconst memoized = {};\nconst prefixes = ['Webkit', 'ms', 'Moz', 'O'];\nconst testStyle = document ? document.createElement('div').style : {};\nfunction getWithPrefix(name) {\n for (let i = 0; i < prefixes.length; i += 1) {\n const prefixedName = prefixes[i] + name;\n if (prefixedName in testStyle) {\n return prefixedName;\n }\n }\n return null;\n}\nexport function getVendorPrefixedName(property) {\n const name = camelize(property);\n if (memoized[name] == null) {\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n memoized[name] = name in testStyle ? name : getWithPrefix(capitalizedName);\n }\n return memoized[name];\n}\n//# sourceMappingURL=prefix.js.map","import { getVendorPrefixedName } from './prefix';\nexport function setPrefixedStyle(style, name, value) {\n const vendor = getVendorPrefixedName(name);\n if (vendor != null) {\n style[vendor] = value;\n }\n style[name] = value;\n}\nexport function getComputedStyle(elem, name) {\n // IE9+\n const computed = elem.ownerDocument &&\n elem.ownerDocument.defaultView &&\n elem.ownerDocument.defaultView.opener\n ? elem.ownerDocument.defaultView.getComputedStyle(elem, null)\n : window.getComputedStyle(elem, null);\n if (computed && name) {\n return computed.getPropertyValue(name) || computed[name];\n }\n return computed;\n}\nexport function hasScrollbars(container) {\n const style = getComputedStyle(container);\n return (style != null && (style.overflow === 'scroll' || style.overflow === 'auto'));\n}\n//# sourceMappingURL=style.js.map","export const clearSelection = (function () {\n const doc = document;\n if (doc.selection) {\n return function () {\n doc.selection.empty();\n };\n }\n if (window.getSelection) {\n return function () {\n const selection = window.getSelection();\n if (selection) {\n if (selection.empty) {\n selection.empty();\n }\n else if (selection.removeAllRanges) {\n selection.removeAllRanges();\n }\n }\n };\n }\n return function () { };\n})();\n//# sourceMappingURL=selection.js.map","export var Angle;\n(function (Angle) {\n /**\n * Converts radian angle to degree angle.\n * @param rad The radians to convert.\n */\n function toDeg(rad) {\n return ((180 * rad) / Math.PI) % 360;\n }\n Angle.toDeg = toDeg;\n /**\n * Converts degree angle to radian angle.\n * @param deg The degree angle to convert.\n * @param over360\n */\n Angle.toRad = function (deg, over360 = false) {\n const d = over360 ? deg : deg % 360;\n return (d * Math.PI) / 180;\n };\n /**\n * Returns the angle in degrees and clamps its value between `0` and `360`.\n */\n function normalize(angle) {\n return (angle % 360) + (angle < 0 ? 360 : 0);\n }\n Angle.normalize = normalize;\n})(Angle || (Angle = {}));\n//# sourceMappingURL=angle.js.map","export function round(num, precision = 0) {\n return Number.isInteger(num) ? num : +num.toFixed(precision);\n}\nexport function random(min, max) {\n let mmin;\n let mmax;\n if (max == null) {\n mmax = min == null ? 1 : min;\n mmin = 0;\n }\n else {\n mmax = max;\n mmin = min == null ? 0 : min;\n }\n if (mmax < mmin) {\n const temp = mmin;\n mmin = mmax;\n mmax = temp;\n }\n return Math.floor(Math.random() * (mmax - mmin + 1) + mmin);\n}\nexport function clamp(value, min, max) {\n if (Number.isNaN(value)) {\n return NaN;\n }\n if (Number.isNaN(min) || Number.isNaN(max)) {\n return 0;\n }\n return min < max\n ? value < min\n ? min\n : value > max\n ? max\n : value\n : value < max\n ? max\n : value > min\n ? min\n : value;\n}\nexport function snapToGrid(value, gridSize) {\n return gridSize * Math.round(value / gridSize);\n}\nexport function containsPoint(rect, point) {\n return (point != null &&\n rect != null &&\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height);\n}\nexport function squaredLength(p1, p2) {\n const dx = p1.x - p2.x;\n const dy = p1.y - p2.y;\n return dx * dx + dy * dy;\n}\n//# sourceMappingURL=util.js.map","export class Geometry {\n valueOf() {\n return this.toJSON();\n }\n toString() {\n return JSON.stringify(this.toJSON());\n }\n}\n//# sourceMappingURL=geometry.js.map","import * as util from './util';\nimport { Angle } from './angle';\nimport { Geometry } from './geometry';\nexport class Point extends Geometry {\n constructor(x, y) {\n super();\n this.x = x == null ? 0 : x;\n this.y = y == null ? 0 : y;\n }\n get [Symbol.toStringTag]() {\n return Point.toStringTag;\n }\n /**\n * Rounds the point to the given precision.\n */\n round(precision = 0) {\n this.x = util.round(this.x, precision);\n this.y = util.round(this.y, precision);\n return this;\n }\n add(x, y) {\n const p = Point.create(x, y);\n this.x += p.x;\n this.y += p.y;\n return this;\n }\n update(x, y) {\n const p = Point.create(x, y);\n this.x = p.x;\n this.y = p.y;\n return this;\n }\n translate(dx, dy) {\n const t = Point.create(dx, dy);\n this.x += t.x;\n this.y += t.y;\n return this;\n }\n /**\n * Rotate the point by `degree` around `center`.\n */\n rotate(degree, center) {\n const p = Point.rotate(this, degree, center);\n this.x = p.x;\n this.y = p.y;\n return this;\n }\n /**\n * Scale point by `sx` and `sy` around the given `origin`. If origin is not\n * specified, the point is scaled around `0,0`.\n */\n scale(sx, sy, origin = new Point()) {\n const ref = Point.create(origin);\n this.x = ref.x + sx * (this.x - ref.x);\n this.y = ref.y + sy * (this.y - ref.y);\n return this;\n }\n /**\n * Chooses the point closest to this point from among `points`. If `points`\n * is an empty array, `null` is returned.\n */\n closest(points) {\n if (points.length === 1) {\n return Point.create(points[0]);\n }\n let ret = null;\n let min = Infinity;\n points.forEach((p) => {\n const dist = this.squaredDistance(p);\n if (dist < min) {\n ret = p;\n min = dist;\n }\n });\n return ret ? Point.create(ret) : null;\n }\n /**\n * Returns the distance between the point and another point `p`.\n */\n distance(p) {\n return Math.sqrt(this.squaredDistance(p));\n }\n /**\n * Returns the squared distance between the point and another point `p`.\n *\n * Useful for distance comparisons in which real distance is not necessary\n * (saves one `Math.sqrt()` operation).\n */\n squaredDistance(p) {\n const ref = Point.create(p);\n const dx = this.x - ref.x;\n const dy = this.y - ref.y;\n return dx * dx + dy * dy;\n }\n manhattanDistance(p) {\n const ref = Point.create(p);\n return Math.abs(ref.x - this.x) + Math.abs(ref.y - this.y);\n }\n /**\n * Returns the magnitude of the point vector.\n *\n * @see http://en.wikipedia.org/wiki/Magnitude_(mathematics)\n */\n magnitude() {\n return Math.sqrt(this.x * this.x + this.y * this.y) || 0.01;\n }\n /**\n * Returns the angle(in degrees) between vector from this point to `p` and\n * the x-axis.\n */\n theta(p = new Point()) {\n const ref = Point.create(p);\n const y = -(ref.y - this.y); // invert the y-axis.\n const x = ref.x - this.x;\n let rad = Math.atan2(y, x);\n // Correction for III. and IV. quadrant.\n if (rad < 0) {\n rad = 2 * Math.PI + rad;\n }\n return (180 * rad) / Math.PI;\n }\n /**\n * Returns the angle(in degrees) between vector from this point to `p1` and\n * the vector from this point to `p2`.\n *\n * The ordering of points `p1` and `p2` is important.\n *\n * The function returns a value between `0` and `180` when the angle (in the\n * direction from `p1` to `p2`) is clockwise, and a value between `180` and\n * `360` when the angle is counterclockwise.\n *\n * Returns `NaN` if either of the points `p1` and `p2` is equal with this point.\n */\n angleBetween(p1, p2) {\n if (this.equals(p1) || this.equals(p2)) {\n return NaN;\n }\n let angle = this.theta(p2) - this.theta(p1);\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n }\n /**\n * Returns the angle(in degrees) between the line from `(0,0)` and this point\n * and the line from `(0,0)` to `p`.\n *\n * The function returns a value between `0` and `180` when the angle (in the\n * direction from this point to `p`) is clockwise, and a value between `180`\n * and `360` when the angle is counterclockwise. Returns `NaN` if called from\n * point `(0,0)` or if `p` is `(0,0)`.\n */\n vectorAngle(p) {\n const zero = new Point(0, 0);\n return zero.angleBetween(this, p);\n }\n /**\n * Converts rectangular to polar coordinates.\n */\n toPolar(origin) {\n this.update(Point.toPolar(this, origin));\n return this;\n }\n /**\n * Returns the change in angle(in degrees) that is the result of moving the\n * point from its previous position to its current position.\n *\n * More specifically, this function computes the angle between the line from\n * the ref point to the previous position of this point(i.e. current position\n * `-dx`, `-dy`) and the line from the `ref` point to the current position of\n * this point.\n *\n * The function returns a positive value between `0` and `180` when the angle\n * (in the direction from previous position of this point to its current\n * position) is clockwise, and a negative value between `0` and `-180` when\n * the angle is counterclockwise.\n *\n * The function returns `0` if the previous and current positions of this\n * point are the same (i.e. both `dx` and `dy` are `0`).\n */\n changeInAngle(dx, dy, ref = new Point()) {\n // Revert the translation and measure the change in angle around x-axis.\n return this.clone().translate(-dx, -dy).theta(ref) - this.theta(ref);\n }\n /**\n * If the point lies outside the rectangle `rect`, adjust the point so that\n * it becomes the nearest point on the boundary of `rect`.\n */\n adhereToRect(rect) {\n if (!util.containsPoint(rect, this)) {\n this.x = Math.min(Math.max(this.x, rect.x), rect.x + rect.width);\n this.y = Math.min(Math.max(this.y, rect.y), rect.y + rect.height);\n }\n return this;\n }\n /**\n * Returns the bearing(cardinal direction) between me and the given point.\n *\n * @see https://en.wikipedia.org/wiki/Cardinal_direction\n */\n bearing(p) {\n const ref = Point.create(p);\n const lat1 = Angle.toRad(this.y);\n const lat2 = Angle.toRad(ref.y);\n const lon1 = this.x;\n const lon2 = ref.x;\n const dLon = Angle.toRad(lon2 - lon1);\n const y = Math.sin(dLon) * Math.cos(lat2);\n const x = Math.cos(lat1) * Math.sin(lat2) -\n Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);\n const brng = Angle.toDeg(Math.atan2(y, x));\n const bearings = ['NE', 'E', 'SE', 'S', 'SW', 'W', 'NW', 'N'];\n let index = brng - 22.5;\n if (index < 0) {\n index += 360;\n }\n index = parseInt((index / 45), 10);\n return bearings[index];\n }\n /**\n * Returns the cross product of the vector from me to `p1` and the vector\n * from me to `p2`.\n *\n * The left-hand rule is used because the coordinate system is left-handed.\n */\n cross(p1, p2) {\n if (p1 != null && p2 != null) {\n const a = Point.create(p1);\n const b = Point.create(p2);\n return (b.x - this.x) * (a.y - this.y) - (b.y - this.y) * (a.x - this.x);\n }\n return NaN;\n }\n /**\n * Returns the dot product of this point with given other point.\n */\n dot(p) {\n const ref = Point.create(p);\n return this.x * ref.x + this.y * ref.y;\n }\n diff(dx, dy) {\n if (typeof dx === 'number') {\n return new Point(this.x - dx, this.y - dy);\n }\n const p = Point.create(dx);\n return new Point(this.x - p.x, this.y - p.y);\n }\n /**\n * Returns an interpolation between me and point `p` for a parametert in\n * the closed interval `[0, 1]`.\n */\n lerp(p, t) {\n const ref = Point.create(p);\n return new Point((1 - t) * this.x + t * ref.x, (1 - t) * this.y + t * ref.y);\n }\n /**\n * Normalize the point vector, scale the line segment between `(0, 0)`\n * and the point in order for it to have the given length. If length is\n * not specified, it is considered to be `1`; in that case, a unit vector\n * is computed.\n */\n normalize(length = 1) {\n const scale = length / this.magnitude();\n return this.scale(scale, scale);\n }\n /**\n * Moves this point along the line starting from `ref` to this point by a\n * certain `distance`.\n */\n move(ref, distance) {\n const p = Point.create(ref);\n const rad = Angle.toRad(p.theta(this));\n return this.translate(Math.cos(rad) * distance, -Math.sin(rad) * distance);\n }\n /**\n * Returns a point that is the reflection of me with the center of inversion\n * in `ref` point.\n */\n reflection(ref) {\n return Point.create(ref).move(this, this.distance(ref));\n }\n snapToGrid(gx, gy) {\n this.x = util.snapToGrid(this.x, gx);\n this.y = util.snapToGrid(this.y, gy == null ? gx : gy);\n return this;\n }\n equals(p) {\n const ref = Point.create(p);\n return ref != null && ref.x === this.x && ref.y === this.y;\n }\n clone() {\n return Point.clone(this);\n }\n /**\n * Returns the point as a simple JSON object. For example: `{ x: 0, y: 0 }`.\n */\n toJSON() {\n return Point.toJSON(this);\n }\n serialize() {\n return `${this.x} ${this.y}`;\n }\n}\n(function (Point) {\n Point.toStringTag = `X6.Geometry.${Point.name}`;\n function isPoint(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Point) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const point = instance;\n if ((tag == null || tag === Point.toStringTag) &&\n typeof point.x === 'number' &&\n typeof point.y === 'number' &&\n typeof point.toPolar === 'function') {\n return true;\n }\n return false;\n }\n Point.isPoint = isPoint;\n})(Point || (Point = {}));\n(function (Point) {\n function isPointLike(p) {\n return (p != null &&\n typeof p === 'object' &&\n typeof p.x === 'number' &&\n typeof p.y === 'number');\n }\n Point.isPointLike = isPointLike;\n function isPointData(p) {\n return (p != null &&\n Array.isArray(p) &&\n p.length === 2 &&\n typeof p[0] === 'number' &&\n typeof p[1] === 'number');\n }\n Point.isPointData = isPointData;\n})(Point || (Point = {}));\n(function (Point) {\n function create(x, y) {\n if (x == null || typeof x === 'number') {\n return new Point(x, y);\n }\n return clone(x);\n }\n Point.create = create;\n function clone(p) {\n if (Point.isPoint(p)) {\n return new Point(p.x, p.y);\n }\n if (Array.isArray(p)) {\n return new Point(p[0], p[1]);\n }\n return new Point(p.x, p.y);\n }\n Point.clone = clone;\n function toJSON(p) {\n if (Point.isPoint(p)) {\n return { x: p.x, y: p.y };\n }\n if (Array.isArray(p)) {\n return { x: p[0], y: p[1] };\n }\n return { x: p.x, y: p.y };\n }\n Point.toJSON = toJSON;\n /**\n * Returns a new Point object from the given polar coordinates.\n * @see http://en.wikipedia.org/wiki/Polar_coordinate_system\n */\n function fromPolar(r, rad, origin = new Point()) {\n let x = Math.abs(r * Math.cos(rad));\n let y = Math.abs(r * Math.sin(rad));\n const org = clone(origin);\n const deg = Angle.normalize(Angle.toDeg(rad));\n if (deg < 90) {\n y = -y;\n }\n else if (deg < 180) {\n x = -x;\n y = -y;\n }\n else if (deg < 270) {\n x = -x;\n }\n return new Point(org.x + x, org.y + y);\n }\n Point.fromPolar = fromPolar;\n /**\n * Converts rectangular to polar coordinates.\n */\n function toPolar(point, origin = new Point()) {\n const p = clone(point);\n const o = clone(origin);\n const dx = p.x - o.x;\n const dy = p.y - o.y;\n return new Point(Math.sqrt(dx * dx + dy * dy), // r\n Angle.toRad(o.theta(p)));\n }\n Point.toPolar = toPolar;\n function equals(p1, p2) {\n if (p1 === p2) {\n return true;\n }\n if (p1 != null && p2 != null) {\n return p1.x === p2.x && p1.y === p2.y;\n }\n return false;\n }\n Point.equals = equals;\n function equalPoints(p1, p2) {\n if ((p1 == null && p2 != null) ||\n (p1 != null && p2 == null) ||\n (p1 != null && p2 != null && p1.length !== p2.length)) {\n return false;\n }\n if (p1 != null && p2 != null) {\n for (let i = 0, ii = p1.length; i < ii; i += 1) {\n if (!equals(p1[i], p2[i])) {\n return false;\n }\n }\n }\n return true;\n }\n Point.equalPoints = equalPoints;\n /**\n * Returns a point with random coordinates that fall within the range\n * `[x1, x2]` and `[y1, y2]`.\n */\n function random(x1, x2, y1, y2) {\n return new Point(util.random(x1, x2), util.random(y1, y2));\n }\n Point.random = random;\n function rotate(point, angle, center) {\n const rad = Angle.toRad(Angle.normalize(-angle));\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n return rotateEx(point, cos, sin, center);\n }\n Point.rotate = rotate;\n function rotateEx(point, cos, sin, center = new Point()) {\n const source = clone(point);\n const origin = clone(center);\n const dx = source.x - origin.x;\n const dy = source.y - origin.y;\n const x1 = dx * cos - dy * sin;\n const y1 = dy * cos + dx * sin;\n return new Point(x1 + origin.x, y1 + origin.y);\n }\n Point.rotateEx = rotateEx;\n})(Point || (Point = {}));\n//# sourceMappingURL=point.js.map","import * as util from './util';\nimport { Angle } from './angle';\nimport { Line } from './line';\nimport { Point } from './point';\nimport { Geometry } from './geometry';\nexport class Rectangle extends Geometry {\n constructor(x, y, width, height) {\n super();\n this.x = x == null ? 0 : x;\n this.y = y == null ? 0 : y;\n this.width = width == null ? 0 : width;\n this.height = height == null ? 0 : height;\n }\n get [Symbol.toStringTag]() {\n return Rectangle.toStringTag;\n }\n get left() {\n return this.x;\n }\n get top() {\n return this.y;\n }\n get right() {\n return this.x + this.width;\n }\n get bottom() {\n return this.y + this.height;\n }\n get origin() {\n return new Point(this.x, this.y);\n }\n get topLeft() {\n return new Point(this.x, this.y);\n }\n get topCenter() {\n return new Point(this.x + this.width / 2, this.y);\n }\n get topRight() {\n return new Point(this.x + this.width, this.y);\n }\n get center() {\n return new Point(this.x + this.width / 2, this.y + this.height / 2);\n }\n get bottomLeft() {\n return new Point(this.x, this.y + this.height);\n }\n get bottomCenter() {\n return new Point(this.x + this.width / 2, this.y + this.height);\n }\n get bottomRight() {\n return new Point(this.x + this.width, this.y + this.height);\n }\n get corner() {\n return new Point(this.x + this.width, this.y + this.height);\n }\n get rightMiddle() {\n return new Point(this.x + this.width, this.y + this.height / 2);\n }\n get leftMiddle() {\n return new Point(this.x, this.y + this.height / 2);\n }\n get topLine() {\n return new Line(this.topLeft, this.topRight);\n }\n get rightLine() {\n return new Line(this.topRight, this.bottomRight);\n }\n get bottomLine() {\n return new Line(this.bottomLeft, this.bottomRight);\n }\n get leftLine() {\n return new Line(this.topLeft, this.bottomLeft);\n }\n getOrigin() {\n return this.origin;\n }\n getTopLeft() {\n return this.topLeft;\n }\n getTopCenter() {\n return this.topCenter;\n }\n getTopRight() {\n return this.topRight;\n }\n getCenter() {\n return this.center;\n }\n getCenterX() {\n return this.x + this.width / 2;\n }\n getCenterY() {\n return this.y + this.height / 2;\n }\n getBottomLeft() {\n return this.bottomLeft;\n }\n getBottomCenter() {\n return this.bottomCenter;\n }\n getBottomRight() {\n return this.bottomRight;\n }\n getCorner() {\n return this.corner;\n }\n getRightMiddle() {\n return this.rightMiddle;\n }\n getLeftMiddle() {\n return this.leftMiddle;\n }\n getTopLine() {\n return this.topLine;\n }\n getRightLine() {\n return this.rightLine;\n }\n getBottomLine() {\n return this.bottomLine;\n }\n getLeftLine() {\n return this.leftLine;\n }\n /**\n * Returns a rectangle that is the bounding box of the rectangle.\n *\n * If `angle` is specified, the bounding box calculation will take into\n * account the rotation of the rectangle by angle degrees around its center.\n */\n bbox(angle) {\n if (!angle) {\n return this.clone();\n }\n const rad = Angle.toRad(angle);\n const st = Math.abs(Math.sin(rad));\n const ct = Math.abs(Math.cos(rad));\n const w = this.width * ct + this.height * st;\n const h = this.width * st + this.height * ct;\n return new Rectangle(this.x + (this.width - w) / 2, this.y + (this.height - h) / 2, w, h);\n }\n round(precision = 0) {\n this.x = util.round(this.x, precision);\n this.y = util.round(this.y, precision);\n this.width = util.round(this.width, precision);\n this.height = util.round(this.height, precision);\n return this;\n }\n add(x, y, width, height) {\n const rect = Rectangle.create(x, y, width, height);\n const minX = Math.min(this.x, rect.x);\n const minY = Math.min(this.y, rect.y);\n const maxX = Math.max(this.x + this.width, rect.x + rect.width);\n const maxY = Math.max(this.y + this.height, rect.y + rect.height);\n this.x = minX;\n this.y = minY;\n this.width = maxX - minX;\n this.height = maxY - minY;\n return this;\n }\n update(x, y, width, height) {\n const rect = Rectangle.create(x, y, width, height);\n this.x = rect.x;\n this.y = rect.y;\n this.width = rect.width;\n this.height = rect.height;\n return this;\n }\n inflate(dx, dy) {\n const w = dx;\n const h = dy != null ? dy : dx;\n this.x -= w;\n this.y -= h;\n this.width += 2 * w;\n this.height += 2 * h;\n return this;\n }\n snapToGrid(gx, gy) {\n const origin = this.origin.snapToGrid(gx, gy);\n const corner = this.corner.snapToGrid(gx, gy);\n this.x = origin.x;\n this.y = origin.y;\n this.width = corner.x - origin.x;\n this.height = corner.y - origin.y;\n return this;\n }\n translate(tx, ty) {\n const p = Point.create(tx, ty);\n this.x += p.x;\n this.y += p.y;\n return this;\n }\n scale(sx, sy, origin = new Point()) {\n const pos = this.origin.scale(sx, sy, origin);\n this.x = pos.x;\n this.y = pos.y;\n this.width *= sx;\n this.height *= sy;\n return this;\n }\n rotate(degree, center = this.getCenter()) {\n if (degree !== 0) {\n const rad = Angle.toRad(degree);\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n let p1 = this.getOrigin();\n let p2 = this.getTopRight();\n let p3 = this.getBottomRight();\n let p4 = this.getBottomLeft();\n p1 = Point.rotateEx(p1, cos, sin, center);\n p2 = Point.rotateEx(p2, cos, sin, center);\n p3 = Point.rotateEx(p3, cos, sin, center);\n p4 = Point.rotateEx(p4, cos, sin, center);\n const rect = new Rectangle(p1.x, p1.y, 0, 0);\n rect.add(p2.x, p2.y, 0, 0);\n rect.add(p3.x, p3.y, 0, 0);\n rect.add(p4.x, p4.y, 0, 0);\n this.update(rect);\n }\n return this;\n }\n rotate90() {\n const t = (this.width - this.height) / 2;\n this.x += t;\n this.y -= t;\n const tmp = this.width;\n this.width = this.height;\n this.height = tmp;\n return this;\n }\n /**\n * Translates the rectangle by `rect.x` and `rect.y` and expand it by\n * `rect.width` and `rect.height`.\n */\n moveAndExpand(rect) {\n const ref = Rectangle.clone(rect);\n this.x += ref.x || 0;\n this.y += ref.y || 0;\n this.width += ref.width || 0;\n this.height += ref.height || 0;\n return this;\n }\n /**\n * Returns an object where `sx` and `sy` give the maximum scaling that can be\n * applied to the rectangle so that it would still fit into `limit`. If\n * `origin` is specified, the rectangle is scaled around it; otherwise, it is\n * scaled around its center.\n */\n getMaxScaleToFit(limit, origin = this.center) {\n const rect = Rectangle.clone(limit);\n const ox = origin.x;\n const oy = origin.y;\n // Find the maximal possible scale for all corners, so when the scale\n // is applied the point is still inside the rectangle.\n let sx1 = Infinity;\n let sx2 = Infinity;\n let sx3 = Infinity;\n let sx4 = Infinity;\n let sy1 = Infinity;\n let sy2 = Infinity;\n let sy3 = Infinity;\n let sy4 = Infinity;\n // Top Left\n const p1 = rect.topLeft;\n if (p1.x < ox) {\n sx1 = (this.x - ox) / (p1.x - ox);\n }\n if (p1.y < oy) {\n sy1 = (this.y - oy) / (p1.y - oy);\n }\n // Bottom Right\n const p2 = rect.bottomRight;\n if (p2.x > ox) {\n sx2 = (this.x + this.width - ox) / (p2.x - ox);\n }\n if (p2.y > oy) {\n sy2 = (this.y + this.height - oy) / (p2.y - oy);\n }\n // Top Right\n const p3 = rect.topRight;\n if (p3.x > ox) {\n sx3 = (this.x + this.width - ox) / (p3.x - ox);\n }\n if (p3.y < oy) {\n sy3 = (this.y - oy) / (p3.y - oy);\n }\n // Bottom Left\n const p4 = rect.bottomLeft;\n if (p4.x < ox) {\n sx4 = (this.x - ox) / (p4.x - ox);\n }\n if (p4.y > oy) {\n sy4 = (this.y + this.height - oy) / (p4.y - oy);\n }\n return {\n sx: Math.min(sx1, sx2, sx3, sx4),\n sy: Math.min(sy1, sy2, sy3, sy4),\n };\n }\n /**\n * Returns a number that specifies the maximum scaling that can be applied to\n * the rectangle along both axes so that it would still fit into `limit`. If\n * `origin` is specified, the rectangle is scaled around it; otherwise, it is\n * scaled around its center.\n */\n getMaxUniformScaleToFit(limit, origin = this.center) {\n const scale = this.getMaxScaleToFit(limit, origin);\n return Math.min(scale.sx, scale.sy);\n }\n containsPoint(x, y) {\n return util.containsPoint(this, Point.create(x, y));\n }\n containsRect(x, y, width, height) {\n const b = Rectangle.create(x, y, width, height);\n const x1 = this.x;\n const y1 = this.y;\n const w1 = this.width;\n const h1 = this.height;\n const x2 = b.x;\n const y2 = b.y;\n const w2 = b.width;\n const h2 = b.height;\n // one of the dimensions is 0\n if (w1 === 0 || h1 === 0 || w2 === 0 || h2 === 0) {\n return false;\n }\n return x2 >= x1 && y2 >= y1 && x2 + w2 <= x1 + w1 && y2 + h2 <= y1 + h1;\n }\n /**\n * Returns an array of the intersection points of the rectangle and the line.\n * Return `null` if no intersection exists.\n */\n intersectsWithLine(line) {\n const rectLines = [\n this.topLine,\n this.rightLine,\n this.bottomLine,\n this.leftLine,\n ];\n const points = [];\n const dedupeArr = [];\n rectLines.forEach((l) => {\n const p = line.intersectsWithLine(l);\n if (p !== null && dedupeArr.indexOf(p.toString()) < 0) {\n points.push(p);\n dedupeArr.push(p.toString());\n }\n });\n return points.length > 0 ? points : null;\n }\n /**\n * Returns the point on the boundary of the rectangle that is the intersection\n * of the rectangle with a line starting in the center the rectangle ending in\n * the point `p`.\n *\n * If `angle` is specified, the intersection will take into account the\n * rotation of the rectangle by `angle` degrees around its center.\n */\n intersectsWithLineFromCenterToPoint(p, angle) {\n const ref = Point.clone(p);\n const center = this.center;\n let result = null;\n if (angle != null && angle !== 0) {\n ref.rotate(angle, center);\n }\n const sides = [this.topLine, this.rightLine, this.bottomLine, this.leftLine];\n const connector = new Line(center, ref);\n for (let i = sides.length - 1; i >= 0; i -= 1) {\n const intersection = sides[i].intersectsWithLine(connector);\n if (intersection !== null) {\n result = intersection;\n break;\n }\n }\n if (result && angle != null && angle !== 0) {\n result.rotate(-angle, center);\n }\n return result;\n }\n intersectsWithRect(x, y, width, height) {\n const ref = Rectangle.create(x, y, width, height);\n // no intersection\n if (!this.isIntersectWithRect(ref)) {\n return null;\n }\n const myOrigin = this.origin;\n const myCorner = this.corner;\n const rOrigin = ref.origin;\n const rCorner = ref.corner;\n const xx = Math.max(myOrigin.x, rOrigin.x);\n const yy = Math.max(myOrigin.y, rOrigin.y);\n return new Rectangle(xx, yy, Math.min(myCorner.x, rCorner.x) - xx, Math.min(myCorner.y, rCorner.y) - yy);\n }\n isIntersectWithRect(x, y, width, height) {\n const ref = Rectangle.create(x, y, width, height);\n const myOrigin = this.origin;\n const myCorner = this.corner;\n const rOrigin = ref.origin;\n const rCorner = ref.corner;\n if (rCorner.x <= myOrigin.x ||\n rCorner.y <= myOrigin.y ||\n rOrigin.x >= myCorner.x ||\n rOrigin.y >= myCorner.y) {\n return false;\n }\n return true;\n }\n /**\n * Normalize the rectangle, i.e. make it so that it has non-negative\n * width and height. If width is less than `0`, the function swaps left and\n * right corners and if height is less than `0`, the top and bottom corners\n * are swapped.\n */\n normalize() {\n let newx = this.x;\n let newy = this.y;\n let newwidth = this.width;\n let newheight = this.height;\n if (this.width < 0) {\n newx = this.x + this.width;\n newwidth = -this.width;\n }\n if (this.height < 0) {\n newy = this.y + this.height;\n newheight = -this.height;\n }\n this.x = newx;\n this.y = newy;\n this.width = newwidth;\n this.height = newheight;\n return this;\n }\n /**\n * Returns a rectangle that is a union of this rectangle and rectangle `rect`.\n */\n union(rect) {\n const ref = Rectangle.clone(rect);\n const myOrigin = this.origin;\n const myCorner = this.corner;\n const rOrigin = ref.origin;\n const rCorner = ref.corner;\n const originX = Math.min(myOrigin.x, rOrigin.x);\n const originY = Math.min(myOrigin.y, rOrigin.y);\n const cornerX = Math.max(myCorner.x, rCorner.x);\n const cornerY = Math.max(myCorner.y, rCorner.y);\n return new Rectangle(originX, originY, cornerX - originX, cornerY - originY);\n }\n /**\n * Returns a string (\"top\", \"left\", \"right\" or \"bottom\") denoting the side of\n * the rectangle which is nearest to the point `p`.\n */\n getNearestSideToPoint(p) {\n const ref = Point.clone(p);\n const distLeft = ref.x - this.x;\n const distRight = this.x + this.width - ref.x;\n const distTop = ref.y - this.y;\n const distBottom = this.y + this.height - ref.y;\n let closest = distLeft;\n let side = 'left';\n if (distRight < closest) {\n closest = distRight;\n side = 'right';\n }\n if (distTop < closest) {\n closest = distTop;\n side = 'top';\n }\n if (distBottom < closest) {\n side = 'bottom';\n }\n return side;\n }\n /**\n * Returns a point on the boundary of the rectangle nearest to the point `p`.\n */\n getNearestPointToPoint(p) {\n const ref = Point.clone(p);\n if (this.containsPoint(ref)) {\n const side = this.getNearestSideToPoint(ref);\n switch (side) {\n case 'right':\n return new Point(this.x + this.width, ref.y);\n case 'left':\n return new Point(this.x, ref.y);\n case 'bottom':\n return new Point(ref.x, this.y + this.height);\n case 'top':\n return new Point(ref.x, this.y);\n default:\n break;\n }\n }\n return ref.adhereToRect(this);\n }\n equals(rect) {\n return (rect != null &&\n rect.x === this.x &&\n rect.y === this.y &&\n rect.width === this.width &&\n rect.height === this.height);\n }\n clone() {\n return new Rectangle(this.x, this.y, this.width, this.height);\n }\n toJSON() {\n return { x: this.x, y: this.y, width: this.width, height: this.height };\n }\n serialize() {\n return `${this.x} ${this.y} ${this.width} ${this.height}`;\n }\n}\n(function (Rectangle) {\n Rectangle.toStringTag = `X6.Geometry.${Rectangle.name}`;\n function isRectangle(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Rectangle) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const rect = instance;\n if ((tag == null || tag === Rectangle.toStringTag) &&\n typeof rect.x === 'number' &&\n typeof rect.y === 'number' &&\n typeof rect.width === 'number' &&\n typeof rect.height === 'number' &&\n typeof rect.inflate === 'function' &&\n typeof rect.moveAndExpand === 'function') {\n return true;\n }\n return false;\n }\n Rectangle.isRectangle = isRectangle;\n})(Rectangle || (Rectangle = {}));\n(function (Rectangle) {\n function isRectangleLike(o) {\n return (o != null &&\n typeof o === 'object' &&\n typeof o.x === 'number' &&\n typeof o.y === 'number' &&\n typeof o.width === 'number' &&\n typeof o.height === 'number');\n }\n Rectangle.isRectangleLike = isRectangleLike;\n})(Rectangle || (Rectangle = {}));\n(function (Rectangle) {\n function create(x, y, width, height) {\n if (x == null || typeof x === 'number') {\n return new Rectangle(x, y, width, height);\n }\n return clone(x);\n }\n Rectangle.create = create;\n function clone(rect) {\n if (Rectangle.isRectangle(rect)) {\n return rect.clone();\n }\n if (Array.isArray(rect)) {\n return new Rectangle(rect[0], rect[1], rect[2], rect[3]);\n }\n return new Rectangle(rect.x, rect.y, rect.width, rect.height);\n }\n Rectangle.clone = clone;\n function fromSize(size) {\n return new Rectangle(0, 0, size.width, size.height);\n }\n Rectangle.fromSize = fromSize;\n function fromPositionAndSize(pos, size) {\n return new Rectangle(pos.x, pos.y, size.width, size.height);\n }\n Rectangle.fromPositionAndSize = fromPositionAndSize;\n /**\n * Returns a new rectangle from the given ellipse.\n */\n function fromEllipse(ellipse) {\n return new Rectangle(ellipse.x - ellipse.a, ellipse.y - ellipse.b, 2 * ellipse.a, 2 * ellipse.b);\n }\n Rectangle.fromEllipse = fromEllipse;\n})(Rectangle || (Rectangle = {}));\n//# sourceMappingURL=rectangle.js.map","import { Point } from './point';\nimport { Geometry } from './geometry';\nimport { Rectangle } from './rectangle';\nexport class Line extends Geometry {\n constructor(x1, y1, x2, y2) {\n super();\n if (typeof x1 === 'number' && typeof y1 === 'number') {\n this.start = new Point(x1, y1);\n this.end = new Point(x2, y2);\n }\n else {\n this.start = Point.create(x1);\n this.end = Point.create(y1);\n }\n }\n get [Symbol.toStringTag]() {\n return Line.toStringTag;\n }\n get center() {\n return new Point((this.start.x + this.end.x) / 2, (this.start.y + this.end.y) / 2);\n }\n getCenter() {\n return this.center;\n }\n /**\n * Rounds the line to the given `precision`.\n */\n round(precision = 0) {\n this.start.round(precision);\n this.end.round(precision);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.start.translate(tx, ty);\n this.end.translate(tx, ty);\n }\n else {\n this.start.translate(tx);\n this.end.translate(tx);\n }\n return this;\n }\n /**\n * Rotate the line by `angle` around `origin`.\n */\n rotate(angle, origin) {\n this.start.rotate(angle, origin);\n this.end.rotate(angle, origin);\n return this;\n }\n /**\n * Scale the line by `sx` and `sy` about the given `origin`. If origin is not\n * specified, the line is scaled around `0,0`.\n */\n scale(sx, sy, origin) {\n this.start.scale(sx, sy, origin);\n this.end.scale(sx, sy, origin);\n return this;\n }\n /**\n * Returns the length of the line.\n */\n length() {\n return Math.sqrt(this.squaredLength());\n }\n /**\n * Useful for distance comparisons in which real length is not necessary\n * (saves one `Math.sqrt()` operation).\n */\n squaredLength() {\n const dx = this.start.x - this.end.x;\n const dy = this.start.y - this.end.y;\n return dx * dx + dy * dy;\n }\n /**\n * Scale the line so that it has the requested length. The start point of\n * the line is preserved.\n */\n setLength(length) {\n const total = this.length();\n if (!total) {\n return this;\n }\n const scale = length / total;\n return this.scale(scale, scale, this.start);\n }\n parallel(distance) {\n const line = this.clone();\n if (!line.isDifferentiable()) {\n return line;\n }\n const { start, end } = line;\n const eRef = start.clone().rotate(270, end);\n const sRef = end.clone().rotate(90, start);\n start.move(sRef, distance);\n end.move(eRef, distance);\n return line;\n }\n /**\n * Returns the vector of the line with length equal to length of the line.\n */\n vector() {\n return new Point(this.end.x - this.start.x, this.end.y - this.start.y);\n }\n /**\n * Returns the angle of incline of the line.\n *\n * The function returns `NaN` if the start and end endpoints of the line\n * both lie at the same coordinates(it is impossible to determine the angle\n * of incline of a line that appears to be a point). The\n * `line.isDifferentiable()` function may be used in advance to determine\n * whether the angle of incline can be computed for a given line.\n */\n angle() {\n const horizontal = new Point(this.start.x + 1, this.start.y);\n return this.start.angleBetween(this.end, horizontal);\n }\n /**\n * Returns a rectangle that is the bounding box of the line.\n */\n bbox() {\n const left = Math.min(this.start.x, this.end.x);\n const top = Math.min(this.start.y, this.end.y);\n const right = Math.max(this.start.x, this.end.x);\n const bottom = Math.max(this.start.y, this.end.y);\n return new Rectangle(left, top, right - left, bottom - top);\n }\n /**\n * Returns the bearing (cardinal direction) of the line.\n *\n * The return value is one of the following strings:\n * 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW' and 'N'.\n *\n * The function returns 'N' if the two endpoints of the line are coincident.\n */\n bearing() {\n return this.start.bearing(this.end);\n }\n /**\n * Returns the point on the line that lies closest to point `p`.\n */\n closestPoint(p) {\n return this.pointAt(this.closestPointNormalizedLength(p));\n }\n /**\n * Returns the length of the line up to the point that lies closest to point `p`.\n */\n closestPointLength(p) {\n return this.closestPointNormalizedLength(p) * this.length();\n }\n /**\n * Returns a line that is tangent to the line at the point that lies closest\n * to point `p`.\n */\n closestPointTangent(p) {\n return this.tangentAt(this.closestPointNormalizedLength(p));\n }\n /**\n * Returns the normalized length (distance from the start of the line / total\n * line length) of the line up to the point that lies closest to point.\n */\n closestPointNormalizedLength(p) {\n const product = this.vector().dot(new Line(this.start, p).vector());\n const normalized = Math.min(1, Math.max(0, product / this.squaredLength()));\n // normalized returns `NaN` if this line has zero length\n if (Number.isNaN(normalized)) {\n return 0;\n }\n return normalized;\n }\n /**\n * Returns a point on the line that lies `rate` (normalized length) away from\n * the beginning of the line.\n */\n pointAt(ratio) {\n const start = this.start;\n const end = this.end;\n if (ratio <= 0) {\n return start.clone();\n }\n if (ratio >= 1) {\n return end.clone();\n }\n return start.lerp(end, ratio);\n }\n /**\n * Returns a point on the line that lies length away from the beginning of\n * the line.\n */\n pointAtLength(length) {\n const start = this.start;\n const end = this.end;\n let fromStart = true;\n if (length < 0) {\n fromStart = false; // start calculation from end point\n length = -length; // eslint-disable-line\n }\n const total = this.length();\n if (length >= total) {\n return fromStart ? end.clone() : start.clone();\n }\n const rate = (fromStart ? length : total - length) / total;\n return this.pointAt(rate);\n }\n /**\n * Divides the line into two lines at the point that lies `rate` (normalized\n * length) away from the beginning of the line.\n */\n divideAt(ratio) {\n const dividerPoint = this.pointAt(ratio);\n return [\n new Line(this.start, dividerPoint),\n new Line(dividerPoint, this.end),\n ];\n }\n /**\n * Divides the line into two lines at the point that lies length away from\n * the beginning of the line.\n */\n divideAtLength(length) {\n const dividerPoint = this.pointAtLength(length);\n return [\n new Line(this.start, dividerPoint),\n new Line(dividerPoint, this.end),\n ];\n }\n /**\n * Returns `true` if the point `p` lies on the line. Return `false` otherwise.\n */\n containsPoint(p) {\n const start = this.start;\n const end = this.end;\n // cross product of 0 indicates that this line and\n // the vector to `p` are collinear.\n if (start.cross(p, end) !== 0) {\n return false;\n }\n const length = this.length();\n if (new Line(start, p).length() > length) {\n return false;\n }\n if (new Line(p, end).length() > length) {\n return false;\n }\n return true;\n }\n intersect(shape, options) {\n const ret = shape.intersectsWithLine(this, options);\n if (ret) {\n return Array.isArray(ret) ? ret : [ret];\n }\n return null;\n }\n /**\n * Returns the intersection point of the line with another line. Returns\n * `null` if no intersection exists.\n */\n intersectsWithLine(line) {\n const pt1Dir = new Point(this.end.x - this.start.x, this.end.y - this.start.y);\n const pt2Dir = new Point(line.end.x - line.start.x, line.end.y - line.start.y);\n const det = pt1Dir.x * pt2Dir.y - pt1Dir.y * pt2Dir.x;\n const deltaPt = new Point(line.start.x - this.start.x, line.start.y - this.start.y);\n const alpha = deltaPt.x * pt2Dir.y - deltaPt.y * pt2Dir.x;\n const beta = deltaPt.x * pt1Dir.y - deltaPt.y * pt1Dir.x;\n if (det === 0 || alpha * det < 0 || beta * det < 0) {\n return null;\n }\n if (det > 0) {\n if (alpha > det || beta > det) {\n return null;\n }\n }\n else if (alpha < det || beta < det) {\n return null;\n }\n return new Point(this.start.x + (alpha * pt1Dir.x) / det, this.start.y + (alpha * pt1Dir.y) / det);\n }\n /**\n * Returns `true` if a tangent line can be found for the line.\n *\n * Tangents cannot be found if both of the line endpoints are coincident\n * (the line appears to be a point).\n */\n isDifferentiable() {\n return !this.start.equals(this.end);\n }\n /**\n * Returns the perpendicular distance between the line and point. The\n * distance is positive if the point lies to the right of the line, negative\n * if the point lies to the left of the line, and `0` if the point lies on\n * the line.\n */\n pointOffset(p) {\n const ref = Point.clone(p);\n const start = this.start;\n const end = this.end;\n const determinant = (end.x - start.x) * (ref.y - start.y) -\n (end.y - start.y) * (ref.x - start.x);\n return determinant / this.length();\n }\n pointSquaredDistance(x, y) {\n const p = Point.create(x, y);\n return this.closestPoint(p).squaredDistance(p);\n }\n pointDistance(x, y) {\n const p = Point.create(x, y);\n return this.closestPoint(p).distance(p);\n }\n /**\n * Returns a line tangent to the line at point that lies `rate` (normalized\n * length) away from the beginning of the line.\n */\n tangentAt(ratio) {\n if (!this.isDifferentiable()) {\n return null;\n }\n const start = this.start;\n const end = this.end;\n const tangentStart = this.pointAt(ratio);\n const tangentLine = new Line(start, end);\n tangentLine.translate(tangentStart.x - start.x, tangentStart.y - start.y);\n return tangentLine;\n }\n /**\n * Returns a line tangent to the line at point that lies `length` away from\n * the beginning of the line.\n */\n tangentAtLength(length) {\n if (!this.isDifferentiable()) {\n return null;\n }\n const start = this.start;\n const end = this.end;\n const tangentStart = this.pointAtLength(length);\n const tangentLine = new Line(start, end);\n tangentLine.translate(tangentStart.x - start.x, tangentStart.y - start.y);\n return tangentLine;\n }\n relativeCcw(x, y) {\n const ref = Point.create(x, y);\n let dx1 = ref.x - this.start.x;\n let dy1 = ref.y - this.start.y;\n const dx2 = this.end.x - this.start.x;\n const dy2 = this.end.y - this.start.y;\n let ccw = dx1 * dy2 - dy1 * dx2;\n if (ccw === 0) {\n ccw = dx1 * dx2 + dy1 * dy2;\n if (ccw > 0.0) {\n dx1 -= dx2;\n dy1 -= dy2;\n ccw = dx1 * dx2 + dy1 * dy2;\n if (ccw < 0.0) {\n ccw = 0.0;\n }\n }\n }\n return ccw < 0.0 ? -1 : ccw > 0.0 ? 1 : 0;\n }\n /**\n * Return `true` if the line equals the other line.\n */\n equals(l) {\n return (l != null &&\n this.start.x === l.start.x &&\n this.start.y === l.start.y &&\n this.end.x === l.end.x &&\n this.end.y === l.end.y);\n }\n /**\n * Returns another line which is a clone of the line.\n */\n clone() {\n return new Line(this.start, this.end);\n }\n toJSON() {\n return { start: this.start.toJSON(), end: this.end.toJSON() };\n }\n serialize() {\n return [this.start.serialize(), this.end.serialize()].join(' ');\n }\n}\n(function (Line) {\n Line.toStringTag = `X6.Geometry.${Line.name}`;\n function isLine(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Line) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const line = instance;\n try {\n if ((tag == null || tag === Line.toStringTag) &&\n Point.isPoint(line.start) &&\n Point.isPoint(line.end) &&\n typeof line.vector === 'function' &&\n typeof line.bearing === 'function' &&\n typeof line.parallel === 'function' &&\n typeof line.intersect === 'function') {\n return true;\n }\n }\n catch (e) {\n return false;\n }\n return false;\n }\n Line.isLine = isLine;\n})(Line || (Line = {}));\n//# sourceMappingURL=line.js.map","import { Point } from './point';\nimport { Rectangle } from './rectangle';\nimport { Geometry } from './geometry';\nexport class Ellipse extends Geometry {\n constructor(x, y, a, b) {\n super();\n this.x = x == null ? 0 : x;\n this.y = y == null ? 0 : y;\n this.a = a == null ? 0 : a;\n this.b = b == null ? 0 : b;\n }\n get [Symbol.toStringTag]() {\n return Ellipse.toStringTag;\n }\n get center() {\n return new Point(this.x, this.y);\n }\n /**\n * Returns a rectangle that is the bounding box of the ellipse.\n */\n bbox() {\n return Rectangle.fromEllipse(this);\n }\n /**\n * Returns a point that is the center of the ellipse.\n */\n getCenter() {\n return this.center;\n }\n inflate(dx, dy) {\n const w = dx;\n const h = dy != null ? dy : dx;\n this.a += 2 * w;\n this.b += 2 * h;\n return this;\n }\n normalizedDistance(x, y) {\n const ref = Point.create(x, y);\n const dx = ref.x - this.x;\n const dy = ref.y - this.y;\n const a = this.a;\n const b = this.b;\n return (dx * dx) / (a * a) + (dy * dy) / (b * b);\n }\n containsPoint(x, y) {\n return this.normalizedDistance(x, y) <= 1;\n }\n /**\n * Returns an array of the intersection points of the ellipse and the line.\n * Returns `null` if no intersection exists.\n */\n intersectsWithLine(line) {\n const intersections = [];\n const rx = this.a;\n const ry = this.b;\n const a1 = line.start;\n const a2 = line.end;\n const dir = line.vector();\n const diff = a1.diff(new Point(this.x, this.y));\n const mDir = new Point(dir.x / (rx * rx), dir.y / (ry * ry));\n const mDiff = new Point(diff.x / (rx * rx), diff.y / (ry * ry));\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n const c = diff.dot(mDiff) - 1.0;\n const d = b * b - a * c;\n if (d < 0) {\n return null;\n }\n if (d > 0) {\n const root = Math.sqrt(d);\n const ta = (-b - root) / a;\n const tb = (-b + root) / a;\n if ((ta < 0 || ta > 1) && (tb < 0 || tb > 1)) {\n // outside\n return null;\n }\n if (ta >= 0 && ta <= 1) {\n intersections.push(a1.lerp(a2, ta));\n }\n if (tb >= 0 && tb <= 1) {\n intersections.push(a1.lerp(a2, tb));\n }\n }\n else {\n const t = -b / a;\n if (t >= 0 && t <= 1) {\n intersections.push(a1.lerp(a2, t));\n }\n else {\n // outside\n return null;\n }\n }\n return intersections;\n }\n /**\n * Returns the point on the boundary of the ellipse that is the\n * intersection of the ellipse with a line starting in the center\n * of the ellipse ending in the point `p`.\n *\n * If angle is specified, the intersection will take into account\n * the rotation of the ellipse by angle degrees around its center.\n */\n intersectsWithLineFromCenterToPoint(p, angle = 0) {\n const ref = Point.clone(p);\n if (angle) {\n ref.rotate(angle, this.getCenter());\n }\n const dx = ref.x - this.x;\n const dy = ref.y - this.y;\n let result;\n if (dx === 0) {\n result = this.bbox().getNearestPointToPoint(ref);\n if (angle) {\n return result.rotate(-angle, this.getCenter());\n }\n return result;\n }\n const m = dy / dx;\n const mSquared = m * m;\n const aSquared = this.a * this.a;\n const bSquared = this.b * this.b;\n let x = Math.sqrt(1 / (1 / aSquared + mSquared / bSquared));\n x = dx < 0 ? -x : x;\n const y = m * x;\n result = new Point(this.x + x, this.y + y);\n if (angle) {\n return result.rotate(-angle, this.getCenter());\n }\n return result;\n }\n /**\n * Returns the angle between the x-axis and the tangent from a point. It is\n * valid for points lying on the ellipse boundary only.\n */\n tangentTheta(p) {\n const ref = Point.clone(p);\n const x0 = ref.x;\n const y0 = ref.y;\n const a = this.a;\n const b = this.b;\n const center = this.bbox().center;\n const cx = center.x;\n const cy = center.y;\n const refPointDelta = 30;\n const q1 = x0 > center.x + a / 2;\n const q3 = x0 < center.x - a / 2;\n let x;\n let y;\n if (q1 || q3) {\n y = x0 > center.x ? y0 - refPointDelta : y0 + refPointDelta;\n x =\n (a * a) / (x0 - cx) -\n (a * a * (y0 - cy) * (y - cy)) / (b * b * (x0 - cx)) +\n cx;\n }\n else {\n x = y0 > center.y ? x0 + refPointDelta : x0 - refPointDelta;\n y =\n (b * b) / (y0 - cy) -\n (b * b * (x0 - cx) * (x - cx)) / (a * a * (y0 - cy)) +\n cy;\n }\n return new Point(x, y).theta(ref);\n }\n scale(sx, sy) {\n this.a *= sx;\n this.b *= sy;\n return this;\n }\n rotate(angle, origin) {\n const rect = Rectangle.fromEllipse(this);\n rect.rotate(angle, origin);\n const ellipse = Ellipse.fromRect(rect);\n this.a = ellipse.a;\n this.b = ellipse.b;\n this.x = ellipse.x;\n this.y = ellipse.y;\n return this;\n }\n translate(dx, dy) {\n const p = Point.create(dx, dy);\n this.x += p.x;\n this.y += p.y;\n return this;\n }\n equals(ellipse) {\n return (ellipse != null &&\n ellipse.x === this.x &&\n ellipse.y === this.y &&\n ellipse.a === this.a &&\n ellipse.b === this.b);\n }\n clone() {\n return new Ellipse(this.x, this.y, this.a, this.b);\n }\n toJSON() {\n return { x: this.x, y: this.y, a: this.a, b: this.b };\n }\n serialize() {\n return `${this.x} ${this.y} ${this.a} ${this.b}`;\n }\n}\n(function (Ellipse) {\n Ellipse.toStringTag = `X6.Geometry.${Ellipse.name}`;\n function isEllipse(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Ellipse) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const ellipse = instance;\n if ((tag == null || tag === Ellipse.toStringTag) &&\n typeof ellipse.x === 'number' &&\n typeof ellipse.y === 'number' &&\n typeof ellipse.a === 'number' &&\n typeof ellipse.b === 'number' &&\n typeof ellipse.inflate === 'function' &&\n typeof ellipse.normalizedDistance === 'function') {\n return true;\n }\n return false;\n }\n Ellipse.isEllipse = isEllipse;\n})(Ellipse || (Ellipse = {}));\n(function (Ellipse) {\n function create(x, y, a, b) {\n if (x == null || typeof x === 'number') {\n return new Ellipse(x, y, a, b);\n }\n return parse(x);\n }\n Ellipse.create = create;\n function parse(e) {\n if (Ellipse.isEllipse(e)) {\n return e.clone();\n }\n if (Array.isArray(e)) {\n return new Ellipse(e[0], e[1], e[2], e[3]);\n }\n return new Ellipse(e.x, e.y, e.a, e.b);\n }\n Ellipse.parse = parse;\n function fromRect(rect) {\n const center = rect.center;\n return new Ellipse(center.x, center.y, rect.width / 2, rect.height / 2);\n }\n Ellipse.fromRect = fromRect;\n})(Ellipse || (Ellipse = {}));\n//# sourceMappingURL=ellipse.js.map","import { Point } from './point';\nimport { Rectangle } from './rectangle';\nimport { Line } from './line';\nimport { Geometry } from './geometry';\nexport class Polyline extends Geometry {\n constructor(points) {\n super();\n if (points != null) {\n if (typeof points === 'string') {\n return Polyline.parse(points);\n }\n this.points = points.map((p) => Point.create(p));\n }\n else {\n this.points = [];\n }\n }\n get [Symbol.toStringTag]() {\n return Polyline.toStringTag;\n }\n get start() {\n if (this.points.length === 0) {\n return null;\n }\n return this.points[0];\n }\n get end() {\n if (this.points.length === 0) {\n return null;\n }\n return this.points[this.points.length - 1];\n }\n scale(sx, sy, origin = new Point()) {\n this.points.forEach((p) => p.scale(sx, sy, origin));\n return this;\n }\n rotate(angle, origin) {\n this.points.forEach((p) => p.rotate(angle, origin));\n return this;\n }\n translate(dx, dy) {\n const t = Point.create(dx, dy);\n this.points.forEach((p) => p.translate(t.x, t.y));\n return this;\n }\n bbox() {\n if (this.points.length === 0) {\n return new Rectangle();\n }\n let x1 = Infinity;\n let x2 = -Infinity;\n let y1 = Infinity;\n let y2 = -Infinity;\n const points = this.points;\n for (let i = 0, ii = points.length; i < ii; i += 1) {\n const point = points[i];\n const x = point.x;\n const y = point.y;\n if (x < x1)\n x1 = x;\n if (x > x2)\n x2 = x;\n if (y < y1)\n y1 = y;\n if (y > y2)\n y2 = y;\n }\n return new Rectangle(x1, y1, x2 - x1, y2 - y1);\n }\n closestPoint(p) {\n const cpLength = this.closestPointLength(p);\n return this.pointAtLength(cpLength);\n }\n closestPointLength(p) {\n const points = this.points;\n const count = points.length;\n if (count === 0 || count === 1) {\n return 0;\n }\n let length = 0;\n let cpLength = 0;\n let minSqrDistance = Infinity;\n for (let i = 0, ii = count - 1; i < ii; i += 1) {\n const line = new Line(points[i], points[i + 1]);\n const lineLength = line.length();\n const cpNormalizedLength = line.closestPointNormalizedLength(p);\n const cp = line.pointAt(cpNormalizedLength);\n const sqrDistance = cp.squaredDistance(p);\n if (sqrDistance < minSqrDistance) {\n minSqrDistance = sqrDistance;\n cpLength = length + cpNormalizedLength * lineLength;\n }\n length += lineLength;\n }\n return cpLength;\n }\n closestPointNormalizedLength(p) {\n const cpLength = this.closestPointLength(p);\n if (cpLength === 0) {\n return 0;\n }\n const length = this.length();\n if (length === 0) {\n return 0;\n }\n return cpLength / length;\n }\n closestPointTangent(p) {\n const cpLength = this.closestPointLength(p);\n return this.tangentAtLength(cpLength);\n }\n containsPoint(p) {\n if (this.points.length === 0) {\n return false;\n }\n const ref = Point.clone(p);\n const x = ref.x;\n const y = ref.y;\n const points = this.points;\n const count = points.length;\n let startIndex = count - 1;\n let intersectionCount = 0;\n for (let endIndex = 0; endIndex < count; endIndex += 1) {\n const start = points[startIndex];\n const end = points[endIndex];\n if (ref.equals(start)) {\n return true;\n }\n const segment = new Line(start, end);\n if (segment.containsPoint(p)) {\n return true;\n }\n // do we have an intersection?\n if ((y <= start.y && y > end.y) || (y > start.y && y <= end.y)) {\n // this conditional branch IS NOT entered when `segment` is collinear/coincident with `ray`\n // (when `y === start.y === end.y`)\n // this conditional branch IS entered when `segment` touches `ray` at only one point\n // (e.g. when `y === start.y !== end.y`)\n // since this branch is entered again for the following segment, the two touches cancel out\n const xDifference = start.x - x > end.x - x ? start.x - x : end.x - x;\n if (xDifference >= 0) {\n // segment lies at least partially to the right of `p`\n const rayEnd = new Point(x + xDifference, y); // right\n const ray = new Line(p, rayEnd);\n if (segment.intersectsWithLine(ray)) {\n // an intersection was detected to the right of `p`\n intersectionCount += 1;\n }\n } // else: `segment` lies completely to the left of `p` (i.e. no intersection to the right)\n }\n // move to check the next polyline segment\n startIndex = endIndex;\n }\n // returns `true` for odd numbers of intersections (even-odd algorithm)\n return intersectionCount % 2 === 1;\n }\n intersectsWithLine(line) {\n const intersections = [];\n for (let i = 0, n = this.points.length - 1; i < n; i += 1) {\n const a = this.points[i];\n const b = this.points[i + 1];\n const int = line.intersectsWithLine(new Line(a, b));\n if (int) {\n intersections.push(int);\n }\n }\n return intersections.length > 0 ? intersections : null;\n }\n isDifferentiable() {\n for (let i = 0, ii = this.points.length - 1; i < ii; i += 1) {\n const a = this.points[i];\n const b = this.points[i + 1];\n const line = new Line(a, b);\n if (line.isDifferentiable()) {\n return true;\n }\n }\n return false;\n }\n length() {\n let len = 0;\n for (let i = 0, ii = this.points.length - 1; i < ii; i += 1) {\n const a = this.points[i];\n const b = this.points[i + 1];\n len += a.distance(b);\n }\n return len;\n }\n pointAt(ratio) {\n const points = this.points;\n const count = points.length;\n if (count === 0) {\n return null;\n }\n if (count === 1) {\n return points[0].clone();\n }\n if (ratio <= 0) {\n return points[0].clone();\n }\n if (ratio >= 1) {\n return points[count - 1].clone();\n }\n const total = this.length();\n const length = total * ratio;\n return this.pointAtLength(length);\n }\n pointAtLength(length) {\n const points = this.points;\n const count = points.length;\n if (count === 0) {\n return null;\n }\n if (count === 1) {\n return points[0].clone();\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n let tmp = 0;\n for (let i = 0, ii = count - 1; i < ii; i += 1) {\n const index = fromStart ? i : ii - 1 - i;\n const a = points[index];\n const b = points[index + 1];\n const l = new Line(a, b);\n const d = a.distance(b);\n if (length <= tmp + d) {\n return l.pointAtLength((fromStart ? 1 : -1) * (length - tmp));\n }\n tmp += d;\n }\n const lastPoint = fromStart ? points[count - 1] : points[0];\n return lastPoint.clone();\n }\n tangentAt(ratio) {\n const points = this.points;\n const count = points.length;\n if (count === 0 || count === 1) {\n return null;\n }\n if (ratio < 0) {\n ratio = 0; // eslint-disable-line\n }\n if (ratio > 1) {\n ratio = 1; // eslint-disable-line\n }\n const total = this.length();\n const length = total * ratio;\n return this.tangentAtLength(length);\n }\n tangentAtLength(length) {\n const points = this.points;\n const count = points.length;\n if (count === 0 || count === 1) {\n return null;\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n let lastValidLine;\n let tmp = 0;\n for (let i = 0, ii = count - 1; i < ii; i += 1) {\n const index = fromStart ? i : ii - 1 - i;\n const a = points[index];\n const b = points[index + 1];\n const l = new Line(a, b);\n const d = a.distance(b);\n if (l.isDifferentiable()) {\n // has a tangent line (line length is not 0)\n if (length <= tmp + d) {\n return l.tangentAtLength((fromStart ? 1 : -1) * (length - tmp));\n }\n lastValidLine = l;\n }\n tmp += d;\n }\n if (lastValidLine) {\n const ratio = fromStart ? 1 : 0;\n return lastValidLine.tangentAt(ratio);\n }\n return null;\n }\n simplify(\n // TODO: Accept startIndex and endIndex to specify where to start and end simplification\n options = {}) {\n const points = this.points;\n // we need at least 3 points\n if (points.length < 3) {\n return this;\n }\n const threshold = options.threshold || 0;\n // start at the beginning of the polyline and go forward\n let currentIndex = 0;\n // we need at least one intermediate point (3 points) in every iteration\n // as soon as that stops being true, we know we reached the end of the polyline\n while (points[currentIndex + 2]) {\n const firstIndex = currentIndex;\n const middleIndex = currentIndex + 1;\n const lastIndex = currentIndex + 2;\n const firstPoint = points[firstIndex];\n const middlePoint = points[middleIndex];\n const lastPoint = points[lastIndex];\n const chord = new Line(firstPoint, lastPoint); // = connection between first and last point\n const closestPoint = chord.closestPoint(middlePoint); // = closest point on chord from middle point\n const closestPointDistance = closestPoint.distance(middlePoint);\n if (closestPointDistance <= threshold) {\n // middle point is close enough to the chord = simplify\n // 1) remove middle point:\n points.splice(middleIndex, 1);\n // 2) in next iteration, investigate the newly-created triplet of points\n // - do not change `currentIndex`\n // = (first point stays, point after removed point becomes middle point)\n }\n else {\n // middle point is far from the chord\n // 1) preserve middle point\n // 2) in next iteration, move `currentIndex` by one step:\n currentIndex += 1;\n // = (point after first point becomes first point)\n }\n }\n // `points` array was modified in-place\n return this;\n }\n toHull() {\n const points = this.points;\n const count = points.length;\n if (count === 0) {\n return new Polyline();\n }\n // Step 1: find the starting point -- point with\n // the lowest y (if equality, highest x).\n let startPoint = points[0];\n for (let i = 1; i < count; i += 1) {\n if (points[i].y < startPoint.y) {\n startPoint = points[i];\n }\n else if (points[i].y === startPoint.y && points[i].x > startPoint.x) {\n startPoint = points[i];\n }\n }\n // Step 2: sort the list of points by angle between line\n // from start point to current point and the x-axis (theta).\n // Step 2a: create the point records = [point, originalIndex, angle]\n const sortedRecords = [];\n for (let i = 0; i < count; i += 1) {\n let angle = startPoint.theta(points[i]);\n if (angle === 0) {\n // Give highest angle to start point.\n // The start point will end up at end of sorted list.\n // The start point will end up at beginning of hull points list.\n angle = 360;\n }\n sortedRecords.push([points[i], i, angle]);\n }\n // Step 2b: sort the list in place\n sortedRecords.sort((record1, record2) => {\n let ret = record1[2] - record2[2];\n if (ret === 0) {\n ret = record2[1] - record1[1];\n }\n return ret;\n });\n // Step 2c: duplicate start record from the top of\n // the stack to the bottom of the stack.\n if (sortedRecords.length > 2) {\n const startPoint = sortedRecords[sortedRecords.length - 1];\n sortedRecords.unshift(startPoint);\n }\n // Step 3\n // ------\n // Step 3a: go through sorted points in order and find those with\n // right turns, and we want to get our results in clockwise order.\n // Dictionary of points with left turns - cannot be on the hull.\n const insidePoints = {};\n // Stack of records with right turns - hull point candidates.\n const hullRecords = [];\n const getKey = (record) => `${record[0].toString()}@${record[1]}`;\n while (sortedRecords.length !== 0) {\n const currentRecord = sortedRecords.pop();\n const currentPoint = currentRecord[0];\n // Check if point has already been discarded.\n if (insidePoints[getKey(currentRecord)]) {\n continue;\n }\n let correctTurnFound = false;\n while (!correctTurnFound) {\n if (hullRecords.length < 2) {\n // Not enough points for comparison, just add current point.\n hullRecords.push(currentRecord);\n correctTurnFound = true;\n }\n else {\n const lastHullRecord = hullRecords.pop();\n const lastHullPoint = lastHullRecord[0];\n const secondLastHullRecord = hullRecords.pop();\n const secondLastHullPoint = secondLastHullRecord[0];\n const crossProduct = secondLastHullPoint.cross(lastHullPoint, currentPoint);\n if (crossProduct < 0) {\n // Found a right turn.\n hullRecords.push(secondLastHullRecord);\n hullRecords.push(lastHullRecord);\n hullRecords.push(currentRecord);\n correctTurnFound = true;\n }\n else if (crossProduct === 0) {\n // the three points are collinear\n // three options:\n // there may be a 180 or 0 degree angle at lastHullPoint\n // or two of the three points are coincident\n // we have to take rounding errors into account\n const THRESHOLD = 1e-10;\n const angleBetween = lastHullPoint.angleBetween(secondLastHullPoint, currentPoint);\n if (Math.abs(angleBetween - 180) < THRESHOLD) {\n // rouding around 180 to 180\n // if the cross product is 0 because the angle is 180 degrees\n // discard last hull point (add to insidePoints)\n // insidePoints.unshift(lastHullPoint);\n insidePoints[getKey(lastHullRecord)] = lastHullPoint;\n // reenter second-to-last hull point (will be last at next iter)\n hullRecords.push(secondLastHullRecord);\n // do not do anything with current point\n // correct turn not found\n }\n else if (lastHullPoint.equals(currentPoint) ||\n secondLastHullPoint.equals(lastHullPoint)) {\n // if the cross product is 0 because two points are the same\n // discard last hull point (add to insidePoints)\n // insidePoints.unshift(lastHullPoint);\n insidePoints[getKey(lastHullRecord)] = lastHullPoint;\n // reenter second-to-last hull point (will be last at next iter)\n hullRecords.push(secondLastHullRecord);\n // do not do anything with current point\n // correct turn not found\n }\n else if (Math.abs(((angleBetween + 1) % 360) - 1) < THRESHOLD) {\n // rounding around 0 and 360 to 0\n // if the cross product is 0 because the angle is 0 degrees\n // remove last hull point from hull BUT do not discard it\n // reenter second-to-last hull point (will be last at next iter)\n hullRecords.push(secondLastHullRecord);\n // put last hull point back into the sorted point records list\n sortedRecords.push(lastHullRecord);\n // we are switching the order of the 0deg and 180deg points\n // correct turn not found\n }\n }\n else {\n // found a left turn\n // discard last hull point (add to insidePoints)\n // insidePoints.unshift(lastHullPoint);\n insidePoints[getKey(lastHullRecord)] = lastHullPoint;\n // reenter second-to-last hull point (will be last at next iter of loop)\n hullRecords.push(secondLastHullRecord);\n // do not do anything with current point\n // correct turn not found\n }\n }\n }\n }\n // At this point, hullPointRecords contains the output points in clockwise order\n // the points start with lowest-y,highest-x startPoint, and end at the same point\n // Step 3b: remove duplicated startPointRecord from the end of the array\n if (hullRecords.length > 2) {\n hullRecords.pop();\n }\n // Step 4: find the lowest originalIndex record and put it at the beginning of hull\n let lowestHullIndex; // the lowest originalIndex on the hull\n let indexOfLowestHullIndexRecord = -1; // the index of the record with lowestHullIndex\n for (let i = 0, n = hullRecords.length; i < n; i += 1) {\n const currentHullIndex = hullRecords[i][1];\n if (lowestHullIndex === undefined || currentHullIndex < lowestHullIndex) {\n lowestHullIndex = currentHullIndex;\n indexOfLowestHullIndexRecord = i;\n }\n }\n let hullPointRecordsReordered = [];\n if (indexOfLowestHullIndexRecord > 0) {\n const newFirstChunk = hullRecords.slice(indexOfLowestHullIndexRecord);\n const newSecondChunk = hullRecords.slice(0, indexOfLowestHullIndexRecord);\n hullPointRecordsReordered = newFirstChunk.concat(newSecondChunk);\n }\n else {\n hullPointRecordsReordered = hullRecords;\n }\n const hullPoints = [];\n for (let i = 0, n = hullPointRecordsReordered.length; i < n; i += 1) {\n hullPoints.push(hullPointRecordsReordered[i][0]);\n }\n return new Polyline(hullPoints);\n }\n equals(p) {\n if (p == null) {\n return false;\n }\n if (p.points.length !== this.points.length) {\n return false;\n }\n return p.points.every((a, i) => a.equals(this.points[i]));\n }\n clone() {\n return new Polyline(this.points.map((p) => p.clone()));\n }\n toJSON() {\n return this.points.map((p) => p.toJSON());\n }\n serialize() {\n return this.points.map((p) => `${p.x}, ${p.y}`).join(' ');\n }\n}\n(function (Polyline) {\n Polyline.toStringTag = `X6.Geometry.${Polyline.name}`;\n function isPolyline(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Polyline) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const polyline = instance;\n if ((tag == null || tag === Polyline.toStringTag) &&\n typeof polyline.toHull === 'function' &&\n typeof polyline.simplify === 'function') {\n return true;\n }\n return false;\n }\n Polyline.isPolyline = isPolyline;\n})(Polyline || (Polyline = {}));\n(function (Polyline) {\n function parse(svgString) {\n const str = svgString.trim();\n if (str === '') {\n return new Polyline();\n }\n const points = [];\n const coords = str.split(/\\s*,\\s*|\\s+/);\n for (let i = 0, ii = coords.length; i < ii; i += 2) {\n points.push({ x: +coords[i], y: +coords[i + 1] });\n }\n return new Polyline(points);\n }\n Polyline.parse = parse;\n})(Polyline || (Polyline = {}));\n//# sourceMappingURL=polyline.js.map","import { Point } from './point';\nimport { Line } from './line';\nimport { Rectangle } from './rectangle';\nimport { Polyline } from './polyline';\nimport { Geometry } from './geometry';\nexport class Curve extends Geometry {\n constructor(start, controlPoint1, controlPoint2, end) {\n super();\n this.PRECISION = 3;\n this.start = Point.create(start);\n this.controlPoint1 = Point.create(controlPoint1);\n this.controlPoint2 = Point.create(controlPoint2);\n this.end = Point.create(end);\n }\n get [Symbol.toStringTag]() {\n return Curve.toStringTag;\n }\n bbox() {\n const start = this.start;\n const controlPoint1 = this.controlPoint1;\n const controlPoint2 = this.controlPoint2;\n const end = this.end;\n const x0 = start.x;\n const y0 = start.y;\n const x1 = controlPoint1.x;\n const y1 = controlPoint1.y;\n const x2 = controlPoint2.x;\n const y2 = controlPoint2.y;\n const x3 = end.x;\n const y3 = end.y;\n const points = []; // local extremes\n const tvalues = []; // t values of local extremes\n const bounds = [[], []];\n let a;\n let b;\n let c;\n let t;\n let t1;\n let t2;\n let b2ac;\n let sqrtb2ac;\n for (let i = 0; i < 2; i += 1) {\n if (i === 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n }\n else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (t > 0 && t < 1)\n tvalues.push(t);\n continue;\n }\n b2ac = b * b - 4 * c * a;\n sqrtb2ac = Math.sqrt(b2ac);\n if (b2ac < 0)\n continue;\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (t1 > 0 && t1 < 1)\n tvalues.push(t1);\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (t2 > 0 && t2 < 1)\n tvalues.push(t2);\n }\n let x;\n let y;\n let mt;\n let j = tvalues.length;\n const jlen = j;\n while (j) {\n j -= 1;\n t = tvalues[j];\n mt = 1 - t;\n x =\n mt * mt * mt * x0 +\n 3 * mt * mt * t * x1 +\n 3 * mt * t * t * x2 +\n t * t * t * x3;\n bounds[0][j] = x;\n y =\n mt * mt * mt * y0 +\n 3 * mt * mt * t * y1 +\n 3 * mt * t * t * y2 +\n t * t * t * y3;\n bounds[1][j] = y;\n points[j] = { X: x, Y: y };\n }\n tvalues[jlen] = 0;\n tvalues[jlen + 1] = 1;\n points[jlen] = { X: x0, Y: y0 };\n points[jlen + 1] = { X: x3, Y: y3 };\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n tvalues.length = jlen + 2;\n bounds[0].length = jlen + 2;\n bounds[1].length = jlen + 2;\n points.length = jlen + 2;\n const left = Math.min.apply(null, bounds[0]);\n const top = Math.min.apply(null, bounds[1]);\n const right = Math.max.apply(null, bounds[0]);\n const bottom = Math.max.apply(null, bounds[1]);\n return new Rectangle(left, top, right - left, bottom - top);\n }\n closestPoint(p, options = {}) {\n return this.pointAtT(this.closestPointT(p, options));\n }\n closestPointLength(p, options = {}) {\n const opts = this.getOptions(options);\n return this.lengthAtT(this.closestPointT(p, opts), opts);\n }\n closestPointNormalizedLength(p, options = {}) {\n const opts = this.getOptions(options);\n const cpLength = this.closestPointLength(p, opts);\n if (!cpLength) {\n return 0;\n }\n const length = this.length(opts);\n if (length === 0) {\n return 0;\n }\n return cpLength / length;\n }\n closestPointT(p, options = {}) {\n const precision = this.getPrecision(options);\n const subdivisions = this.getDivisions(options);\n const precisionRatio = Math.pow(10, -precision); // eslint-disable-line\n let investigatedSubdivision = null;\n let investigatedSubdivisionStartT = 0;\n let investigatedSubdivisionEndT = 0;\n let distFromStart = 0;\n let distFromEnd = 0;\n let chordLength = 0;\n let minSumDist = null;\n const count = subdivisions.length;\n let piece = count > 0 ? 1 / count : 0;\n subdivisions.forEach((division, i) => {\n const startDist = division.start.distance(p);\n const endDist = division.end.distance(p);\n const sumDist = startDist + endDist;\n if (minSumDist == null || sumDist < minSumDist) {\n investigatedSubdivision = division;\n investigatedSubdivisionStartT = i * piece;\n investigatedSubdivisionEndT = (i + 1) * piece;\n distFromStart = startDist;\n distFromEnd = endDist;\n minSumDist = sumDist;\n chordLength = division.endpointDistance();\n }\n });\n // Recursively divide investigated subdivision, until distance between\n // baselinePoint and closest path endpoint is within `10^(-precision)`,\n // then return the closest endpoint of that final subdivision.\n // eslint-disable-next-line\n while (true) {\n // check if we have reached at least one required observed precision\n // - calculated as: the difference in distances from point to start and end divided by the distance\n // - note that this function is not monotonic = it doesn't converge stably but has \"teeth\"\n // - the function decreases while one of the endpoints is fixed but \"jumps\" whenever we switch\n // - this criterion works well for points lying far away from the curve\n const startPrecisionRatio = distFromStart\n ? Math.abs(distFromStart - distFromEnd) / distFromStart\n : 0;\n const endPrecisionRatio = distFromEnd != null\n ? Math.abs(distFromStart - distFromEnd) / distFromEnd\n : 0;\n const hasRequiredPrecision = startPrecisionRatio < precisionRatio ||\n endPrecisionRatio < precisionRatio;\n // check if we have reached at least one required minimal distance\n // - calculated as: the subdivision chord length multiplied by precisionRatio\n // - calculation is relative so it will work for arbitrarily large/small curves and their subdivisions\n // - this is a backup criterion that works well for points lying \"almost at\" the curve\n const hasMiniStartDistance = distFromStart\n ? distFromStart < chordLength * precisionRatio\n : true;\n const hasMiniEndDistance = distFromEnd\n ? distFromEnd < chordLength * precisionRatio\n : true;\n const hasMiniDistance = hasMiniStartDistance || hasMiniEndDistance;\n if (hasRequiredPrecision || hasMiniDistance) {\n return distFromStart <= distFromEnd\n ? investigatedSubdivisionStartT\n : investigatedSubdivisionEndT;\n }\n // otherwise, set up for next iteration\n const divided = investigatedSubdivision.divide(0.5);\n piece /= 2;\n const startDist1 = divided[0].start.distance(p);\n const endDist1 = divided[0].end.distance(p);\n const sumDist1 = startDist1 + endDist1;\n const startDist2 = divided[1].start.distance(p);\n const endDist2 = divided[1].end.distance(p);\n const sumDist2 = startDist2 + endDist2;\n if (sumDist1 <= sumDist2) {\n investigatedSubdivision = divided[0];\n investigatedSubdivisionEndT -= piece;\n distFromStart = startDist1;\n distFromEnd = endDist1;\n }\n else {\n investigatedSubdivision = divided[1];\n investigatedSubdivisionStartT += piece;\n distFromStart = startDist2;\n distFromEnd = endDist2;\n }\n }\n }\n closestPointTangent(p, options = {}) {\n return this.tangentAtT(this.closestPointT(p, options));\n }\n containsPoint(p, options = {}) {\n const polyline = this.toPolyline(options);\n return polyline.containsPoint(p);\n }\n divideAt(ratio, options = {}) {\n if (ratio <= 0) {\n return this.divideAtT(0);\n }\n if (ratio >= 1) {\n return this.divideAtT(1);\n }\n const t = this.tAt(ratio, options);\n return this.divideAtT(t);\n }\n divideAtLength(length, options = {}) {\n const t = this.tAtLength(length, options);\n return this.divideAtT(t);\n }\n divide(t) {\n return this.divideAtT(t);\n }\n divideAtT(t) {\n const start = this.start;\n const controlPoint1 = this.controlPoint1;\n const controlPoint2 = this.controlPoint2;\n const end = this.end;\n if (t <= 0) {\n return [\n new Curve(start, start, start, start),\n new Curve(start, controlPoint1, controlPoint2, end),\n ];\n }\n if (t >= 1) {\n return [\n new Curve(start, controlPoint1, controlPoint2, end),\n new Curve(end, end, end, end),\n ];\n }\n const dividerPoints = this.getSkeletonPoints(t);\n const startControl1 = dividerPoints.startControlPoint1;\n const startControl2 = dividerPoints.startControlPoint2;\n const divider = dividerPoints.divider;\n const dividerControl1 = dividerPoints.dividerControlPoint1;\n const dividerControl2 = dividerPoints.dividerControlPoint2;\n return [\n new Curve(start, startControl1, startControl2, divider),\n new Curve(divider, dividerControl1, dividerControl2, end),\n ];\n }\n endpointDistance() {\n return this.start.distance(this.end);\n }\n getSkeletonPoints(t) {\n const start = this.start;\n const control1 = this.controlPoint1;\n const control2 = this.controlPoint2;\n const end = this.end;\n // shortcuts for `t` values that are out of range\n if (t <= 0) {\n return {\n startControlPoint1: start.clone(),\n startControlPoint2: start.clone(),\n divider: start.clone(),\n dividerControlPoint1: control1.clone(),\n dividerControlPoint2: control2.clone(),\n };\n }\n if (t >= 1) {\n return {\n startControlPoint1: control1.clone(),\n startControlPoint2: control2.clone(),\n divider: end.clone(),\n dividerControlPoint1: end.clone(),\n dividerControlPoint2: end.clone(),\n };\n }\n const midpoint1 = new Line(start, control1).pointAt(t);\n const midpoint2 = new Line(control1, control2).pointAt(t);\n const midpoint3 = new Line(control2, end).pointAt(t);\n const subControl1 = new Line(midpoint1, midpoint2).pointAt(t);\n const subControl2 = new Line(midpoint2, midpoint3).pointAt(t);\n const divideLine = new Line(subControl1, subControl2).pointAt(t);\n return {\n startControlPoint1: midpoint1,\n startControlPoint2: subControl1,\n divider: divideLine,\n dividerControlPoint1: subControl2,\n dividerControlPoint2: midpoint3,\n };\n }\n getSubdivisions(options = {}) {\n const precision = this.getPrecision(options);\n let subdivisions = [\n new Curve(this.start, this.controlPoint1, this.controlPoint2, this.end),\n ];\n if (precision === 0) {\n return subdivisions;\n }\n let previousLength = this.endpointDistance();\n const precisionRatio = Math.pow(10, -precision); // eslint-disable-line\n // Recursively divide curve at `t = 0.5`, until the difference between\n // observed length at subsequent iterations is lower than precision.\n let iteration = 0;\n // eslint-disable-next-line\n while (true) {\n iteration += 1;\n const divisions = [];\n subdivisions.forEach((c) => {\n // dividing at t = 0.5 (not at middle length!)\n const divided = c.divide(0.5);\n divisions.push(divided[0], divided[1]);\n });\n // measure new length\n const length = divisions.reduce((memo, c) => memo + c.endpointDistance(), 0);\n // check if we have reached required observed precision\n // sine-like curves may have the same observed length in iteration 0 and 1 - skip iteration 1\n // not a problem for further iterations because cubic curves cannot have more than two local extrema\n // (i.e. cubic curves cannot intersect the baseline more than once)\n // therefore two subsequent iterations cannot produce sampling with equal length\n const ratio = length !== 0 ? (length - previousLength) / length : 0;\n if (iteration > 1 && ratio < precisionRatio) {\n return divisions;\n }\n subdivisions = divisions;\n previousLength = length;\n }\n }\n length(options = {}) {\n const divisions = this.getDivisions(options);\n return divisions.reduce((memo, c) => {\n return memo + c.endpointDistance();\n }, 0);\n }\n lengthAtT(t, options = {}) {\n if (t <= 0) {\n return 0;\n }\n const precision = options.precision === undefined ? this.PRECISION : options.precision;\n const subCurve = this.divide(t)[0];\n return subCurve.length({ precision });\n }\n pointAt(ratio, options = {}) {\n if (ratio <= 0) {\n return this.start.clone();\n }\n if (ratio >= 1) {\n return this.end.clone();\n }\n const t = this.tAt(ratio, options);\n return this.pointAtT(t);\n }\n pointAtLength(length, options = {}) {\n const t = this.tAtLength(length, options);\n return this.pointAtT(t);\n }\n pointAtT(t) {\n if (t <= 0) {\n return this.start.clone();\n }\n if (t >= 1) {\n return this.end.clone();\n }\n return this.getSkeletonPoints(t).divider;\n }\n isDifferentiable() {\n const start = this.start;\n const control1 = this.controlPoint1;\n const control2 = this.controlPoint2;\n const end = this.end;\n return !(start.equals(control1) &&\n control1.equals(control2) &&\n control2.equals(end));\n }\n tangentAt(ratio, options = {}) {\n if (!this.isDifferentiable())\n return null;\n if (ratio < 0) {\n ratio = 0; // eslint-disable-line\n }\n else if (ratio > 1) {\n ratio = 1; // eslint-disable-line\n }\n const t = this.tAt(ratio, options);\n return this.tangentAtT(t);\n }\n tangentAtLength(length, options = {}) {\n if (!this.isDifferentiable()) {\n return null;\n }\n const t = this.tAtLength(length, options);\n return this.tangentAtT(t);\n }\n tangentAtT(t) {\n if (!this.isDifferentiable()) {\n return null;\n }\n if (t < 0) {\n t = 0; // eslint-disable-line\n }\n if (t > 1) {\n t = 1; // eslint-disable-line\n }\n const skeletonPoints = this.getSkeletonPoints(t);\n const p1 = skeletonPoints.startControlPoint2;\n const p2 = skeletonPoints.dividerControlPoint1;\n const tangentStart = skeletonPoints.divider;\n const tangentLine = new Line(p1, p2);\n // move so that tangent line starts at the point requested\n tangentLine.translate(tangentStart.x - p1.x, tangentStart.y - p1.y);\n return tangentLine;\n }\n getPrecision(options = {}) {\n return options.precision == null ? this.PRECISION : options.precision;\n }\n getDivisions(options = {}) {\n if (options.subdivisions != null) {\n return options.subdivisions;\n }\n const precision = this.getPrecision(options);\n return this.getSubdivisions({ precision });\n }\n getOptions(options = {}) {\n const precision = this.getPrecision(options);\n const subdivisions = this.getDivisions(options);\n return { precision, subdivisions };\n }\n tAt(ratio, options = {}) {\n if (ratio <= 0) {\n return 0;\n }\n if (ratio >= 1) {\n return 1;\n }\n const opts = this.getOptions(options);\n const total = this.length(opts);\n const length = total * ratio;\n return this.tAtLength(length, opts);\n }\n tAtLength(length, options = {}) {\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n const precision = this.getPrecision(options);\n const subdivisions = this.getDivisions(options);\n const opts = { precision, subdivisions };\n let investigatedSubdivision = null;\n let investigatedSubdivisionStartT;\n let investigatedSubdivisionEndT;\n let baselinePointDistFromStart = 0;\n let baselinePointDistFromEnd = 0;\n let memo = 0;\n const count = subdivisions.length;\n let piece = count > 0 ? 1 / count : 0;\n for (let i = 0; i < count; i += 1) {\n const index = fromStart ? i : count - 1 - i;\n const division = subdivisions[i];\n const dist = division.endpointDistance();\n if (length <= memo + dist) {\n investigatedSubdivision = division;\n investigatedSubdivisionStartT = index * piece;\n investigatedSubdivisionEndT = (index + 1) * piece;\n baselinePointDistFromStart = fromStart\n ? length - memo\n : dist + memo - length;\n baselinePointDistFromEnd = fromStart\n ? dist + memo - length\n : length - memo;\n break;\n }\n memo += dist;\n }\n if (investigatedSubdivision == null) {\n return fromStart ? 1 : 0;\n }\n // note that precision affects what length is recorded\n // (imprecise measurements underestimate length by up to 10^(-precision) of the precise length)\n // e.g. at precision 1, the length may be underestimated by up to 10% and cause this function to return 1\n const total = this.length(opts);\n const precisionRatio = Math.pow(10, -precision); // eslint-disable-line\n // recursively divide investigated subdivision:\n // until distance between baselinePoint and closest path endpoint is within 10^(-precision)\n // then return the closest endpoint of that final subdivision\n // eslint-disable-next-line\n while (true) {\n let ratio;\n ratio = total !== 0 ? baselinePointDistFromStart / total : 0;\n if (ratio < precisionRatio) {\n return investigatedSubdivisionStartT;\n }\n ratio = total !== 0 ? baselinePointDistFromEnd / total : 0;\n if (ratio < precisionRatio) {\n return investigatedSubdivisionEndT;\n }\n // otherwise, set up for next iteration\n let newBaselinePointDistFromStart;\n let newBaselinePointDistFromEnd;\n const divided = investigatedSubdivision.divide(0.5);\n piece /= 2;\n const baseline1Length = divided[0].endpointDistance();\n const baseline2Length = divided[1].endpointDistance();\n if (baselinePointDistFromStart <= baseline1Length) {\n investigatedSubdivision = divided[0];\n investigatedSubdivisionEndT -= piece;\n newBaselinePointDistFromStart = baselinePointDistFromStart;\n newBaselinePointDistFromEnd =\n baseline1Length - newBaselinePointDistFromStart;\n }\n else {\n investigatedSubdivision = divided[1];\n investigatedSubdivisionStartT += piece;\n newBaselinePointDistFromStart =\n baselinePointDistFromStart - baseline1Length;\n newBaselinePointDistFromEnd =\n baseline2Length - newBaselinePointDistFromStart;\n }\n baselinePointDistFromStart = newBaselinePointDistFromStart;\n baselinePointDistFromEnd = newBaselinePointDistFromEnd;\n }\n }\n toPoints(options = {}) {\n const subdivisions = this.getDivisions(options);\n const points = [subdivisions[0].start.clone()];\n subdivisions.forEach((c) => points.push(c.end.clone()));\n return points;\n }\n toPolyline(options = {}) {\n return new Polyline(this.toPoints(options));\n }\n scale(sx, sy, origin) {\n this.start.scale(sx, sy, origin);\n this.controlPoint1.scale(sx, sy, origin);\n this.controlPoint2.scale(sx, sy, origin);\n this.end.scale(sx, sy, origin);\n return this;\n }\n rotate(angle, origin) {\n this.start.rotate(angle, origin);\n this.controlPoint1.rotate(angle, origin);\n this.controlPoint2.rotate(angle, origin);\n this.end.rotate(angle, origin);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.start.translate(tx, ty);\n this.controlPoint1.translate(tx, ty);\n this.controlPoint2.translate(tx, ty);\n this.end.translate(tx, ty);\n }\n else {\n this.start.translate(tx);\n this.controlPoint1.translate(tx);\n this.controlPoint2.translate(tx);\n this.end.translate(tx);\n }\n return this;\n }\n equals(c) {\n return (c != null &&\n this.start.equals(c.start) &&\n this.controlPoint1.equals(c.controlPoint1) &&\n this.controlPoint2.equals(c.controlPoint2) &&\n this.end.equals(c.end));\n }\n clone() {\n return new Curve(this.start, this.controlPoint1, this.controlPoint2, this.end);\n }\n toJSON() {\n return {\n start: this.start.toJSON(),\n controlPoint1: this.controlPoint1.toJSON(),\n controlPoint2: this.controlPoint2.toJSON(),\n end: this.end.toJSON(),\n };\n }\n serialize() {\n return [\n this.start.serialize(),\n this.controlPoint1.serialize(),\n this.controlPoint2.serialize(),\n this.end.serialize(),\n ].join(' ');\n }\n}\n(function (Curve) {\n Curve.toStringTag = `X6.Geometry.${Curve.name}`;\n function isCurve(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Curve) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const curve = instance;\n try {\n if ((tag == null || tag === Curve.toStringTag) &&\n Point.isPoint(curve.start) &&\n Point.isPoint(curve.controlPoint1) &&\n Point.isPoint(curve.controlPoint2) &&\n Point.isPoint(curve.end) &&\n typeof curve.toPoints === 'function' &&\n typeof curve.toPolyline === 'function') {\n return true;\n }\n }\n catch (e) {\n return false;\n }\n return false;\n }\n Curve.isCurve = isCurve;\n})(Curve || (Curve = {}));\n(function (Curve) {\n function getFirstControlPoints(rhs) {\n const n = rhs.length;\n const x = []; // `x` is a solution vector.\n const tmp = [];\n let b = 2.0;\n x[0] = rhs[0] / b;\n // Decomposition and forward substitution.\n for (let i = 1; i < n; i += 1) {\n tmp[i] = 1 / b;\n b = (i < n - 1 ? 4.0 : 3.5) - tmp[i];\n x[i] = (rhs[i] - x[i - 1]) / b;\n }\n for (let i = 1; i < n; i += 1) {\n // Backsubstitution.\n x[n - i - 1] -= tmp[n - i] * x[n - i];\n }\n return x;\n }\n function getCurveControlPoints(points) {\n const knots = points.map((p) => Point.clone(p));\n const firstControlPoints = [];\n const secondControlPoints = [];\n const n = knots.length - 1;\n // Special case: Bezier curve should be a straight line.\n if (n === 1) {\n // 3P1 = 2P0 + P3\n firstControlPoints[0] = new Point((2 * knots[0].x + knots[1].x) / 3, (2 * knots[0].y + knots[1].y) / 3);\n // P2 = 2P1 – P0\n secondControlPoints[0] = new Point(2 * firstControlPoints[0].x - knots[0].x, 2 * firstControlPoints[0].y - knots[0].y);\n return [firstControlPoints, secondControlPoints];\n }\n // Calculate first Bezier control points.\n // Right hand side vector.\n const rhs = [];\n // Set right hand side X values.\n for (let i = 1; i < n - 1; i += 1) {\n rhs[i] = 4 * knots[i].x + 2 * knots[i + 1].x;\n }\n rhs[0] = knots[0].x + 2 * knots[1].x;\n rhs[n - 1] = (8 * knots[n - 1].x + knots[n].x) / 2.0;\n // Get first control points X-values.\n const x = getFirstControlPoints(rhs);\n // Set right hand side Y values.\n for (let i = 1; i < n - 1; i += 1) {\n rhs[i] = 4 * knots[i].y + 2 * knots[i + 1].y;\n }\n rhs[0] = knots[0].y + 2 * knots[1].y;\n rhs[n - 1] = (8 * knots[n - 1].y + knots[n].y) / 2.0;\n // Get first control points Y-values.\n const y = getFirstControlPoints(rhs);\n // Fill output arrays.\n for (let i = 0; i < n; i += 1) {\n // First control point.\n firstControlPoints.push(new Point(x[i], y[i]));\n // Second control point.\n if (i < n - 1) {\n secondControlPoints.push(new Point(2 * knots[i + 1].x - x[i + 1], 2 * knots[i + 1].y - y[i + 1]));\n }\n else {\n secondControlPoints.push(new Point((knots[n].x + x[n - 1]) / 2, (knots[n].y + y[n - 1]) / 2));\n }\n }\n return [firstControlPoints, secondControlPoints];\n }\n function throughPoints(points) {\n if (points == null || (Array.isArray(points) && points.length < 2)) {\n throw new Error('At least 2 points are required');\n }\n const controlPoints = getCurveControlPoints(points);\n const curves = [];\n for (let i = 0, ii = controlPoints[0].length; i < ii; i += 1) {\n const controlPoint1 = new Point(controlPoints[0][i].x, controlPoints[0][i].y);\n const controlPoint2 = new Point(controlPoints[1][i].x, controlPoints[1][i].y);\n curves.push(new Curve(points[i], controlPoint1, controlPoint2, points[i + 1]));\n }\n return curves;\n }\n Curve.throughPoints = throughPoints;\n})(Curve || (Curve = {}));\n//# sourceMappingURL=curve.js.map","import { Geometry } from '../geometry';\nexport class Segment extends Geometry {\n constructor() {\n super(...arguments);\n this.isVisible = true;\n this.isSegment = true;\n this.isSubpathStart = false;\n }\n get end() {\n return this.endPoint;\n }\n get start() {\n if (this.previousSegment == null) {\n throw new Error('Missing previous segment. (This segment cannot be the ' +\n 'first segment of a path, or segment has not yet been ' +\n 'added to a path.)');\n }\n return this.previousSegment.end;\n }\n closestPointT(p, options) {\n if (this.closestPointNormalizedLength) {\n return this.closestPointNormalizedLength(p);\n }\n throw new Error('Neither `closestPointT` nor `closestPointNormalizedLength` method is implemented.');\n }\n // eslint-disable-next-line\n lengthAtT(t, options) {\n if (t <= 0) {\n return 0;\n }\n const length = this.length();\n if (t >= 1) {\n return length;\n }\n return length * t;\n }\n divideAtT(t) {\n if (this.divideAt) {\n return this.divideAt(t);\n }\n throw new Error('Neither `divideAtT` nor `divideAt` method is implemented.');\n }\n pointAtT(t) {\n if (this.pointAt) {\n return this.pointAt(t);\n }\n throw new Error('Neither `pointAtT` nor `pointAt` method is implemented.');\n }\n tangentAtT(t) {\n if (this.tangentAt) {\n return this.tangentAt(t);\n }\n throw new Error('Neither `tangentAtT` nor `tangentAt` method is implemented.');\n }\n}\n//# sourceMappingURL=segment.js.map","import { Line } from '../line';\nimport { Point } from '../point';\nimport { Segment } from './segment';\nexport class LineTo extends Segment {\n constructor(x, y) {\n super();\n if (Line.isLine(x)) {\n this.endPoint = x.end.clone().round(2);\n }\n else {\n this.endPoint = Point.create(x, y).round(2);\n }\n }\n get type() {\n return 'L';\n }\n get line() {\n return new Line(this.start, this.end);\n }\n bbox() {\n return this.line.bbox();\n }\n closestPoint(p) {\n return this.line.closestPoint(p);\n }\n closestPointLength(p) {\n return this.line.closestPointLength(p);\n }\n closestPointNormalizedLength(p) {\n return this.line.closestPointNormalizedLength(p);\n }\n closestPointTangent(p) {\n return this.line.closestPointTangent(p);\n }\n length() {\n return this.line.length();\n }\n divideAt(ratio) {\n const divided = this.line.divideAt(ratio);\n return [new LineTo(divided[0]), new LineTo(divided[1])];\n }\n divideAtLength(length) {\n const divided = this.line.divideAtLength(length);\n return [new LineTo(divided[0]), new LineTo(divided[1])];\n }\n getSubdivisions() {\n return [];\n }\n pointAt(ratio) {\n return this.line.pointAt(ratio);\n }\n pointAtLength(length) {\n return this.line.pointAtLength(length);\n }\n tangentAt(ratio) {\n return this.line.tangentAt(ratio);\n }\n tangentAtLength(length) {\n return this.line.tangentAtLength(length);\n }\n isDifferentiable() {\n if (this.previousSegment == null) {\n return false;\n }\n return !this.start.equals(this.end);\n }\n clone() {\n return new LineTo(this.end);\n }\n scale(sx, sy, origin) {\n this.end.scale(sx, sy, origin);\n return this;\n }\n rotate(angle, origin) {\n this.end.rotate(angle, origin);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.end.translate(tx, ty);\n }\n else {\n this.end.translate(tx);\n }\n return this;\n }\n equals(s) {\n return (this.type === s.type &&\n this.start.equals(s.start) &&\n this.end.equals(s.end));\n }\n toJSON() {\n return {\n type: this.type,\n start: this.start.toJSON(),\n end: this.end.toJSON(),\n };\n }\n serialize() {\n const end = this.end;\n return `${this.type} ${end.x} ${end.y}`;\n }\n}\n(function (LineTo) {\n function create(...args) {\n const len = args.length;\n const arg0 = args[0];\n // line provided\n if (Line.isLine(arg0)) {\n return new LineTo(arg0);\n }\n // points provided\n if (Point.isPointLike(arg0)) {\n if (len === 1) {\n return new LineTo(arg0);\n }\n // poly-line segment\n return args.map((arg) => new LineTo(arg));\n }\n // coordinates provided\n if (len === 2) {\n return new LineTo(+args[0], +args[1]);\n }\n // poly-line segment\n const segments = [];\n for (let i = 0; i < len; i += 2) {\n const x = +args[i];\n const y = +args[i + 1];\n segments.push(new LineTo(x, y));\n }\n return segments;\n }\n LineTo.create = create;\n})(LineTo || (LineTo = {}));\n//# sourceMappingURL=lineto.js.map","import { Line } from '../line';\nimport { LineTo } from './lineto';\nimport { Segment } from './segment';\nexport class Close extends Segment {\n get end() {\n if (!this.subpathStartSegment) {\n throw new Error('Missing subpath start segment. (This segment needs a subpath ' +\n 'start segment (e.g. MoveTo), or segment has not yet been added' +\n ' to a path.)');\n }\n return this.subpathStartSegment.end;\n }\n get type() {\n return 'Z';\n }\n get line() {\n return new Line(this.start, this.end);\n }\n bbox() {\n return this.line.bbox();\n }\n closestPoint(p) {\n return this.line.closestPoint(p);\n }\n closestPointLength(p) {\n return this.line.closestPointLength(p);\n }\n closestPointNormalizedLength(p) {\n return this.line.closestPointNormalizedLength(p);\n }\n closestPointTangent(p) {\n return this.line.closestPointTangent(p);\n }\n length() {\n return this.line.length();\n }\n divideAt(ratio) {\n const divided = this.line.divideAt(ratio);\n return [\n // do not actually cut into the segment, first divided part can stay as Z\n divided[1].isDifferentiable() ? new LineTo(divided[0]) : this.clone(),\n new LineTo(divided[1]),\n ];\n }\n divideAtLength(length) {\n const divided = this.line.divideAtLength(length);\n return [\n divided[1].isDifferentiable() ? new LineTo(divided[0]) : this.clone(),\n new LineTo(divided[1]),\n ];\n }\n getSubdivisions() {\n return [];\n }\n pointAt(ratio) {\n return this.line.pointAt(ratio);\n }\n pointAtLength(length) {\n return this.line.pointAtLength(length);\n }\n tangentAt(ratio) {\n return this.line.tangentAt(ratio);\n }\n tangentAtLength(length) {\n return this.line.tangentAtLength(length);\n }\n isDifferentiable() {\n if (!this.previousSegment || !this.subpathStartSegment) {\n return false;\n }\n return !this.start.equals(this.end);\n }\n scale() {\n return this;\n }\n rotate() {\n return this;\n }\n translate() {\n return this;\n }\n equals(s) {\n return (this.type === s.type &&\n this.start.equals(s.start) &&\n this.end.equals(s.end));\n }\n clone() {\n return new Close();\n }\n toJSON() {\n return {\n type: this.type,\n start: this.start.toJSON(),\n end: this.end.toJSON(),\n };\n }\n serialize() {\n return this.type;\n }\n}\n(function (Close) {\n function create() {\n return new Close();\n }\n Close.create = create;\n})(Close || (Close = {}));\n//# sourceMappingURL=close.js.map","import { Line } from '../line';\nimport { Curve } from '../curve';\nimport { Point } from '../point';\nimport { LineTo } from './lineto';\nimport { Segment } from './segment';\nexport class MoveTo extends Segment {\n constructor(x, y) {\n super();\n this.isVisible = false;\n this.isSubpathStart = true;\n if (Line.isLine(x) || Curve.isCurve(x)) {\n this.endPoint = x.end.clone().round(2);\n }\n else {\n this.endPoint = Point.create(x, y).round(2);\n }\n }\n get start() {\n throw new Error('Illegal access. Moveto segments should not need a start property.');\n }\n get type() {\n return 'M';\n }\n bbox() {\n return null;\n }\n closestPoint() {\n return this.end.clone();\n }\n closestPointLength() {\n return 0;\n }\n closestPointNormalizedLength() {\n return 0;\n }\n closestPointT() {\n return 1;\n }\n closestPointTangent() {\n return null;\n }\n length() {\n return 0;\n }\n lengthAtT() {\n return 0;\n }\n divideAt() {\n return [this.clone(), this.clone()];\n }\n divideAtLength() {\n return [this.clone(), this.clone()];\n }\n getSubdivisions() {\n return [];\n }\n pointAt() {\n return this.end.clone();\n }\n pointAtLength() {\n return this.end.clone();\n }\n pointAtT() {\n return this.end.clone();\n }\n tangentAt() {\n return null;\n }\n tangentAtLength() {\n return null;\n }\n tangentAtT() {\n return null;\n }\n isDifferentiable() {\n return false;\n }\n scale(sx, sy, origin) {\n this.end.scale(sx, sy, origin);\n return this;\n }\n rotate(angle, origin) {\n this.end.rotate(angle, origin);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.end.translate(tx, ty);\n }\n else {\n this.end.translate(tx);\n }\n return this;\n }\n clone() {\n return new MoveTo(this.end);\n }\n equals(s) {\n return this.type === s.type && this.end.equals(s.end);\n }\n toJSON() {\n return {\n type: this.type,\n end: this.end.toJSON(),\n };\n }\n serialize() {\n const end = this.end;\n return `${this.type} ${end.x} ${end.y}`;\n }\n}\n(function (MoveTo) {\n function create(...args) {\n const len = args.length;\n const arg0 = args[0];\n // line provided\n if (Line.isLine(arg0)) {\n return new MoveTo(arg0);\n }\n // curve provided\n if (Curve.isCurve(arg0)) {\n return new MoveTo(arg0);\n }\n // points provided\n if (Point.isPointLike(arg0)) {\n if (len === 1) {\n return new MoveTo(arg0);\n }\n // this is a moveto-with-subsequent-poly-line segment\n const segments = [];\n // points come one by one\n for (let i = 0; i < len; i += 1) {\n if (i === 0) {\n segments.push(new MoveTo(args[i]));\n }\n else {\n segments.push(new LineTo(args[i]));\n }\n }\n return segments;\n }\n // coordinates provided\n if (len === 2) {\n return new MoveTo(+args[0], +args[1]);\n }\n // this is a moveto-with-subsequent-poly-line segment\n const segments = [];\n for (let i = 0; i < len; i += 2) {\n const x = +args[i];\n const y = +args[i + 1];\n if (i === 0) {\n segments.push(new MoveTo(x, y));\n }\n else {\n segments.push(new LineTo(x, y));\n }\n }\n return segments;\n }\n MoveTo.create = create;\n})(MoveTo || (MoveTo = {}));\n//# sourceMappingURL=moveto.js.map","import { Curve } from '../curve';\nimport { Point } from '../point';\nimport { Segment } from './segment';\nexport class CurveTo extends Segment {\n constructor(arg0, arg1, arg2, arg3, arg4, arg5) {\n super();\n if (Curve.isCurve(arg0)) {\n this.controlPoint1 = arg0.controlPoint1.clone().round(2);\n this.controlPoint2 = arg0.controlPoint2.clone().round(2);\n this.endPoint = arg0.end.clone().round(2);\n }\n else if (typeof arg0 === 'number') {\n this.controlPoint1 = new Point(arg0, arg1).round(2);\n this.controlPoint2 = new Point(arg2, arg3).round(2);\n this.endPoint = new Point(arg4, arg5).round(2);\n }\n else {\n this.controlPoint1 = Point.create(arg0).round(2);\n this.controlPoint2 = Point.create(arg1).round(2);\n this.endPoint = Point.create(arg2).round(2);\n }\n }\n get type() {\n return 'C';\n }\n get curve() {\n return new Curve(this.start, this.controlPoint1, this.controlPoint2, this.end);\n }\n bbox() {\n return this.curve.bbox();\n }\n closestPoint(p) {\n return this.curve.closestPoint(p);\n }\n closestPointLength(p) {\n return this.curve.closestPointLength(p);\n }\n closestPointNormalizedLength(p) {\n return this.curve.closestPointNormalizedLength(p);\n }\n closestPointTangent(p) {\n return this.curve.closestPointTangent(p);\n }\n length() {\n return this.curve.length();\n }\n divideAt(ratio, options = {}) {\n // TODO: fix options\n const divided = this.curve.divideAt(ratio, options);\n return [new CurveTo(divided[0]), new CurveTo(divided[1])];\n }\n divideAtLength(length, options = {}) {\n // TODO: fix options\n const divided = this.curve.divideAtLength(length, options);\n return [new CurveTo(divided[0]), new CurveTo(divided[1])];\n }\n divideAtT(t) {\n const divided = this.curve.divideAtT(t);\n return [new CurveTo(divided[0]), new CurveTo(divided[1])];\n }\n getSubdivisions() {\n return [];\n }\n pointAt(ratio) {\n return this.curve.pointAt(ratio);\n }\n pointAtLength(length) {\n return this.curve.pointAtLength(length);\n }\n tangentAt(ratio) {\n return this.curve.tangentAt(ratio);\n }\n tangentAtLength(length) {\n return this.curve.tangentAtLength(length);\n }\n isDifferentiable() {\n if (!this.previousSegment) {\n return false;\n }\n const start = this.start;\n const control1 = this.controlPoint1;\n const control2 = this.controlPoint2;\n const end = this.end;\n return !(start.equals(control1) &&\n control1.equals(control2) &&\n control2.equals(end));\n }\n scale(sx, sy, origin) {\n this.controlPoint1.scale(sx, sy, origin);\n this.controlPoint2.scale(sx, sy, origin);\n this.end.scale(sx, sy, origin);\n return this;\n }\n rotate(angle, origin) {\n this.controlPoint1.rotate(angle, origin);\n this.controlPoint2.rotate(angle, origin);\n this.end.rotate(angle, origin);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.controlPoint1.translate(tx, ty);\n this.controlPoint2.translate(tx, ty);\n this.end.translate(tx, ty);\n }\n else {\n this.controlPoint1.translate(tx);\n this.controlPoint2.translate(tx);\n this.end.translate(tx);\n }\n return this;\n }\n equals(s) {\n return (this.start.equals(s.start) &&\n this.end.equals(s.end) &&\n this.controlPoint1.equals(s.controlPoint1) &&\n this.controlPoint2.equals(s.controlPoint2));\n }\n clone() {\n return new CurveTo(this.controlPoint1, this.controlPoint2, this.end);\n }\n toJSON() {\n return {\n type: this.type,\n start: this.start.toJSON(),\n controlPoint1: this.controlPoint1.toJSON(),\n controlPoint2: this.controlPoint2.toJSON(),\n end: this.end.toJSON(),\n };\n }\n serialize() {\n const c1 = this.controlPoint1;\n const c2 = this.controlPoint2;\n const end = this.end;\n return [this.type, c1.x, c1.y, c2.x, c2.y, end.x, end.y].join(' ');\n }\n}\n(function (CurveTo) {\n function create(...args) {\n const len = args.length;\n const arg0 = args[0];\n // curve provided\n if (Curve.isCurve(arg0)) {\n return new CurveTo(arg0);\n }\n // points provided\n if (Point.isPointLike(arg0)) {\n if (len === 3) {\n return new CurveTo(args[0], args[1], args[2]);\n }\n // this is a poly-bezier segment\n const segments = [];\n for (let i = 0; i < len; i += 3) {\n segments.push(new CurveTo(args[i], args[i + 1], args[i + 2]));\n }\n return segments;\n }\n // coordinates provided\n if (len === 6) {\n return new CurveTo(args[0], args[1], args[2], args[3], args[4], args[5]);\n }\n // this is a poly-bezier segment\n const segments = [];\n for (let i = 0; i < len; i += 6) {\n segments.push(new CurveTo(args[i], args[i + 1], args[i + 2], args[i + 3], args[i + 4], args[i + 5]));\n }\n return segments;\n }\n CurveTo.create = create;\n})(CurveTo || (CurveTo = {}));\n//# sourceMappingURL=curveto.js.map","import { round } from '../util';\nfunction rotate(x, y, rad) {\n return {\n x: x * Math.cos(rad) - y * Math.sin(rad),\n y: x * Math.sin(rad) + y * Math.cos(rad),\n };\n}\nfunction q2c(x1, y1, ax, ay, x2, y2) {\n const v13 = 1 / 3;\n const v23 = 2 / 3;\n return [\n v13 * x1 + v23 * ax,\n v13 * y1 + v23 * ay,\n v13 * x2 + v23 * ax,\n v13 * y2 + v23 * ay,\n x2,\n y2,\n ];\n}\nfunction a2c(x1, y1, rx, ry, angle, largeArcFlag, sweepFlag, x2, y2, recursive) {\n // for more information of where this math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const v120 = (Math.PI * 120) / 180;\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n if (!recursive) {\n xy = rotate(x1, y1, -rad);\n x1 = xy.x; // eslint-disable-line\n y1 = xy.y; // eslint-disable-line\n xy = rotate(x2, y2, -rad);\n x2 = xy.x; // eslint-disable-line\n y2 = xy.y; // eslint-disable-line\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx = h * rx; // eslint-disable-line\n ry = h * ry; // eslint-disable-line\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n const k = (largeArcFlag === sweepFlag ? -1 : 1) *\n Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)));\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n f1 = Math.asin((y1 - cy) / ry);\n f2 = Math.asin((y2 - cy) / ry);\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) {\n f1 = Math.PI * 2 + f1;\n }\n if (f2 < 0) {\n f2 = Math.PI * 2 + f2;\n }\n if (sweepFlag && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!sweepFlag && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n }\n else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n let df = f2 - f1;\n if (Math.abs(df) > v120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + v120 * (sweepFlag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2); // eslint-disable-line\n y2 = cy + ry * Math.sin(f2); // eslint-disable-line\n res = a2c(x2, y2, rx, ry, angle, 0, sweepFlag, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * (rx * t);\n const hy = (4 / 3) * (ry * t);\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2, m3, m4].concat(res);\n }\n {\n res = [m2, m3, m4].concat(res).join().split(',');\n const newres = [];\n const ii = res.length;\n for (let i = 0; i < ii; i += 1) {\n newres[i] =\n i % 2\n ? rotate(+res[i - 1], +res[i], rad).y\n : rotate(+res[i], +res[i + 1], rad).x;\n }\n return newres;\n }\n}\nfunction parse(pathData) {\n if (!pathData) {\n return null;\n }\n const spaces = '\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029';\n // https://regexper.com/#%28%5Ba-z%5D%29%5B%5Cs%2C%5D*%28%28-%3F%5Cd*%5C.%3F%5C%5Cd*%28%3F%3Ae%5B%5C-%2B%5D%3F%5Cd%2B%29%3F%5B%5Cs%5D*%2C%3F%5B%5Cs%5D*%29%2B%29\n const segmentReg = new RegExp(`([a-z])[${spaces},]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[${spaces}]*,?[${spaces}]*)+)`, // eslint-disable-line\n 'ig');\n // https://regexper.com/#%28-%3F%5Cd*%5C.%3F%5Cd*%28%3F%3Ae%5B%5C-%2B%5D%3F%5Cd%2B%29%3F%29%5B%5Cs%5D*%2C%3F%5B%5Cs%5D*\n const commandParamReg = new RegExp(\n // eslint-disable-next-line\n `(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[${spaces}]*,?[${spaces}]*`, 'ig');\n const paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n };\n const segmetns = [];\n pathData.replace(segmentReg, (input, cmd, args) => {\n const params = [];\n let command = cmd.toLowerCase();\n args.replace(commandParamReg, (a, b) => {\n if (b) {\n params.push(+b);\n }\n return a;\n });\n if (command === 'm' && params.length > 2) {\n segmetns.push([cmd, ...params.splice(0, 2)]);\n command = 'l';\n cmd = cmd === 'm' ? 'l' : 'L'; // eslint-disable-line\n }\n const count = paramsCount[command];\n while (params.length >= count) {\n segmetns.push([cmd, ...params.splice(0, count)]);\n if (!count) {\n break;\n }\n }\n return input;\n });\n return segmetns;\n}\nfunction abs(pathString) {\n const pathArray = parse(pathString);\n // if invalid string, return 'M 0 0'\n if (!pathArray || !pathArray.length) {\n return [['M', 0, 0]];\n }\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const segments = [];\n for (let i = 0, ii = pathArray.length; i < ii; i += 1) {\n const r = [];\n segments.push(r);\n const segment = pathArray[i];\n const command = segment[0];\n if (command !== command.toUpperCase()) {\n r[0] = command.toUpperCase();\n switch (r[0]) {\n case 'A':\n r[1] = segment[1];\n r[2] = segment[2];\n r[3] = segment[3];\n r[4] = segment[4];\n r[5] = segment[5];\n r[6] = +segment[6] + x;\n r[7] = +segment[7] + y;\n break;\n case 'V':\n r[1] = +segment[1] + y;\n break;\n case 'H':\n r[1] = +segment[1] + x;\n break;\n case 'M':\n mx = +segment[1] + x;\n my = +segment[2] + y;\n for (let j = 1, jj = segment.length; j < jj; j += 1) {\n r[j] = +segment[j] + (j % 2 ? x : y);\n }\n break;\n default:\n for (let j = 1, jj = segment.length; j < jj; j += 1) {\n r[j] = +segment[j] + (j % 2 ? x : y);\n }\n break;\n }\n }\n else {\n for (let j = 0, jj = segment.length; j < jj; j += 1) {\n r[j] = segment[j];\n }\n }\n switch (r[0]) {\n case 'Z':\n x = +mx;\n y = +my;\n break;\n case 'H':\n x = r[1];\n break;\n case 'V':\n y = r[1];\n break;\n case 'M':\n mx = r[r.length - 2];\n my = r[r.length - 1];\n x = r[r.length - 2];\n y = r[r.length - 1];\n break;\n default:\n x = r[r.length - 2];\n y = r[r.length - 1];\n break;\n }\n }\n return segments;\n}\nfunction normalize(path) {\n const pathArray = abs(path);\n const attrs = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null };\n function processPath(path, d, pcom) {\n let nx;\n let ny;\n if (!path) {\n return ['C', d.x, d.y, d.x, d.y, d.x, d.y];\n }\n if (!(path[0] in { T: 1, Q: 1 })) {\n d.qx = null;\n d.qy = null;\n }\n switch (path[0]) {\n case 'M':\n d.X = path[1];\n d.Y = path[2];\n break;\n case 'A':\n if (parseFloat(path[1]) === 0 || parseFloat(path[2]) === 0) {\n // https://www.w3.org/TR/SVG/paths.html#ArcOutOfRangeParameters\n // \"If either rx or ry is 0, then this arc is treated as a\n // straight line segment (a \"lineto\") joining the endpoints.\"\n return ['L', path[6], path[7]];\n }\n return ['C'].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n case 'S':\n if (pcom === 'C' || pcom === 'S') {\n // In 'S' case we have to take into account, if the previous command is C/S.\n nx = d.x * 2 - d.bx; // And reflect the previous\n ny = d.y * 2 - d.by; // command's control point relative to the current point.\n }\n else {\n // or some else or nothing\n nx = d.x;\n ny = d.y;\n }\n return ['C', nx, ny].concat(path.slice(1));\n case 'T':\n if (pcom === 'Q' || pcom === 'T') {\n // In 'T' case we have to take into account, if the previous command is Q/T.\n d.qx = d.x * 2 - d.qx; // And make a reflection similar\n d.qy = d.y * 2 - d.qy; // to case 'S'.\n }\n else {\n // or something else or nothing\n d.qx = d.x;\n d.qy = d.y;\n }\n return ['C'].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n case 'Q':\n d.qx = path[1];\n d.qy = path[2];\n return ['C'].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n case 'H':\n return ['L'].concat(path[1], d.y);\n case 'V':\n return ['L'].concat(d.x, path[1]);\n case 'L':\n break;\n case 'Z':\n break;\n default:\n break;\n }\n return path;\n }\n function fixArc(pp, i) {\n if (pp[i].length > 7) {\n pp[i].shift();\n const pi = pp[i];\n while (pi.length) {\n // if created multiple 'C's, their original seg is saved\n commands[i] = 'A';\n i += 1; // eslint-disable-line\n pp.splice(i, 0, ['C'].concat(pi.splice(0, 6)));\n }\n pp.splice(i, 1);\n ii = pathArray.length;\n }\n }\n const commands = []; // path commands of original path p\n let prevCommand = ''; // holder for previous path command of original path\n let ii = pathArray.length;\n for (let i = 0; i < ii; i += 1) {\n let command = ''; // temporary holder for original path command\n if (pathArray[i]) {\n command = pathArray[i][0]; // save current path command\n }\n if (command !== 'C') {\n // C is not saved yet, because it may be result of conversion\n commands[i] = command; // Save current path command\n if (i > 0) {\n prevCommand = commands[i - 1]; // Get previous path command pcom\n }\n }\n // Previous path command is inputted to processPath\n pathArray[i] = processPath(pathArray[i], attrs, prevCommand);\n if (commands[i] !== 'A' && command === 'C') {\n commands[i] = 'C'; // 'A' is the only command\n }\n // which may produce multiple 'C's\n // so we have to make sure that 'C' is also 'C' in original path\n fixArc(pathArray, i); // fixArc adds also the right amount of 'A's to pcoms\n const seg = pathArray[i];\n const seglen = seg.length;\n attrs.x = seg[seglen - 2];\n attrs.y = seg[seglen - 1];\n attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x;\n attrs.by = parseFloat(seg[seglen - 3]) || attrs.y;\n }\n // make sure normalized path data string starts with an M segment\n if (!pathArray[0][0] || pathArray[0][0] !== 'M') {\n pathArray.unshift(['M', 0, 0]);\n }\n return pathArray;\n}\n/**\n * Converts provided SVG path data string into a normalized path data string.\n *\n * The normalization uses a restricted subset of path commands; all segments\n * are translated into lineto, curveto, moveto, and closepath segments.\n *\n * Relative path commands are changed into their absolute counterparts,\n * and chaining of coordinates is disallowed.\n *\n * The function will always return a valid path data string; if an input\n * string cannot be normalized, 'M 0 0' is returned.\n */\nexport function normalizePathData(pathData) {\n return normalize(pathData)\n .map((segment) => segment.map((item) => (typeof item === 'string' ? item : round(item, 2))))\n .join(',')\n .split(',')\n .join(' ');\n}\n//# sourceMappingURL=normalize.js.map","import { Point } from '../point';\nconst regexSupportedData = new RegExp(`^[\\\\s\\\\dLMCZz,.]*$`);\nexport function isValid(data) {\n if (typeof data !== 'string') {\n return false;\n }\n return regexSupportedData.test(data);\n}\n/**\n * Returns the remainder of division of `n` by `m`. You should use this\n * instead of the built-in operation as the built-in operation does not\n * properly handle negative numbers.\n */\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction draw(points, round, initialMove, close, exclude) {\n const data = [];\n const end = points[points.length - 1];\n const rounded = round != null && round > 0;\n const arcSize = round || 0;\n // Adds virtual waypoint in the center between start and end point\n if (close && rounded) {\n points = points.slice(); // eslint-disable-line\n const p0 = points[0];\n const wp = new Point(end.x + (p0.x - end.x) / 2, end.y + (p0.y - end.y) / 2);\n points.splice(0, 0, wp);\n }\n let pt = points[0];\n let i = 1;\n // Draws the line segments\n if (initialMove) {\n data.push('M', pt.x, pt.y);\n }\n else {\n data.push('L', pt.x, pt.y);\n }\n while (i < (close ? points.length : points.length - 1)) {\n let tmp = points[mod(i, points.length)];\n let dx = pt.x - tmp.x;\n let dy = pt.y - tmp.y;\n if (rounded &&\n (dx !== 0 || dy !== 0) &&\n (exclude == null || exclude.indexOf(i - 1) < 0)) {\n // Draws a line from the last point to the current\n // point with a spacing of size off the current point\n // into direction of the last point\n let dist = Math.sqrt(dx * dx + dy * dy);\n const nx1 = (dx * Math.min(arcSize, dist / 2)) / dist;\n const ny1 = (dy * Math.min(arcSize, dist / 2)) / dist;\n const x1 = tmp.x + nx1;\n const y1 = tmp.y + ny1;\n data.push('L', x1, y1);\n // Draws a curve from the last point to the current\n // point with a spacing of size off the current point\n // into direction of the next point\n let next = points[mod(i + 1, points.length)];\n // Uses next non-overlapping point\n while (i < points.length - 2 &&\n Math.round(next.x - tmp.x) === 0 &&\n Math.round(next.y - tmp.y) === 0) {\n next = points[mod(i + 2, points.length)];\n i += 1;\n }\n dx = next.x - tmp.x;\n dy = next.y - tmp.y;\n dist = Math.max(1, Math.sqrt(dx * dx + dy * dy));\n const nx2 = (dx * Math.min(arcSize, dist / 2)) / dist;\n const ny2 = (dy * Math.min(arcSize, dist / 2)) / dist;\n const x2 = tmp.x + nx2;\n const y2 = tmp.y + ny2;\n data.push('Q', tmp.x, tmp.y, x2, y2);\n tmp = new Point(x2, y2);\n }\n else {\n data.push('L', tmp.x, tmp.y);\n }\n pt = tmp;\n i += 1;\n }\n if (close) {\n data.push('Z');\n }\n else {\n data.push('L', end.x, end.y);\n }\n return data.map((v) => (typeof v === 'string' ? v : +v.toFixed(3))).join(' ');\n}\nexport function drawPoints(points, options = {}) {\n const pts = [];\n if (points && points.length) {\n points.forEach((p) => {\n if (Array.isArray(p)) {\n pts.push({ x: p[0], y: p[1] });\n }\n else {\n pts.push({ x: p.x, y: p.y });\n }\n });\n }\n return draw(pts, options.round, options.initialMove == null || options.initialMove, options.close, options.exclude);\n}\n/**\n * Converts the given arc to a series of curves.\n */\nexport function arcToCurves(x0, y0, r1, r2, angle = 0, largeArcFlag = 0, sweepFlag = 0, x, y) {\n if (r1 === 0 || r2 === 0) {\n return [];\n }\n x -= x0; // eslint-disable-line\n y -= y0; // eslint-disable-line\n r1 = Math.abs(r1); // eslint-disable-line\n r2 = Math.abs(r2); // eslint-disable-line\n const ctx = -x / 2;\n const cty = -y / 2;\n const cpsi = Math.cos((angle * Math.PI) / 180);\n const spsi = Math.sin((angle * Math.PI) / 180);\n const rxd = cpsi * ctx + spsi * cty;\n const ryd = -1 * spsi * ctx + cpsi * cty;\n const rxdd = rxd * rxd;\n const rydd = ryd * ryd;\n const r1x = r1 * r1;\n const r2y = r2 * r2;\n const lamda = rxdd / r1x + rydd / r2y;\n let sds;\n if (lamda > 1) {\n r1 = Math.sqrt(lamda) * r1; // eslint-disable-line\n r2 = Math.sqrt(lamda) * r2; // eslint-disable-line\n sds = 0;\n }\n else {\n let seif = 1;\n if (largeArcFlag === sweepFlag) {\n seif = -1;\n }\n sds =\n seif *\n Math.sqrt((r1x * r2y - r1x * rydd - r2y * rxdd) / (r1x * rydd + r2y * rxdd));\n }\n const txd = (sds * r1 * ryd) / r2;\n const tyd = (-1 * sds * r2 * rxd) / r1;\n const tx = cpsi * txd - spsi * tyd + x / 2;\n const ty = spsi * txd + cpsi * tyd + y / 2;\n let rad = Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1) - Math.atan2(0, 1);\n let s1 = rad >= 0 ? rad : 2 * Math.PI + rad;\n rad =\n Math.atan2((-ryd - tyd) / r2, (-rxd - txd) / r1) -\n Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1);\n let dr = rad >= 0 ? rad : 2 * Math.PI + rad;\n if (sweepFlag === 0 && dr > 0) {\n dr -= 2 * Math.PI;\n }\n else if (sweepFlag !== 0 && dr < 0) {\n dr += 2 * Math.PI;\n }\n const sse = (dr * 2) / Math.PI;\n const seg = Math.ceil(sse < 0 ? -1 * sse : sse);\n const segr = dr / seg;\n const t = ((8 / 3) * Math.sin(segr / 4) * Math.sin(segr / 4)) / Math.sin(segr / 2);\n const cpsir1 = cpsi * r1;\n const cpsir2 = cpsi * r2;\n const spsir1 = spsi * r1;\n const spsir2 = spsi * r2;\n let mc = Math.cos(s1);\n let ms = Math.sin(s1);\n let x2 = -t * (cpsir1 * ms + spsir2 * mc);\n let y2 = -t * (spsir1 * ms - cpsir2 * mc);\n let x3 = 0;\n let y3 = 0;\n const result = [];\n for (let n = 0; n < seg; n += 1) {\n s1 += segr;\n mc = Math.cos(s1);\n ms = Math.sin(s1);\n x3 = cpsir1 * mc - spsir2 * ms + tx;\n y3 = spsir1 * mc + cpsir2 * ms + ty;\n const dx = -t * (cpsir1 * ms + spsir2 * mc);\n const dy = -t * (spsir1 * ms - cpsir2 * mc);\n // CurveTo updates x0, y0 so need to restore it\n const index = n * 6;\n result[index] = Number(x2 + x0);\n result[index + 1] = Number(y2 + y0);\n result[index + 2] = Number(x3 - dx + x0);\n result[index + 3] = Number(y3 - dy + y0);\n result[index + 4] = Number(x3 + x0);\n result[index + 5] = Number(y3 + y0);\n x2 = x3 + dx;\n y2 = y3 + dy;\n }\n return result.map((num) => +num.toFixed(2));\n}\nexport function drawArc(startX, startY, rx, ry, xAxisRotation = 0, largeArcFlag = 0, sweepFlag = 0, stopX, stopY) {\n const data = [];\n const points = arcToCurves(startX, startY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, stopX, stopY);\n if (points != null) {\n for (let i = 0, ii = points.length; i < ii; i += 6) {\n data.push('C', points[i], points[i + 1], points[i + 2], points[i + 3], points[i + 4], points[i + 5]);\n }\n }\n return data.join(' ');\n}\n//# sourceMappingURL=util.js.map","import { clamp, squaredLength } from '../util';\nimport { Line } from '../line';\nimport { Point } from '../point';\nimport { Curve } from '../curve';\nimport { Polyline } from '../polyline';\nimport { Rectangle } from '../rectangle';\nimport { Geometry } from '../geometry';\nimport { Close } from './close';\nimport { LineTo } from './lineto';\nimport { MoveTo } from './moveto';\nimport { CurveTo } from './curveto';\nimport { normalizePathData } from './normalize';\nimport * as Util from './util';\nexport class Path extends Geometry {\n constructor(args) {\n super();\n this.PRECISION = 3;\n this.segments = [];\n if (Array.isArray(args)) {\n if (Line.isLine(args[0]) || Curve.isCurve(args[0])) {\n let previousObj = null;\n const arr = args;\n arr.forEach((o, i) => {\n if (i === 0) {\n this.appendSegment(Path.createSegment('M', o.start));\n }\n if (previousObj != null && !previousObj.end.equals(o.start)) {\n this.appendSegment(Path.createSegment('M', o.start));\n }\n if (Line.isLine(o)) {\n this.appendSegment(Path.createSegment('L', o.end));\n }\n else if (Curve.isCurve(o)) {\n this.appendSegment(Path.createSegment('C', o.controlPoint1, o.controlPoint2, o.end));\n }\n previousObj = o;\n });\n }\n else {\n const arr = args;\n arr.forEach((s) => {\n if (s.isSegment) {\n this.appendSegment(s);\n }\n });\n }\n }\n else if (args != null) {\n if (Line.isLine(args)) {\n this.appendSegment(Path.createSegment('M', args.start));\n this.appendSegment(Path.createSegment('L', args.end));\n }\n else if (Curve.isCurve(args)) {\n this.appendSegment(Path.createSegment('M', args.start));\n this.appendSegment(Path.createSegment('C', args.controlPoint1, args.controlPoint2, args.end));\n }\n else if (Polyline.isPolyline(args)) {\n if (args.points && args.points.length) {\n args.points.forEach((point, index) => {\n const segment = index === 0\n ? Path.createSegment('M', point)\n : Path.createSegment('L', point);\n this.appendSegment(segment);\n });\n }\n }\n else if (args.isSegment) {\n this.appendSegment(args);\n }\n }\n }\n get [Symbol.toStringTag]() {\n return Path.toStringTag;\n }\n get start() {\n const segments = this.segments;\n const count = segments.length;\n if (count === 0) {\n return null;\n }\n for (let i = 0; i < count; i += 1) {\n const segment = segments[i];\n if (segment.isVisible) {\n return segment.start;\n }\n }\n // if no visible segment, return last segment end point\n return segments[count - 1].end;\n }\n get end() {\n const segments = this.segments;\n const count = segments.length;\n if (count === 0) {\n return null;\n }\n for (let i = count - 1; i >= 0; i -= 1) {\n const segment = segments[i];\n if (segment.isVisible) {\n return segment.end;\n }\n }\n // if no visible segment, return last segment end point\n return segments[count - 1].end;\n }\n moveTo(...args) {\n return this.appendSegment(MoveTo.create.call(null, ...args));\n }\n lineTo(...args) {\n return this.appendSegment(LineTo.create.call(null, ...args));\n }\n curveTo(...args) {\n return this.appendSegment(CurveTo.create.call(null, ...args));\n }\n arcTo(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, endX, endY) {\n const start = this.end || new Point();\n const points = typeof endX === 'number'\n ? Util.arcToCurves(start.x, start.y, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, endX, endY)\n : Util.arcToCurves(start.x, start.y, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, endX.x, endX.y);\n if (points != null) {\n for (let i = 0, ii = points.length; i < ii; i += 6) {\n this.curveTo(points[i], points[i + 1], points[i + 2], points[i + 3], points[i + 4], points[i + 5]);\n }\n }\n return this;\n }\n quadTo(x1, y1, x, y) {\n const start = this.end || new Point();\n const data = ['M', start.x, start.y];\n if (typeof x1 === 'number') {\n data.push('Q', x1, y1, x, y);\n }\n else {\n const p = y1;\n data.push(`Q`, x1.x, x1.y, p.x, p.y);\n }\n const path = Path.parse(data.join(' '));\n this.appendSegment(path.segments.slice(1));\n return this;\n }\n close() {\n return this.appendSegment(Close.create());\n }\n drawPoints(points, options = {}) {\n const raw = Util.drawPoints(points, options);\n const sub = Path.parse(raw);\n if (sub && sub.segments) {\n this.appendSegment(sub.segments);\n }\n }\n bbox() {\n const segments = this.segments;\n const count = segments.length;\n if (count === 0) {\n return null;\n }\n let bbox;\n for (let i = 0; i < count; i += 1) {\n const segment = segments[i];\n if (segment.isVisible) {\n const segmentBBox = segment.bbox();\n if (segmentBBox != null) {\n bbox = bbox ? bbox.union(segmentBBox) : segmentBBox;\n }\n }\n }\n if (bbox != null) {\n return bbox;\n }\n // if the path has only invisible elements, return end point of last segment\n const lastSegment = segments[count - 1];\n return new Rectangle(lastSegment.end.x, lastSegment.end.y, 0, 0);\n }\n appendSegment(seg) {\n const count = this.segments.length;\n let previousSegment = count !== 0 ? this.segments[count - 1] : null;\n let currentSegment;\n const nextSegment = null;\n if (Array.isArray(seg)) {\n for (let i = 0, ii = seg.length; i < ii; i += 1) {\n const segment = seg[i];\n currentSegment = this.prepareSegment(segment, previousSegment, nextSegment);\n this.segments.push(currentSegment);\n previousSegment = currentSegment;\n }\n }\n else if (seg != null && seg.isSegment) {\n currentSegment = this.prepareSegment(seg, previousSegment, nextSegment);\n this.segments.push(currentSegment);\n }\n return this;\n }\n insertSegment(index, seg) {\n const count = this.segments.length;\n if (index < 0) {\n index = count + index + 1; // eslint-disable-line\n }\n if (index > count || index < 0) {\n throw new Error('Index out of range.');\n }\n let currentSegment;\n let previousSegment = null;\n let nextSegment = null;\n if (count !== 0) {\n if (index >= 1) {\n previousSegment = this.segments[index - 1];\n nextSegment = previousSegment.nextSegment;\n }\n else {\n previousSegment = null;\n nextSegment = this.segments[0];\n }\n }\n if (!Array.isArray(seg)) {\n currentSegment = this.prepareSegment(seg, previousSegment, nextSegment);\n this.segments.splice(index, 0, currentSegment);\n }\n else {\n for (let i = 0, ii = seg.length; i < ii; i += 1) {\n const segment = seg[i];\n currentSegment = this.prepareSegment(segment, previousSegment, nextSegment);\n this.segments.splice(index + i, 0, currentSegment);\n previousSegment = currentSegment;\n }\n }\n return this;\n }\n removeSegment(index) {\n const idx = this.fixIndex(index);\n const removedSegment = this.segments.splice(idx, 1)[0];\n const previousSegment = removedSegment.previousSegment;\n const nextSegment = removedSegment.nextSegment;\n // link the previous and next segments together (if present)\n if (previousSegment) {\n previousSegment.nextSegment = nextSegment;\n }\n if (nextSegment) {\n nextSegment.previousSegment = previousSegment;\n }\n if (removedSegment.isSubpathStart && nextSegment) {\n this.updateSubpathStartSegment(nextSegment);\n }\n return removedSegment;\n }\n replaceSegment(index, seg) {\n const idx = this.fixIndex(index);\n let currentSegment;\n const replacedSegment = this.segments[idx];\n let previousSegment = replacedSegment.previousSegment;\n const nextSegment = replacedSegment.nextSegment;\n let updateSubpathStart = replacedSegment.isSubpathStart;\n if (!Array.isArray(seg)) {\n currentSegment = this.prepareSegment(seg, previousSegment, nextSegment);\n this.segments.splice(idx, 1, currentSegment);\n if (updateSubpathStart && currentSegment.isSubpathStart) {\n // already updated by `prepareSegment`\n updateSubpathStart = false;\n }\n }\n else {\n this.segments.splice(index, 1);\n for (let i = 0, ii = seg.length; i < ii; i += 1) {\n const segment = seg[i];\n currentSegment = this.prepareSegment(segment, previousSegment, nextSegment);\n this.segments.splice(index + i, 0, currentSegment);\n previousSegment = currentSegment;\n if (updateSubpathStart && currentSegment.isSubpathStart) {\n updateSubpathStart = false;\n }\n }\n }\n if (updateSubpathStart && nextSegment) {\n this.updateSubpathStartSegment(nextSegment);\n }\n }\n getSegment(index) {\n const idx = this.fixIndex(index);\n return this.segments[idx];\n }\n fixIndex(index) {\n const length = this.segments.length;\n if (length === 0) {\n throw new Error('Path has no segments.');\n }\n let i = index;\n while (i < 0) {\n i = length + i;\n }\n if (i >= length || i < 0) {\n throw new Error('Index out of range.');\n }\n return i;\n }\n segmentAt(ratio, options = {}) {\n const index = this.segmentIndexAt(ratio, options);\n if (!index) {\n return null;\n }\n return this.getSegment(index);\n }\n segmentAtLength(length, options = {}) {\n const index = this.segmentIndexAtLength(length, options);\n if (!index)\n return null;\n return this.getSegment(index);\n }\n segmentIndexAt(ratio, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n const rate = clamp(ratio, 0, 1);\n const opt = this.getOptions(options);\n const len = this.length(opt);\n const length = len * rate;\n return this.segmentIndexAtLength(length, opt);\n }\n segmentIndexAtLength(length, options = {}) {\n const count = this.segments.length;\n if (count === 0) {\n return null;\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let memo = 0;\n let lastVisibleIndex = null;\n for (let i = 0; i < count; i += 1) {\n const index = fromStart ? i : count - 1 - i;\n const segment = this.segments[index];\n const subdivisions = segmentSubdivisions[index];\n const len = segment.length({ precision, subdivisions });\n if (segment.isVisible) {\n if (length <= memo + len) {\n return index;\n }\n lastVisibleIndex = index;\n }\n memo += len;\n }\n // If length requested is higher than the length of the path, return\n // last visible segment index. If no visible segment, return null.\n return lastVisibleIndex;\n }\n getSegmentSubdivisions(options = {}) {\n const precision = this.getPrecision(options);\n const segmentSubdivisions = [];\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const segment = this.segments[i];\n const subdivisions = segment.getSubdivisions({ precision });\n segmentSubdivisions.push(subdivisions);\n }\n return segmentSubdivisions;\n }\n updateSubpathStartSegment(segment) {\n let previous = segment.previousSegment;\n let current = segment;\n while (current && !current.isSubpathStart) {\n // assign previous segment's subpath start segment to this segment\n if (previous != null) {\n current.subpathStartSegment = previous.subpathStartSegment;\n }\n else {\n current.subpathStartSegment = null;\n }\n previous = current;\n current = current.nextSegment;\n }\n }\n prepareSegment(segment, previousSegment, nextSegment) {\n segment.previousSegment = previousSegment;\n segment.nextSegment = nextSegment;\n if (previousSegment != null) {\n previousSegment.nextSegment = segment;\n }\n if (nextSegment != null) {\n nextSegment.previousSegment = segment;\n }\n let updateSubpathStart = segment;\n if (segment.isSubpathStart) {\n // move to\n segment.subpathStartSegment = segment;\n updateSubpathStart = nextSegment;\n }\n // assign previous segment's subpath start (or self if it is a subpath start) to subsequent segments\n if (updateSubpathStart != null) {\n this.updateSubpathStartSegment(updateSubpathStart);\n }\n return segment;\n }\n closestPoint(p, options = {}) {\n const t = this.closestPointT(p, options);\n if (!t) {\n return null;\n }\n return this.pointAtT(t);\n }\n closestPointLength(p, options = {}) {\n const opts = this.getOptions(options);\n const t = this.closestPointT(p, opts);\n if (!t) {\n return 0;\n }\n return this.lengthAtT(t, opts);\n }\n closestPointNormalizedLength(p, options = {}) {\n const opts = this.getOptions(options);\n const cpLength = this.closestPointLength(p, opts);\n if (cpLength === 0) {\n return 0;\n }\n const length = this.length(opts);\n if (length === 0) {\n return 0;\n }\n return cpLength / length;\n }\n closestPointT(p, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let closestPointT;\n let minSquaredDistance = Infinity;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const segment = this.segments[i];\n const subdivisions = segmentSubdivisions[i];\n if (segment.isVisible) {\n const segmentClosestPointT = segment.closestPointT(p, {\n precision,\n subdivisions,\n });\n const segmentClosestPoint = segment.pointAtT(segmentClosestPointT);\n const squaredDistance = squaredLength(segmentClosestPoint, p);\n if (squaredDistance < minSquaredDistance) {\n closestPointT = { segmentIndex: i, value: segmentClosestPointT };\n minSquaredDistance = squaredDistance;\n }\n }\n }\n if (closestPointT) {\n return closestPointT;\n }\n return { segmentIndex: this.segments.length - 1, value: 1 };\n }\n closestPointTangent(p, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let closestPointTangent;\n let minSquaredDistance = Infinity;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const segment = this.segments[i];\n const subdivisions = segmentSubdivisions[i];\n if (segment.isDifferentiable()) {\n const segmentClosestPointT = segment.closestPointT(p, {\n precision,\n subdivisions,\n });\n const segmentClosestPoint = segment.pointAtT(segmentClosestPointT);\n const squaredDistance = squaredLength(segmentClosestPoint, p);\n if (squaredDistance < minSquaredDistance) {\n closestPointTangent = segment.tangentAtT(segmentClosestPointT);\n minSquaredDistance = squaredDistance;\n }\n }\n }\n if (closestPointTangent) {\n return closestPointTangent;\n }\n return null;\n }\n containsPoint(p, options = {}) {\n const polylines = this.toPolylines(options);\n if (!polylines) {\n return false;\n }\n let numIntersections = 0;\n for (let i = 0, ii = polylines.length; i < ii; i += 1) {\n const polyline = polylines[i];\n if (polyline.containsPoint(p)) {\n numIntersections += 1;\n }\n }\n // returns `true` for odd numbers of intersections (even-odd algorithm)\n return numIntersections % 2 === 1;\n }\n pointAt(ratio, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n if (ratio <= 0) {\n return this.start.clone();\n }\n if (ratio >= 1) {\n return this.end.clone();\n }\n const opts = this.getOptions(options);\n const pathLength = this.length(opts);\n const length = pathLength * ratio;\n return this.pointAtLength(length, opts);\n }\n pointAtLength(length, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n if (length === 0) {\n return this.start.clone();\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let lastVisibleSegment;\n let memo = 0;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const index = fromStart ? i : ii - 1 - i;\n const segment = this.segments[index];\n const subdivisions = segmentSubdivisions[index];\n const d = segment.length({\n precision,\n subdivisions,\n });\n if (segment.isVisible) {\n if (length <= memo + d) {\n return segment.pointAtLength((fromStart ? 1 : -1) * (length - memo), {\n precision,\n subdivisions,\n });\n }\n lastVisibleSegment = segment;\n }\n memo += d;\n }\n // if length requested is higher than the length of the path,\n // return last visible segment endpoint\n if (lastVisibleSegment) {\n return fromStart ? lastVisibleSegment.end : lastVisibleSegment.start;\n }\n // if no visible segment, return last segment end point\n const lastSegment = this.segments[this.segments.length - 1];\n return lastSegment.end.clone();\n }\n pointAtT(t) {\n const segments = this.segments;\n const numSegments = segments.length;\n if (numSegments === 0)\n return null; // if segments is an empty array\n const segmentIndex = t.segmentIndex;\n if (segmentIndex < 0)\n return segments[0].pointAtT(0);\n if (segmentIndex >= numSegments) {\n return segments[numSegments - 1].pointAtT(1);\n }\n const tValue = clamp(t.value, 0, 1);\n return segments[segmentIndex].pointAtT(tValue);\n }\n divideAt(ratio, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n const rate = clamp(ratio, 0, 1);\n const opts = this.getOptions(options);\n const len = this.length(opts);\n const length = len * rate;\n return this.divideAtLength(length, opts);\n }\n divideAtLength(length, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let memo = 0;\n let divided;\n let dividedSegmentIndex;\n let lastValidSegment;\n let lastValidSegmentIndex;\n let t;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const index = fromStart ? i : ii - 1 - i;\n const segment = this.getSegment(index);\n const subdivisions = segmentSubdivisions[index];\n const opts = { precision, subdivisions };\n const len = segment.length(opts);\n if (segment.isDifferentiable()) {\n lastValidSegment = segment;\n lastValidSegmentIndex = index;\n if (length <= memo + len) {\n dividedSegmentIndex = index;\n divided = segment.divideAtLength((fromStart ? 1 : -1) * (length - memo), opts);\n break;\n }\n }\n memo += len;\n }\n if (!lastValidSegment) {\n return null;\n }\n if (!divided) {\n dividedSegmentIndex = lastValidSegmentIndex;\n t = fromStart ? 1 : 0;\n divided = lastValidSegment.divideAtT(t);\n }\n // create a copy of this path and replace the identified segment with its two divided parts:\n const pathCopy = this.clone();\n const index = dividedSegmentIndex;\n pathCopy.replaceSegment(index, divided);\n const divisionStartIndex = index;\n let divisionMidIndex = index + 1;\n let divisionEndIndex = index + 2;\n // do not insert the part if it looks like a point\n if (!divided[0].isDifferentiable()) {\n pathCopy.removeSegment(divisionStartIndex);\n divisionMidIndex -= 1;\n divisionEndIndex -= 1;\n }\n // insert a Moveto segment to ensure secondPath will be valid:\n const movetoEnd = pathCopy.getSegment(divisionMidIndex).start;\n pathCopy.insertSegment(divisionMidIndex, Path.createSegment('M', movetoEnd));\n divisionEndIndex += 1;\n // do not insert the part if it looks like a point\n if (!divided[1].isDifferentiable()) {\n pathCopy.removeSegment(divisionEndIndex - 1);\n divisionEndIndex -= 1;\n }\n // ensure that Closepath segments in secondPath will be assigned correct subpathStartSegment:\n const secondPathSegmentIndexConversion = divisionEndIndex - divisionStartIndex - 1;\n for (let i = divisionEndIndex, ii = pathCopy.segments.length; i < ii; i += 1) {\n const originalSegment = this.getSegment(i - secondPathSegmentIndexConversion);\n const segment = pathCopy.getSegment(i);\n if (segment.type === 'Z' &&\n !originalSegment.subpathStartSegment.end.equals(segment.subpathStartSegment.end)) {\n // pathCopy segment's subpathStartSegment is different from original segment's one\n // convert this Closepath segment to a Lineto and replace it in pathCopy\n const convertedSegment = Path.createSegment('L', originalSegment.end);\n pathCopy.replaceSegment(i, convertedSegment);\n }\n }\n // distribute pathCopy segments into two paths and return those:\n const firstPath = new Path(pathCopy.segments.slice(0, divisionMidIndex));\n const secondPath = new Path(pathCopy.segments.slice(divisionMidIndex));\n return [firstPath, secondPath];\n }\n intersectsWithLine(line, options = {}) {\n const polylines = this.toPolylines(options);\n if (polylines == null) {\n return null;\n }\n let intersections = null;\n for (let i = 0, ii = polylines.length; i < ii; i += 1) {\n const polyline = polylines[i];\n const intersection = line.intersect(polyline);\n if (intersection) {\n if (intersections == null) {\n intersections = [];\n }\n if (Array.isArray(intersection)) {\n intersections.push(...intersection);\n }\n else {\n intersections.push(intersection);\n }\n }\n }\n return intersections;\n }\n isDifferentiable() {\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const segment = this.segments[i];\n if (segment.isDifferentiable()) {\n return true;\n }\n }\n return false;\n }\n isValid() {\n const segments = this.segments;\n const isValid = segments.length === 0 || segments[0].type === 'M';\n return isValid;\n }\n length(options = {}) {\n if (this.segments.length === 0) {\n return 0;\n }\n const segmentSubdivisions = this.getSubdivisions(options);\n let length = 0;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const segment = this.segments[i];\n const subdivisions = segmentSubdivisions[i];\n length += segment.length({ subdivisions });\n }\n return length;\n }\n lengthAtT(t, options = {}) {\n const count = this.segments.length;\n if (count === 0) {\n return 0;\n }\n let segmentIndex = t.segmentIndex;\n if (segmentIndex < 0) {\n return 0;\n }\n let tValue = clamp(t.value, 0, 1);\n if (segmentIndex >= count) {\n segmentIndex = count - 1;\n tValue = 1;\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let length = 0;\n for (let i = 0; i < segmentIndex; i += 1) {\n const segment = this.segments[i];\n const subdivisions = segmentSubdivisions[i];\n length += segment.length({ precision, subdivisions });\n }\n const segment = this.segments[segmentIndex];\n const subdivisions = segmentSubdivisions[segmentIndex];\n length += segment.lengthAtT(tValue, { precision, subdivisions });\n return length;\n }\n tangentAt(ratio, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n const rate = clamp(ratio, 0, 1);\n const opts = this.getOptions(options);\n const len = this.length(opts);\n const length = len * rate;\n return this.tangentAtLength(length, opts);\n }\n tangentAtLength(length, options = {}) {\n if (this.segments.length === 0) {\n return null;\n }\n let fromStart = true;\n if (length < 0) {\n fromStart = false;\n length = -length; // eslint-disable-line\n }\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n let lastValidSegment;\n let memo = 0;\n for (let i = 0, ii = this.segments.length; i < ii; i += 1) {\n const index = fromStart ? i : ii - 1 - i;\n const segment = this.segments[index];\n const subdivisions = segmentSubdivisions[index];\n const len = segment.length({ precision, subdivisions });\n if (segment.isDifferentiable()) {\n if (length <= memo + len) {\n return segment.tangentAtLength((fromStart ? 1 : -1) * (length - memo), {\n precision,\n subdivisions,\n });\n }\n lastValidSegment = segment;\n }\n memo += len;\n }\n // if length requested is higher than the length of the path, return tangent of endpoint of last valid segment\n if (lastValidSegment) {\n const t = fromStart ? 1 : 0;\n return lastValidSegment.tangentAtT(t);\n }\n // if no valid segment, return null\n return null;\n }\n tangentAtT(t) {\n const count = this.segments.length;\n if (count === 0) {\n return null;\n }\n const segmentIndex = t.segmentIndex;\n if (segmentIndex < 0) {\n return this.segments[0].tangentAtT(0);\n }\n if (segmentIndex >= count) {\n return this.segments[count - 1].tangentAtT(1);\n }\n const tValue = clamp(t.value, 0, 1);\n return this.segments[segmentIndex].tangentAtT(tValue);\n }\n getPrecision(options = {}) {\n return options.precision == null ? this.PRECISION : options.precision;\n }\n getSubdivisions(options = {}) {\n if (options.segmentSubdivisions == null) {\n const precision = this.getPrecision(options);\n return this.getSegmentSubdivisions({ precision });\n }\n return options.segmentSubdivisions;\n }\n getOptions(options = {}) {\n const precision = this.getPrecision(options);\n const segmentSubdivisions = this.getSubdivisions(options);\n return { precision, segmentSubdivisions };\n }\n toPoints(options = {}) {\n const segments = this.segments;\n const count = segments.length;\n if (count === 0) {\n return null;\n }\n const segmentSubdivisions = this.getSubdivisions(options);\n const points = [];\n let partialPoints = [];\n for (let i = 0; i < count; i += 1) {\n const segment = segments[i];\n if (segment.isVisible) {\n const divisions = segmentSubdivisions[i];\n if (divisions.length > 0) {\n // eslint-disable-next-line no-loop-func\n divisions.forEach((c) => partialPoints.push(c.start));\n }\n else {\n partialPoints.push(segment.start);\n }\n }\n else if (partialPoints.length > 0) {\n partialPoints.push(segments[i - 1].end);\n points.push(partialPoints);\n partialPoints = [];\n }\n }\n if (partialPoints.length > 0) {\n partialPoints.push(this.end);\n points.push(partialPoints);\n }\n return points;\n }\n toPolylines(options = {}) {\n const points = this.toPoints(options);\n if (!points) {\n return null;\n }\n return points.map((arr) => new Polyline(arr));\n }\n scale(sx, sy, origin) {\n this.segments.forEach((s) => s.scale(sx, sy, origin));\n return this;\n }\n rotate(angle, origin) {\n this.segments.forEach((segment) => segment.rotate(angle, origin));\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'number') {\n this.segments.forEach((s) => s.translate(tx, ty));\n }\n else {\n this.segments.forEach((s) => s.translate(tx));\n }\n return this;\n }\n clone() {\n const path = new Path();\n this.segments.forEach((s) => path.appendSegment(s.clone()));\n return path;\n }\n equals(p) {\n if (p == null) {\n return false;\n }\n const segments = this.segments;\n const otherSegments = p.segments;\n const count = segments.length;\n if (otherSegments.length !== count) {\n return false;\n }\n for (let i = 0; i < count; i += 1) {\n const a = segments[i];\n const b = otherSegments[i];\n if (a.type !== b.type || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n toJSON() {\n return this.segments.map((s) => s.toJSON());\n }\n serialize() {\n if (!this.isValid()) {\n throw new Error('Invalid path segments.');\n }\n return this.segments.map((s) => s.serialize()).join(' ');\n }\n toString() {\n return this.serialize();\n }\n}\n(function (Path) {\n Path.toStringTag = `X6.Geometry.${Path.name}`;\n function isPath(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Path) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const path = instance;\n if ((tag == null || tag === Path.toStringTag) &&\n Array.isArray(path.segments) &&\n typeof path.moveTo === 'function' &&\n typeof path.lineTo === 'function' &&\n typeof path.curveTo === 'function') {\n return true;\n }\n return false;\n }\n Path.isPath = isPath;\n})(Path || (Path = {}));\n(function (Path) {\n function parse(pathData) {\n if (!pathData) {\n return new Path();\n }\n const path = new Path();\n const commandRe = /(?:[a-zA-Z] *)(?:(?:-?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)? *,? *)|(?:-?\\.\\d+ *,? *))+|(?:[a-zA-Z] *)(?! |\\d|-|\\.)/g;\n const commands = Path.normalize(pathData).match(commandRe);\n if (commands != null) {\n for (let i = 0, ii = commands.length; i < ii; i += 1) {\n const command = commands[i];\n const argRe = /(?:[a-zA-Z])|(?:(?:-?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))|(?:(?:-?\\.\\d+))/g;\n // args = [type, coordinate1, coordinate2...]\n const args = command.match(argRe);\n if (args != null) {\n const type = args[0];\n const coords = args.slice(1).map((a) => +a);\n const segment = createSegment.call(null, type, ...coords);\n path.appendSegment(segment);\n }\n }\n }\n return path;\n }\n Path.parse = parse;\n function createSegment(type, ...args) {\n if (type === 'M') {\n return MoveTo.create.call(null, ...args);\n }\n if (type === 'L') {\n return LineTo.create.call(null, ...args);\n }\n if (type === 'C') {\n return CurveTo.create.call(null, ...args);\n }\n if (type === 'z' || type === 'Z') {\n return Close.create();\n }\n throw new Error(`Invalid path segment type \"${type}\"`);\n }\n Path.createSegment = createSegment;\n})(Path || (Path = {}));\n(function (Path) {\n Path.normalize = normalizePathData;\n Path.isValid = Util.isValid;\n Path.drawArc = Util.drawArc;\n Path.drawPoints = Util.drawPoints;\n Path.arcToCurves = Util.arcToCurves;\n})(Path || (Path = {}));\n//# sourceMappingURL=path.js.map","import { Path } from '../../geometry';\nimport * as Dom from '../dom/core';\nexport class Vector {\n constructor(elem, attrs, children) {\n if (!elem) {\n throw new TypeError('Invalid element to create vector');\n }\n let node;\n if (Vector.isVector(elem)) {\n node = elem.node;\n }\n else if (typeof elem === 'string') {\n if (elem.toLowerCase() === 'svg') {\n node = Dom.createSvgDocument();\n }\n else if (elem[0] === '<') {\n const doc = Dom.createSvgDocument(elem);\n // only import the first child\n node = document.importNode(doc.firstChild, true);\n }\n else {\n node = document.createElementNS(Dom.ns.svg, elem);\n }\n }\n else {\n node = elem;\n }\n this.node = node;\n if (attrs) {\n this.setAttributes(attrs);\n }\n if (children) {\n this.append(children);\n }\n }\n get [Symbol.toStringTag]() {\n return Vector.toStringTag;\n }\n get type() {\n return this.node.nodeName;\n }\n get id() {\n return this.node.id;\n }\n set id(id) {\n this.node.id = id;\n }\n transform(matrix, options) {\n if (matrix == null) {\n return Dom.transform(this.node);\n }\n Dom.transform(this.node, matrix, options);\n return this;\n }\n translate(tx, ty = 0, options = {}) {\n if (tx == null) {\n return Dom.translate(this.node);\n }\n Dom.translate(this.node, tx, ty, options);\n return this;\n }\n rotate(angle, cx, cy, options = {}) {\n if (angle == null) {\n return Dom.rotate(this.node);\n }\n Dom.rotate(this.node, angle, cx, cy, options);\n return this;\n }\n scale(sx, sy) {\n if (sx == null) {\n return Dom.scale(this.node);\n }\n Dom.scale(this.node, sx, sy);\n return this;\n }\n /**\n * Returns an SVGMatrix that specifies the transformation necessary\n * to convert this coordinate system into `target` coordinate system.\n */\n getTransformToElement(target) {\n const ref = Vector.toNode(target);\n return Dom.getTransformToElement(this.node, ref);\n }\n removeAttribute(name) {\n Dom.removeAttribute(this.node, name);\n return this;\n }\n getAttribute(name) {\n return Dom.getAttribute(this.node, name);\n }\n setAttribute(name, value) {\n Dom.setAttribute(this.node, name, value);\n return this;\n }\n setAttributes(attrs) {\n Dom.setAttributes(this.node, attrs);\n return this;\n }\n attr(name, value) {\n if (name == null) {\n return Dom.attr(this.node);\n }\n if (typeof name === 'string' && value === undefined) {\n return Dom.attr(this.node, name);\n }\n if (typeof name === 'object') {\n Dom.attr(this.node, name);\n }\n else {\n Dom.attr(this.node, name, value);\n }\n return this;\n }\n svg() {\n return this.node instanceof SVGSVGElement\n ? this\n : Vector.create(this.node.ownerSVGElement);\n }\n defs() {\n const context = this.svg() || this;\n const defsNode = context.node.getElementsByTagName('defs')[0];\n if (defsNode) {\n return Vector.create(defsNode);\n }\n return Vector.create('defs').appendTo(context);\n }\n text(content, options = {}) {\n Dom.text(this.node, content, options);\n return this;\n }\n tagName() {\n return Dom.tagName(this.node);\n }\n clone() {\n return Vector.create(this.node.cloneNode(true));\n }\n remove() {\n Dom.remove(this.node);\n return this;\n }\n empty() {\n Dom.empty(this.node);\n return this;\n }\n append(elems) {\n Dom.append(this.node, Vector.toNodes(elems));\n return this;\n }\n appendTo(target) {\n Dom.appendTo(this.node, Vector.isVector(target) ? target.node : target);\n return this;\n }\n prepend(elems) {\n Dom.prepend(this.node, Vector.toNodes(elems));\n return this;\n }\n before(elems) {\n Dom.before(this.node, Vector.toNodes(elems));\n return this;\n }\n replace(elem) {\n if (this.node.parentNode) {\n this.node.parentNode.replaceChild(Vector.toNode(elem), this.node);\n }\n return Vector.create(elem);\n }\n first() {\n return this.node.firstChild\n ? Vector.create(this.node.firstChild)\n : null;\n }\n last() {\n return this.node.lastChild\n ? Vector.create(this.node.lastChild)\n : null;\n }\n get(index) {\n const child = this.node.childNodes[index];\n return child ? Vector.create(child) : null;\n }\n indexOf(elem) {\n const children = Array.prototype.slice.call(this.node.childNodes);\n return children.indexOf(Vector.toNode(elem));\n }\n find(selector) {\n const vels = [];\n const nodes = Dom.find(this.node, selector);\n if (nodes) {\n for (let i = 0, ii = nodes.length; i < ii; i += 1) {\n vels.push(Vector.create(nodes[i]));\n }\n }\n return vels;\n }\n findOne(selector) {\n const found = Dom.findOne(this.node, selector);\n return found ? Vector.create(found) : null;\n }\n findParentByClass(className, terminator) {\n const node = Dom.findParentByClass(this.node, className, terminator);\n return node ? Vector.create(node) : null;\n }\n matches(selector) {\n const node = this.node;\n const matches = this.node.matches;\n const matcher = node.matches ||\n node.matchesSelector ||\n node.msMatchesSelector ||\n node.mozMatchesSelector ||\n node.webkitMatchesSelector ||\n node.oMatchesSelector ||\n null;\n return matcher && matcher.call(node, selector);\n }\n contains(child) {\n return Dom.contains(this.node, Vector.isVector(child) ? child.node : child);\n }\n wrap(node) {\n const vel = Vector.create(node);\n const parentNode = this.node.parentNode;\n if (parentNode != null) {\n parentNode.insertBefore(vel.node, this.node);\n }\n return vel.append(this);\n }\n parent(type) {\n let parent = this; // eslint-disable-line @typescript-eslint/no-this-alias\n // check for parent\n if (parent.node.parentNode == null) {\n return null;\n }\n // get parent element\n parent = Vector.create(parent.node.parentNode);\n if (type == null) {\n return parent;\n }\n // loop trough ancestors if type is given\n do {\n if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) {\n return parent;\n }\n } while ((parent = Vector.create(parent.node.parentNode)));\n return parent;\n }\n children() {\n const children = this.node.childNodes;\n const vels = [];\n for (let i = 0; i < children.length; i += 1) {\n const currentChild = children[i];\n if (currentChild.nodeType === 1) {\n vels.push(Vector.create(children[i]));\n }\n }\n return vels;\n }\n eachChild(fn, deep) {\n const children = this.children();\n for (let i = 0, l = children.length; i < l; i += 1) {\n fn.call(children[i], children[i], i, children);\n if (deep) {\n children[i].eachChild(fn, deep);\n }\n }\n return this;\n }\n index() {\n return Dom.index(this.node);\n }\n hasClass(className) {\n return Dom.hasClass(this.node, className);\n }\n addClass(className) {\n Dom.addClass(this.node, className);\n return this;\n }\n removeClass(className) {\n Dom.removeClass(this.node, className);\n return this;\n }\n toggleClass(className, stateVal) {\n Dom.toggleClass(this.node, className, stateVal);\n return this;\n }\n toLocalPoint(x, y) {\n return Dom.toLocalPoint(this.node, x, y);\n }\n toGeometryShape() {\n return Dom.toGeometryShape(this.node);\n }\n translateCenterToPoint(p) {\n const bbox = this.getBBox({ target: this.svg() });\n const center = bbox.getCenter();\n this.translate(p.x - center.x, p.y - center.y);\n return this;\n }\n translateAndAutoOrient(position, reference, target) {\n Dom.translateAndAutoOrient(this.node, position, reference, target);\n return this;\n }\n animate(options) {\n return Dom.animate(this.node, options);\n }\n animateTransform(options) {\n return Dom.animateTransform(this.node, options);\n }\n animateAlongPath(options, path) {\n return Dom.animateAlongPath(this.node, options, path);\n }\n /**\n * Normalize this element's d attribute. SVGPathElements without\n * a path data attribute obtain a value of 'M 0 0'.\n */\n normalizePath() {\n const tagName = this.tagName();\n if (tagName === 'path') {\n this.attr('d', Path.normalize(this.attr('d')));\n }\n return this;\n }\n /**\n * Returns the bounding box of the element after transformations are applied.\n * If `withoutTransformations` is `true`, transformations of the element\n * will not be considered when computing the bounding box. If `target` is\n * specified, bounding box will be computed relatively to the target element.\n */\n bbox(withoutTransformations, target) {\n return Dom.bbox(this.node, withoutTransformations, target);\n }\n getBBox(options = {}) {\n return Dom.getBBox(this.node, {\n recursive: options.recursive,\n target: options.target ? Vector.toNode(options.target) : null,\n });\n }\n /**\n * Samples the underlying SVG element (it currently works only on\n * paths - where it is most useful anyway). Returns an array of objects\n * of the form `{ x: Number, y: Number, distance: Number }`. Each of these\n * objects represent a point on the path. This basically creates a discrete\n * representation of the path (which is possible a curve). The sampling\n * interval defines the accuracy of the sampling. In other words, we travel\n * from the beginning of the path to the end by interval distance (on the\n * path, not between the resulting points) and collect the discrete points\n * on the path. This is very useful in many situations. For example, SVG\n * does not provide a built-in mechanism to find intersections between two\n * paths. Using sampling, we can just generate bunch of points for each of\n * the path and find the closest ones from each set.\n */\n sample(interval = 1) {\n if (this.node instanceof SVGPathElement) {\n return Dom.sample(this.node, interval);\n }\n return [];\n }\n toPath() {\n return Vector.create(Dom.toPath(this.node));\n }\n toPathData() {\n return Dom.toPathData(this.node);\n }\n}\n(function (Vector) {\n Vector.toStringTag = `X6.${Vector.name}`;\n function isVector(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Vector) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const vector = instance;\n if ((tag == null || tag === Vector.toStringTag) &&\n vector.node instanceof SVGElement &&\n typeof vector.animate === 'function' &&\n typeof vector.sample === 'function' &&\n typeof vector.normalizePath === 'function' &&\n typeof vector.toPath === 'function') {\n return true;\n }\n return false;\n }\n Vector.isVector = isVector;\n function create(elem, attrs, children) {\n return new Vector(elem, attrs, children);\n }\n Vector.create = create;\n function createVectors(markup) {\n if (markup[0] === '<') {\n const svgDoc = Dom.createSvgDocument(markup);\n const vels = [];\n for (let i = 0, ii = svgDoc.childNodes.length; i < ii; i += 1) {\n const childNode = svgDoc.childNodes[i];\n vels.push(create(document.importNode(childNode, true)));\n }\n return vels;\n }\n return [create(markup)];\n }\n Vector.createVectors = createVectors;\n function toNode(elem) {\n if (isVector(elem)) {\n return elem.node;\n }\n return elem;\n }\n Vector.toNode = toNode;\n function toNodes(elems) {\n if (Array.isArray(elems)) {\n return elems.map((elem) => toNode(elem));\n }\n return [toNode(elems)];\n }\n Vector.toNodes = toNodes;\n})(Vector || (Vector = {}));\n//# sourceMappingURL=index.js.map","/* eslint-disable no-control-regex */\nimport { NumberExt } from '../number';\nimport { Text } from '../text';\nimport { attr } from './attr';\nimport { Vector } from '../vector';\nimport { createSvgElement, empty, remove } from './elem';\nimport { Platform } from '../platform';\nfunction createTextPathNode(attrs, elem) {\n const vel = Vector.create(elem);\n const textPath = Vector.create('textPath');\n const d = attrs.d;\n if (d && attrs['xlink:href'] === undefined) {\n const path = Vector.create('path').attr('d', d).appendTo(vel.defs());\n textPath.attr('xlink:href', `#${path.id}`);\n }\n if (typeof attrs === 'object') {\n textPath.attr(attrs);\n }\n return textPath.node;\n}\nfunction annotateTextLine(lineNode, lineAnnotations, options) {\n const eol = options.eol;\n const baseSize = options.baseSize;\n const lineHeight = options.lineHeight;\n let maxFontSize = 0;\n let tspanNode;\n const fontMetrics = {};\n const lastJ = lineAnnotations.length - 1;\n for (let j = 0; j <= lastJ; j += 1) {\n let annotation = lineAnnotations[j];\n let fontSize = null;\n if (typeof annotation === 'object') {\n const annotationAttrs = annotation.attrs;\n const vTSpan = Vector.create('tspan', annotationAttrs);\n tspanNode = vTSpan.node;\n let t = annotation.t;\n if (eol && j === lastJ) {\n t += eol;\n }\n tspanNode.textContent = t;\n // Per annotation className\n const annotationClass = annotationAttrs.class;\n if (annotationClass) {\n vTSpan.addClass(annotationClass);\n }\n // set the list of indices of all the applied annotations\n // in the `annotations` attribute. This list is a comma\n // separated list of indices.\n if (options.includeAnnotationIndices) {\n vTSpan.attr('annotations', annotation.annotations.join(','));\n }\n // Check for max font size\n fontSize = parseFloat(annotationAttrs['font-size']);\n if (fontSize === undefined)\n fontSize = baseSize;\n if (fontSize && fontSize > maxFontSize)\n maxFontSize = fontSize;\n }\n else {\n if (eol && j === lastJ) {\n annotation += eol;\n }\n tspanNode = document.createTextNode(annotation || ' ');\n if (baseSize && baseSize > maxFontSize) {\n maxFontSize = baseSize;\n }\n }\n lineNode.appendChild(tspanNode);\n }\n if (maxFontSize) {\n fontMetrics.maxFontSize = maxFontSize;\n }\n if (lineHeight) {\n fontMetrics.lineHeight = lineHeight;\n }\n else if (maxFontSize) {\n fontMetrics.lineHeight = maxFontSize * 1.2;\n }\n return fontMetrics;\n}\nconst emRegex = /em$/;\nfunction emToPx(em, fontSize) {\n const numerical = parseFloat(em);\n if (emRegex.test(em)) {\n return numerical * fontSize;\n }\n return numerical;\n}\nfunction calculateDY(alignment, linesMetrics, baseSizePx, lineHeight) {\n if (!Array.isArray(linesMetrics)) {\n return 0;\n }\n const n = linesMetrics.length;\n if (!n)\n return 0;\n let lineMetrics = linesMetrics[0];\n const flMaxFont = emToPx(lineMetrics.maxFontSize, baseSizePx) || baseSizePx;\n let rLineHeights = 0;\n const lineHeightPx = emToPx(lineHeight, baseSizePx);\n for (let i = 1; i < n; i += 1) {\n lineMetrics = linesMetrics[i];\n const iLineHeight = emToPx(lineMetrics.lineHeight, baseSizePx) || lineHeightPx;\n rLineHeights += iLineHeight;\n }\n const llMaxFont = emToPx(lineMetrics.maxFontSize, baseSizePx) || baseSizePx;\n let dy;\n switch (alignment) {\n case 'middle':\n dy = flMaxFont / 2 - 0.15 * llMaxFont - rLineHeights / 2;\n break;\n case 'bottom':\n dy = -(0.25 * llMaxFont) - rLineHeights;\n break;\n default:\n case 'top':\n dy = 0.8 * flMaxFont;\n break;\n }\n return dy;\n}\nexport function text(elem, content, options = {}) {\n content = Text.sanitize(content); // eslint-disable-line\n const eol = options.eol;\n let textPath = options.textPath;\n const verticalAnchor = options.textVerticalAnchor;\n const namedVerticalAnchor = verticalAnchor === 'middle' ||\n verticalAnchor === 'bottom' ||\n verticalAnchor === 'top';\n // Horizontal shift applied to all the lines but the first.\n let x = options.x;\n if (x === undefined) {\n x = elem.getAttribute('x') || 0;\n }\n // Annotations\n const iai = options.includeAnnotationIndices;\n let annotations = options.annotations;\n if (annotations && !Array.isArray(annotations)) {\n annotations = [annotations];\n }\n // Shift all the <tspan> but first by one line (`1em`)\n const defaultLineHeight = options.lineHeight;\n const autoLineHeight = defaultLineHeight === 'auto';\n const lineHeight = autoLineHeight ? '1.5em' : defaultLineHeight || '1em';\n empty(elem);\n attr(elem, {\n // Preserve spaces, do not consecutive spaces to get collapsed to one.\n 'xml:space': 'preserve',\n // An empty text gets rendered into the DOM in webkit-based browsers.\n // In order to unify this behaviour across all browsers\n // we rather hide the text element when it's empty.\n display: content || options.displayEmpty ? null : 'none',\n });\n // Set default font-size if none\n const strFontSize = attr(elem, 'font-size');\n let fontSize = parseFloat(strFontSize);\n if (!fontSize) {\n fontSize = 16;\n if ((namedVerticalAnchor || annotations) && !strFontSize) {\n attr(elem, 'font-size', `${fontSize}`);\n }\n }\n let containerNode;\n if (textPath) {\n // Now all the `<tspan>`s will be inside the `<textPath>`.\n if (typeof textPath === 'string') {\n textPath = { d: textPath };\n }\n containerNode = createTextPathNode(textPath, elem);\n }\n else {\n containerNode = document.createDocumentFragment();\n }\n let dy;\n let offset = 0;\n let annotatedY;\n const lines = content.split('\\n');\n const linesMetrics = [];\n const lastI = lines.length - 1;\n for (let i = 0; i <= lastI; i += 1) {\n dy = lineHeight;\n let lineClassName = 'v-line';\n const lineNode = createSvgElement('tspan');\n let lineMetrics;\n let line = lines[i];\n if (line) {\n if (annotations) {\n // Find the *compacted* annotations for this line.\n const lineAnnotations = Text.annotate(line, annotations, {\n offset: -offset,\n includeAnnotationIndices: iai,\n });\n lineMetrics = annotateTextLine(lineNode, lineAnnotations, {\n eol: i !== lastI && eol,\n baseSize: fontSize,\n lineHeight: autoLineHeight ? null : lineHeight,\n includeAnnotationIndices: iai,\n });\n // Get the line height based on the biggest font size\n // in the annotations for this line.\n const iLineHeight = lineMetrics.lineHeight;\n if (iLineHeight && autoLineHeight && i !== 0) {\n dy = iLineHeight;\n }\n if (i === 0) {\n annotatedY = lineMetrics.maxFontSize * 0.8;\n }\n }\n else {\n if (eol && i !== lastI) {\n line += eol;\n }\n lineNode.textContent = line;\n }\n }\n else {\n // Make sure the textContent is never empty. If it is, add a dummy\n // character and make it invisible, making the following lines correctly\n // relatively positioned. `dy=1em` won't work with empty lines otherwise.\n lineNode.textContent = '-';\n lineClassName += ' v-empty-line';\n const lineNodeStyle = lineNode.style;\n lineNodeStyle.fillOpacity = 0;\n lineNodeStyle.strokeOpacity = 0;\n if (annotations) {\n lineMetrics = {};\n }\n }\n if (lineMetrics) {\n linesMetrics.push(lineMetrics);\n }\n if (i > 0) {\n lineNode.setAttribute('dy', dy);\n }\n // Firefox requires 'x' to be set on the first line\n if (i > 0 || textPath) {\n lineNode.setAttribute('x', x);\n }\n lineNode.className.baseVal = lineClassName;\n containerNode.appendChild(lineNode);\n offset += line.length + 1; // + 1 = newline character.\n }\n // Y Alignment calculation\n if (namedVerticalAnchor) {\n if (annotations) {\n dy = calculateDY(verticalAnchor, linesMetrics, fontSize, lineHeight);\n }\n else if (verticalAnchor === 'top') {\n // A shortcut for top alignment. It does not depend on font-size nor line-height\n dy = '0.8em';\n }\n else {\n let rh; // remaining height\n if (lastI > 0) {\n rh = parseFloat(lineHeight) || 1;\n rh *= lastI;\n if (!emRegex.test(lineHeight))\n rh /= fontSize;\n }\n else {\n // Single-line text\n rh = 0;\n }\n switch (verticalAnchor) {\n case 'middle':\n dy = `${0.3 - rh / 2}em`;\n break;\n case 'bottom':\n dy = `${-rh - 0.3}em`;\n break;\n default:\n break;\n }\n }\n }\n else if (verticalAnchor === 0) {\n dy = '0em';\n }\n else if (verticalAnchor) {\n dy = verticalAnchor;\n }\n else {\n // No vertical anchor is defined\n dy = 0;\n // Backwards compatibility - we change the `y` attribute instead of `dy`.\n if (elem.getAttribute('y') == null) {\n elem.setAttribute('y', `${annotatedY || '0.8em'}`);\n }\n }\n const firstLine = containerNode.firstChild;\n firstLine.setAttribute('dy', dy);\n elem.appendChild(containerNode);\n}\nfunction splitText(text, separator, eol, hyphen) {\n const words = [];\n const separators = [];\n if (separator != null) {\n const parts = text.split(separator);\n words.push(...parts);\n if (typeof separator === 'string') {\n for (let i = 0, l = parts.length - 1; i < l; i += 1) {\n separators.push(separator);\n }\n }\n else {\n const seps = text.match(new RegExp(separator, 'g'));\n for (let i = 0, l = parts.length - 1; i < l; i += 1) {\n separators.push(seps ? seps[i] : '');\n }\n }\n }\n else {\n let word = '';\n for (let i = 0, l = text.length; i < l; i += 1) {\n const char = text[i];\n if (char === ' ') {\n words.push(word);\n separators.push(' ');\n word = '';\n }\n else if (char.match(/[^\\x00-\\xff]/)) {\n // split double byte character\n if (word.length) {\n words.push(word);\n separators.push('');\n }\n words.push(char);\n separators.push('');\n word = '';\n }\n else {\n word += char;\n }\n }\n if (word.length) {\n words.push(word);\n }\n }\n // end-of-line\n for (let i = 0; i < words.length; i += 1) {\n const word = words[i];\n if (word.indexOf(eol) >= 0 && word.length > 1) {\n const parts = word.split(eol);\n for (let j = 0, k = parts.length - 1; j < k; j += 1) {\n parts.splice(2 * j + 1, 0, eol);\n }\n const valids = parts.filter((part) => part !== '');\n words.splice(i, 1, ...valids);\n const seps = valids.map(() => '');\n seps.pop();\n separators.splice(i, 0, ...seps);\n }\n }\n // hyphen\n for (let i = 0; i < words.length; i += 1) {\n const word = words[i];\n const index = word.search(hyphen);\n if (index > 0 && index < word.length - 1) {\n words.splice(i, 1, word.substring(0, index + 1), word.substring(index + 1));\n separators.splice(i, 0, '');\n }\n }\n return { words, separators };\n}\nexport function breakText(text, size, styles = {}, options = {}) {\n const width = size.width;\n const height = size.height;\n const svgDocument = options.svgDocument || createSvgElement('svg');\n const telem = createSvgElement('text');\n const tspan = createSvgElement('tspan');\n const tnode = document.createTextNode('');\n attr(telem, styles);\n telem.appendChild(tspan);\n // Prevent flickering\n telem.style.opacity = '0';\n // Prevent FF from throwing an uncaught exception when `getBBox()`\n // called on element that is not in the render tree (is not measurable).\n // <tspan>.getComputedTextLength() returns always 0 in this case.\n // Note that the `textElement` resp. `textSpan` can become hidden\n // when it's appended to the DOM and a `display: none` CSS stylesheet\n // rule gets applied.\n telem.style.display = 'block';\n tspan.style.display = 'block';\n tspan.appendChild(tnode);\n svgDocument.appendChild(telem);\n const shouldAppend = svgDocument.parentNode == null;\n if (shouldAppend) {\n document.body.appendChild(svgDocument);\n }\n const eol = options.eol || '\\n';\n const separator = options.separator || ' ';\n const hyphen = options.hyphen ? new RegExp(options.hyphen) : /[^\\w\\d]/;\n const breakWord = options.breakWord !== false;\n const full = [];\n const lineSeprators = {};\n let lines = [];\n let partIndex;\n // let hyphenIndex\n let lineHeight;\n let currentSeparator;\n const { words, separators } = splitText(text, options.separator, eol, hyphen);\n for (let wordIndex = 0, lineIndex = 0, wordCount = words.length; wordIndex < wordCount; wordIndex += 1) {\n const word = words[wordIndex];\n // empty word\n if (!word) {\n continue;\n }\n // end of line\n if (word === eol) {\n full[lineIndex] = true;\n // start a new line\n lineIndex += 1;\n lines[lineIndex] = '';\n continue;\n }\n if (lines[lineIndex] != null) {\n currentSeparator = separators[wordIndex - 1] || '';\n tnode.data = `${lines[lineIndex]}${currentSeparator}${word}`;\n }\n else {\n tnode.data = word;\n }\n if (tspan.getComputedTextLength() <= width) {\n // update line\n lines[lineIndex] = tnode.data;\n lineSeprators[lineIndex] = separators[wordIndex];\n // when is partitioning, put rest of the word onto next line\n if (partIndex) {\n full[lineIndex] = true;\n lineIndex += 1;\n partIndex = 0;\n }\n }\n else {\n if (breakWord) {\n // word is too long to put in one line or is partitioning\n if (!lines[lineIndex] || partIndex) {\n const isPartition = !!partIndex;\n const isCharacter = word.length === 1;\n partIndex = word.length - 1;\n if (isPartition || isCharacter) {\n // word has only one character.\n if (isCharacter) {\n if (!lines[lineIndex]) {\n // can't fit this text within our rect\n lines = [];\n break;\n }\n // partitioning didn't help on the non-empty line\n // try again, but this time start with a new line\n // cancel partitions created\n words.splice(wordIndex, 2, word + words[wordIndex + 1]);\n separators.splice(wordIndex + 1, 1);\n full[lineIndex] = true;\n lineIndex += 1;\n wordCount -= 1;\n wordIndex -= 1;\n continue;\n }\n // update the partitioning words\n words[wordIndex] = word.substring(0, partIndex);\n words[wordIndex + 1] =\n word.substring(partIndex) + words[wordIndex + 1];\n }\n else {\n // partitioning the long word into two words\n words.splice(wordIndex, 1, word.substring(0, partIndex), word.substring(partIndex));\n separators.splice(wordIndex, 0, '');\n wordCount += 1;\n // if the previous line is not full\n if (lineIndex && !full[lineIndex - 1]) {\n lineIndex -= 1;\n }\n }\n wordIndex -= 1;\n continue;\n }\n }\n else if (!lines[lineIndex]) {\n lines[lineIndex] = word;\n full[lineIndex] = true;\n lineIndex += 1;\n continue;\n }\n lineIndex += 1;\n wordIndex -= 1;\n }\n // check whether the height of the entire text exceeds the rect height\n if (height != null) {\n // ensure line height\n if (lineHeight == null) {\n let heightValue;\n // use the same defaults as in V.prototype.text\n if (styles.lineHeight === 'auto') {\n heightValue = { value: 1.5, unit: 'em' };\n }\n else {\n heightValue = NumberExt.parseCssNumeric(styles.lineHeight, [\n 'em',\n ]) || {\n value: 1,\n unit: 'em',\n };\n }\n lineHeight = heightValue.value;\n if (heightValue.unit === 'em') {\n if (Platform.IS_FIREFOX) {\n lineHeight *= tspan.getBBox().height;\n }\n else {\n lineHeight *= telem.getBBox().height;\n }\n }\n }\n if (lineHeight * lines.length > height) {\n // remove overflowing lines\n const lastLineIndex = Math.floor(height / lineHeight) - 1;\n const lastLine = lines[lastLineIndex];\n const overflowLine = lines[lastLineIndex + 1];\n lines.splice(lastLineIndex + 1);\n if (lastLine == null) {\n break;\n }\n // add ellipsis\n let ellipsis = options.ellipsis;\n if (!ellipsis) {\n break;\n }\n if (typeof ellipsis !== 'string') {\n ellipsis = '\\u2026';\n }\n let fullLastLine = lastLine;\n if (overflowLine && breakWord) {\n fullLastLine += currentSeparator + overflowLine;\n }\n let lastCharIndex = fullLastLine.length;\n let fixedLastLine;\n let lastChar;\n do {\n lastChar = fullLastLine[lastCharIndex];\n fixedLastLine = fullLastLine.substring(0, lastCharIndex);\n if (!lastChar) {\n fixedLastLine += lineSeprators[lastLineIndex];\n }\n else if (lastChar.match(separator)) {\n fixedLastLine += lastChar;\n }\n fixedLastLine += ellipsis;\n tnode.data = fixedLastLine;\n if (tspan.getComputedTextLength() <= width) {\n lines[lastLineIndex] = fixedLastLine;\n break;\n }\n lastCharIndex -= 1;\n } while (lastCharIndex >= 0);\n break;\n }\n }\n }\n if (shouldAppend) {\n remove(svgDocument);\n }\n else {\n remove(telem);\n }\n return lines.join(eol);\n}\n//# sourceMappingURL=text.js.map","import { attr } from './attr';\nimport { createSvgElement } from './elem';\nexport const KAPPA = 0.551784;\nfunction getNumbericAttribute(elem, attr, defaultValue = NaN) {\n const v = elem.getAttribute(attr);\n if (v == null) {\n return defaultValue;\n }\n const n = parseFloat(v);\n return Number.isNaN(n) ? defaultValue : n;\n}\nexport function sample(elem, interval = 1) {\n const length = elem.getTotalLength();\n const samples = [];\n let distance = 0;\n let sample;\n while (distance < length) {\n sample = elem.getPointAtLength(distance);\n samples.push({ distance, x: sample.x, y: sample.y });\n distance += interval;\n }\n return samples;\n}\nexport function lineToPathData(line) {\n return [\n 'M',\n getNumbericAttribute(line, 'x1'),\n getNumbericAttribute(line, 'y1'),\n 'L',\n getNumbericAttribute(line, 'x2'),\n getNumbericAttribute(line, 'y2'),\n ].join(' ');\n}\nexport function polygonToPathData(polygon) {\n const points = getPointsFromSvgElement(polygon);\n if (points.length === 0) {\n return null;\n }\n return `${svgPointsToPath(points)} Z`;\n}\nexport function polylineToPathData(polyline) {\n const points = getPointsFromSvgElement(polyline);\n if (points.length === 0) {\n return null;\n }\n return svgPointsToPath(points);\n}\nfunction svgPointsToPath(points) {\n const arr = points.map((p) => `${p.x} ${p.y}`);\n return `M ${arr.join(' L')}`;\n}\nexport function getPointsFromSvgElement(elem) {\n const points = [];\n const nodePoints = elem.points;\n if (nodePoints) {\n for (let i = 0, ii = nodePoints.numberOfItems; i < ii; i += 1) {\n points.push(nodePoints.getItem(i));\n }\n }\n return points;\n}\nexport function circleToPathData(circle) {\n const cx = getNumbericAttribute(circle, 'cx', 0);\n const cy = getNumbericAttribute(circle, 'cy', 0);\n const r = getNumbericAttribute(circle, 'r');\n const cd = r * KAPPA; // Control distance.\n return [\n 'M',\n cx,\n cy - r,\n 'C',\n cx + cd,\n cy - r,\n cx + r,\n cy - cd,\n cx + r,\n cy,\n 'C',\n cx + r,\n cy + cd,\n cx + cd,\n cy + r,\n cx,\n cy + r,\n 'C',\n cx - cd,\n cy + r,\n cx - r,\n cy + cd,\n cx - r,\n cy,\n 'C',\n cx - r,\n cy - cd,\n cx - cd,\n cy - r,\n cx,\n cy - r,\n 'Z',\n ].join(' ');\n}\nexport function ellipseToPathData(ellipse) {\n const cx = getNumbericAttribute(ellipse, 'cx', 0);\n const cy = getNumbericAttribute(ellipse, 'cy', 0);\n const rx = getNumbericAttribute(ellipse, 'rx');\n const ry = getNumbericAttribute(ellipse, 'ry') || rx;\n const cdx = rx * KAPPA; // Control distance x.\n const cdy = ry * KAPPA; // Control distance y.\n const d = [\n 'M',\n cx,\n cy - ry,\n 'C',\n cx + cdx,\n cy - ry,\n cx + rx,\n cy - cdy,\n cx + rx,\n cy,\n 'C',\n cx + rx,\n cy + cdy,\n cx + cdx,\n cy + ry,\n cx,\n cy + ry,\n 'C',\n cx - cdx,\n cy + ry,\n cx - rx,\n cy + cdy,\n cx - rx,\n cy,\n 'C',\n cx - rx,\n cy - cdy,\n cx - cdx,\n cy - ry,\n cx,\n cy - ry,\n 'Z',\n ].join(' ');\n return d;\n}\nexport function rectangleToPathData(rect) {\n return rectToPathData({\n x: getNumbericAttribute(rect, 'x', 0),\n y: getNumbericAttribute(rect, 'y', 0),\n width: getNumbericAttribute(rect, 'width', 0),\n height: getNumbericAttribute(rect, 'height', 0),\n rx: getNumbericAttribute(rect, 'rx', 0),\n ry: getNumbericAttribute(rect, 'ry', 0),\n });\n}\nexport function rectToPathData(r) {\n let d;\n const x = r.x;\n const y = r.y;\n const width = r.width;\n const height = r.height;\n const topRx = Math.min(r.rx || r['top-rx'] || 0, width / 2);\n const bottomRx = Math.min(r.rx || r['bottom-rx'] || 0, width / 2);\n const topRy = Math.min(r.ry || r['top-ry'] || 0, height / 2);\n const bottomRy = Math.min(r.ry || r['bottom-ry'] || 0, height / 2);\n if (topRx || bottomRx || topRy || bottomRy) {\n d = [\n 'M',\n x,\n y + topRy,\n 'v',\n height - topRy - bottomRy,\n 'a',\n bottomRx,\n bottomRy,\n 0,\n 0,\n 0,\n bottomRx,\n bottomRy,\n 'h',\n width - 2 * bottomRx,\n 'a',\n bottomRx,\n bottomRy,\n 0,\n 0,\n 0,\n bottomRx,\n -bottomRy,\n 'v',\n -(height - bottomRy - topRy),\n 'a',\n topRx,\n topRy,\n 0,\n 0,\n 0,\n -topRx,\n -topRy,\n 'h',\n -(width - 2 * topRx),\n 'a',\n topRx,\n topRy,\n 0,\n 0,\n 0,\n -topRx,\n topRy,\n 'Z',\n ];\n }\n else {\n d = ['M', x, y, 'H', x + width, 'V', y + height, 'H', x, 'V', y, 'Z'];\n }\n return d.join(' ');\n}\nexport function toPath(elem) {\n const path = createSvgElement('path');\n attr(path, attr(elem));\n const d = toPathData(elem);\n if (d) {\n path.setAttribute('d', d);\n }\n return path;\n}\nexport function toPathData(elem) {\n const tagName = elem.tagName.toLowerCase();\n switch (tagName) {\n case 'path':\n return elem.getAttribute('d');\n case 'line':\n return lineToPathData(elem);\n case 'polygon':\n return polygonToPathData(elem);\n case 'polyline':\n return polylineToPathData(elem);\n case 'ellipse':\n return ellipseToPathData(elem);\n case 'circle':\n return circleToPathData(elem);\n case 'rect':\n return rectangleToPathData(elem);\n default:\n break;\n }\n throw new Error(`\"${tagName}\" cannot be converted to svg path element.`);\n}\n// Inspired by d3.js https://github.com/mbostock/d3/blob/master/src/svg/arc.js\nexport function createSlicePathData(innerRadius, outerRadius, startAngle, endAngle) {\n const svgArcMax = 2 * Math.PI - 1e-6;\n const r0 = innerRadius;\n const r1 = outerRadius;\n let a0 = startAngle;\n let a1 = endAngle;\n if (a1 < a0) {\n const tmp = a0;\n a0 = a1;\n a1 = tmp;\n }\n const da = a1 - a0;\n const df = da < Math.PI ? '0' : '1';\n const c0 = Math.cos(a0);\n const s0 = Math.sin(a0);\n const c1 = Math.cos(a1);\n const s1 = Math.sin(a1);\n return da >= svgArcMax\n ? r0\n ? // eslint-disable-next-line\n `M0,${r1}A${r1},${r1} 0 1,1 0,${-r1}A${r1},${r1} 0 1,1 0,${r1}M0,${r0}A${r0},${r0} 0 1,0 0,${-r0}A${r0},${r0} 0 1,0 0,${r0}Z`\n : // eslint-disable-next-line\n `M0,${r1}A${r1},${r1} 0 1,1 0,${-r1}A${r1},${r1} 0 1,1 0,${r1}Z`\n : r0\n ? // eslint-disable-next-line\n `M${r1 * c0},${r1 * s0}A${r1},${r1} 0 ${df},1 ${r1 * c1},${r1 * s1}L${r0 * c1},${r0 * s1}A${r0},${r0} 0 ${df},0 ${r0 * c0},${r0 * s0}Z`\n : // eslint-disable-next-line\n `M${r1 * c0},${r1 * s0}A${r1},${r1} 0 ${df},1 ${r1 * c1},${r1 * s1}L0,0` +\n `Z`;\n}\n//# sourceMappingURL=path.js.map","import { Angle, Point, Line, Rectangle, Polyline } from '../../geometry';\nimport { createSvgElement } from './elem';\nconst svgDocument = createSvgElement('svg');\nconst transformRegex = /(\\w+)\\(([^,)]+),?([^)]+)?\\)/gi;\nconst transformSeparatorRegex = /[ ,]+/;\nconst transformationListRegex = /^(\\w+)\\((.*)\\)/;\n/**\n * Returns a SVG point object initialized with the `x` and `y` coordinates.\n * @see https://developer.mozilla.org/en/docs/Web/API/SVGPoint\n */\nexport function createSVGPoint(x, y) {\n const p = svgDocument.createSVGPoint();\n p.x = x;\n p.y = y;\n return p;\n}\n/**\n * Returns the SVG transformation matrix initialized with the given matrix.\n *\n * The given matrix is an object of the form:\n * {\n * a: number\n * b: number\n * c: number\n * d: number\n * e: number\n * f: number\n * }\n *\n * @see https://developer.mozilla.org/en/docs/Web/API/SVGMatrix\n */\nexport function createSVGMatrix(matrix) {\n const mat = svgDocument.createSVGMatrix();\n if (matrix != null) {\n const source = matrix;\n const target = mat;\n // eslint-disable-next-line\n for (const key in source) {\n target[key] = source[key];\n }\n }\n return mat;\n}\n/**\n * Returns a SVG transform object.\n * @see https://developer.mozilla.org/en/docs/Web/API/SVGTransform\n */\nexport function createSVGTransform(matrix) {\n if (matrix != null) {\n if (!(matrix instanceof DOMMatrix)) {\n matrix = createSVGMatrix(matrix); // eslint-disable-line\n }\n return svgDocument.createSVGTransformFromMatrix(matrix);\n }\n return svgDocument.createSVGTransform();\n}\n/**\n * Returns the SVG transformation matrix built from the `transformString`.\n *\n * E.g. 'translate(10,10) scale(2,2)' will result in matrix:\n * `{ a: 2, b: 0, c: 0, d: 2, e: 10, f: 10}`\n */\nexport function transformStringToMatrix(transform) {\n let mat = createSVGMatrix();\n const matches = transform != null && transform.match(transformRegex);\n if (!matches) {\n return mat;\n }\n for (let i = 0, n = matches.length; i < n; i += 1) {\n const transformationString = matches[i];\n const transformationMatch = transformationString.match(transformationListRegex);\n if (transformationMatch) {\n let sx;\n let sy;\n let tx;\n let ty;\n let angle;\n let ctm = createSVGMatrix();\n const args = transformationMatch[2].split(transformSeparatorRegex);\n switch (transformationMatch[1].toLowerCase()) {\n case 'scale':\n sx = parseFloat(args[0]);\n sy = args[1] === undefined ? sx : parseFloat(args[1]);\n ctm = ctm.scaleNonUniform(sx, sy);\n break;\n case 'translate':\n tx = parseFloat(args[0]);\n ty = parseFloat(args[1]);\n ctm = ctm.translate(tx, ty);\n break;\n case 'rotate':\n angle = parseFloat(args[0]);\n tx = parseFloat(args[1]) || 0;\n ty = parseFloat(args[2]) || 0;\n if (tx !== 0 || ty !== 0) {\n ctm = ctm.translate(tx, ty).rotate(angle).translate(-tx, -ty);\n }\n else {\n ctm = ctm.rotate(angle);\n }\n break;\n case 'skewx':\n angle = parseFloat(args[0]);\n ctm = ctm.skewX(angle);\n break;\n case 'skewy':\n angle = parseFloat(args[0]);\n ctm = ctm.skewY(angle);\n break;\n case 'matrix':\n ctm.a = parseFloat(args[0]);\n ctm.b = parseFloat(args[1]);\n ctm.c = parseFloat(args[2]);\n ctm.d = parseFloat(args[3]);\n ctm.e = parseFloat(args[4]);\n ctm.f = parseFloat(args[5]);\n break;\n default:\n continue;\n }\n mat = mat.multiply(ctm);\n }\n }\n return mat;\n}\nexport function matrixToTransformString(matrix) {\n const m = matrix || {};\n const a = m.a != null ? m.a : 1;\n const b = m.b != null ? m.b : 0;\n const c = m.c != null ? m.c : 0;\n const d = m.d != null ? m.d : 1;\n const e = m.e != null ? m.e : 0;\n const f = m.f != null ? m.f : 0;\n return `matrix(${a},${b},${c},${d},${e},${f})`;\n}\nexport function parseTransformString(transform) {\n let translation;\n let rotation;\n let scale;\n if (transform) {\n const separator = transformSeparatorRegex;\n // Allow reading transform string with a single matrix\n if (transform.trim().indexOf('matrix') >= 0) {\n const matrix = transformStringToMatrix(transform);\n const decomposedMatrix = decomposeMatrix(matrix);\n translation = [decomposedMatrix.translateX, decomposedMatrix.translateY];\n rotation = [decomposedMatrix.rotation];\n scale = [decomposedMatrix.scaleX, decomposedMatrix.scaleY];\n const transformations = [];\n if (translation[0] !== 0 || translation[1] !== 0) {\n transformations.push(`translate(${translation.join(',')})`);\n }\n if (scale[0] !== 1 || scale[1] !== 1) {\n transformations.push(`scale(${scale.join(',')})`);\n }\n if (rotation[0] !== 0) {\n transformations.push(`rotate(${rotation[0]})`);\n }\n transform = transformations.join(' '); // eslint-disable-line\n }\n else {\n const translateMatch = transform.match(/translate\\((.*?)\\)/);\n if (translateMatch) {\n translation = translateMatch[1].split(separator);\n }\n const rotateMatch = transform.match(/rotate\\((.*?)\\)/);\n if (rotateMatch) {\n rotation = rotateMatch[1].split(separator);\n }\n const scaleMatch = transform.match(/scale\\((.*?)\\)/);\n if (scaleMatch) {\n scale = scaleMatch[1].split(separator);\n }\n }\n }\n const sx = scale && scale[0] ? parseFloat(scale[0]) : 1;\n return {\n raw: transform || '',\n translation: {\n tx: translation && translation[0]\n ? parseInt(translation[0], 10)\n : 0,\n ty: translation && translation[1]\n ? parseInt(translation[1], 10)\n : 0,\n },\n rotation: {\n angle: rotation && rotation[0] ? parseInt(rotation[0], 10) : 0,\n cx: rotation && rotation[1]\n ? parseInt(rotation[1], 10)\n : undefined,\n cy: rotation && rotation[2]\n ? parseInt(rotation[2], 10)\n : undefined,\n },\n scale: {\n sx,\n sy: scale && scale[1] ? parseFloat(scale[1]) : sx,\n },\n };\n}\nfunction deltaTransformPoint(matrix, point) {\n const dx = point.x * matrix.a + point.y * matrix.c + 0;\n const dy = point.x * matrix.b + point.y * matrix.d + 0;\n return { x: dx, y: dy };\n}\n/**\n * Decomposes the SVG transformation matrix into separate transformations.\n *\n * Returns an object of the form:\n * {\n * translateX: number\n * translateY: number\n * scaleX: number\n * scaleY: number\n * skewX: number\n * skewY: number\n * rotation: number\n * }\n *\n * @see https://developer.mozilla.org/en/docs/Web/API/SVGMatrix\n */\nexport function decomposeMatrix(matrix) {\n // @see https://gist.github.com/2052247\n const px = deltaTransformPoint(matrix, { x: 0, y: 1 });\n const py = deltaTransformPoint(matrix, { x: 1, y: 0 });\n const skewX = (180 / Math.PI) * Math.atan2(px.y, px.x) - 90;\n const skewY = (180 / Math.PI) * Math.atan2(py.y, py.x);\n return {\n skewX,\n skewY,\n translateX: matrix.e,\n translateY: matrix.f,\n scaleX: Math.sqrt(matrix.a * matrix.a + matrix.b * matrix.b),\n scaleY: Math.sqrt(matrix.c * matrix.c + matrix.d * matrix.d),\n rotation: skewX,\n };\n}\nexport function matrixToScale(matrix) {\n let a;\n let b;\n let c;\n let d;\n if (matrix) {\n a = matrix.a == null ? 1 : matrix.a;\n d = matrix.d == null ? 1 : matrix.d;\n b = matrix.b;\n c = matrix.c;\n }\n else {\n a = d = 1;\n }\n return {\n sx: b ? Math.sqrt(a * a + b * b) : a,\n sy: c ? Math.sqrt(c * c + d * d) : d,\n };\n}\nexport function matrixToRotation(matrix) {\n let p = { x: 0, y: 1 };\n if (matrix) {\n p = deltaTransformPoint(matrix, p);\n }\n return {\n angle: Angle.normalize(Angle.toDeg(Math.atan2(p.y, p.x)) - 90),\n };\n}\nexport function matrixToTranslation(matrix) {\n return {\n tx: (matrix && matrix.e) || 0,\n ty: (matrix && matrix.f) || 0,\n };\n}\n/**\n * Transforms point by an SVG transformation represented by `matrix`.\n */\nexport function transformPoint(point, matrix) {\n const ret = createSVGPoint(point.x, point.y).matrixTransform(matrix);\n return new Point(ret.x, ret.y);\n}\n/**\n * Transforms line by an SVG transformation represented by `matrix`.\n */\nexport function transformLine(line, matrix) {\n return new Line(transformPoint(line.start, matrix), transformPoint(line.end, matrix));\n}\n/**\n * Transforms polyline by an SVG transformation represented by `matrix`.\n */\nexport function transformPolyline(polyline, matrix) {\n let points = polyline instanceof Polyline ? polyline.points : polyline;\n if (!Array.isArray(points)) {\n points = [];\n }\n return new Polyline(points.map((p) => transformPoint(p, matrix)));\n}\nexport function transformRectangle(rect, matrix) {\n const p = svgDocument.createSVGPoint();\n p.x = rect.x;\n p.y = rect.y;\n const corner1 = p.matrixTransform(matrix);\n p.x = rect.x + rect.width;\n p.y = rect.y;\n const corner2 = p.matrixTransform(matrix);\n p.x = rect.x + rect.width;\n p.y = rect.y + rect.height;\n const corner3 = p.matrixTransform(matrix);\n p.x = rect.x;\n p.y = rect.y + rect.height;\n const corner4 = p.matrixTransform(matrix);\n const minX = Math.min(corner1.x, corner2.x, corner3.x, corner4.x);\n const maxX = Math.max(corner1.x, corner2.x, corner3.x, corner4.x);\n const minY = Math.min(corner1.y, corner2.y, corner3.y, corner4.y);\n const maxY = Math.max(corner1.y, corner2.y, corner3.y, corner4.y);\n return new Rectangle(minX, minY, maxX - minX, maxY - minY);\n}\n//# sourceMappingURL=matrix.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Point, Line, Rectangle, Polyline, Ellipse, Path } from '../../geometry';\nimport { attr } from './attr';\nimport { sample, toPath, getPointsFromSvgElement } from './path';\nimport { ensureId, isSVGGraphicsElement, createSvgElement, isHTMLElement, } from './elem';\nimport { getComputedStyle } from './style';\nimport { createSVGPoint, createSVGMatrix, decomposeMatrix, transformRectangle, transformStringToMatrix, } from './matrix';\n/**\n * Returns the bounding box of the element after transformations are\n * applied. If `withoutTransformations` is `true`, transformations of\n * the element will not be considered when computing the bounding box.\n * If `target` is specified, bounding box will be computed relatively\n * to the `target` element.\n */\nexport function bbox(elem, withoutTransformations, target) {\n let box;\n const ownerSVGElement = elem.ownerSVGElement;\n // If the element is not in the live DOM, it does not have a bounding\n // box defined and so fall back to 'zero' dimension element.\n if (!ownerSVGElement) {\n return new Rectangle(0, 0, 0, 0);\n }\n try {\n box = elem.getBBox();\n }\n catch (e) {\n // Fallback for IE.\n box = {\n x: elem.clientLeft,\n y: elem.clientTop,\n width: elem.clientWidth,\n height: elem.clientHeight,\n };\n }\n if (withoutTransformations) {\n return Rectangle.create(box);\n }\n const matrix = getTransformToElement(elem, target || ownerSVGElement);\n return transformRectangle(box, matrix);\n}\n/**\n * Returns the bounding box of the element after transformations are\n * applied. Unlike `bbox()`, this function fixes a browser implementation\n * bug to return the correct bounding box if this elemenent is a group of\n * svg elements (if `options.recursive` is specified).\n */\nexport function getBBox(elem, options = {}) {\n let outputBBox;\n const ownerSVGElement = elem.ownerSVGElement;\n // If the element is not in the live DOM, it does not have a bounding box\n // defined and so fall back to 'zero' dimension element.\n // If the element is not an SVGGraphicsElement, we could not measure the\n // bounding box either\n if (!ownerSVGElement || !isSVGGraphicsElement(elem)) {\n if (isHTMLElement(elem)) {\n // If the element is a HTMLElement, return the position relative to the body\n const { left, top, width, height } = getBoundingOffsetRect(elem);\n return new Rectangle(left, top, width, height);\n }\n return new Rectangle(0, 0, 0, 0);\n }\n let target = options.target;\n const recursive = options.recursive;\n if (!recursive) {\n try {\n outputBBox = elem.getBBox();\n }\n catch (e) {\n outputBBox = {\n x: elem.clientLeft,\n y: elem.clientTop,\n width: elem.clientWidth,\n height: elem.clientHeight,\n };\n }\n if (!target) {\n return Rectangle.create(outputBBox);\n }\n // transform like target\n const matrix = getTransformToElement(elem, target);\n return transformRectangle(outputBBox, matrix);\n }\n // recursive\n {\n const children = elem.childNodes;\n const n = children.length;\n if (n === 0) {\n return getBBox(elem, { target });\n }\n if (!target) {\n target = elem; // eslint-disable-line\n }\n for (let i = 0; i < n; i += 1) {\n const child = children[i];\n let childBBox;\n if (child.childNodes.length === 0) {\n childBBox = getBBox(child, { target });\n }\n else {\n // if child is a group element, enter it with a recursive call\n childBBox = getBBox(child, { target, recursive: true });\n }\n if (!outputBBox) {\n outputBBox = childBBox;\n }\n else {\n outputBBox = outputBBox.union(childBBox);\n }\n }\n return outputBBox;\n }\n}\n// BBox is calculated by the attribute on the node\nexport function getBBoxByElementAttr(elem) {\n let node = elem;\n let tagName = node ? node.tagName.toLowerCase() : '';\n // find shape node\n while (tagName === 'g') {\n node = node.firstElementChild;\n tagName = node ? node.tagName.toLowerCase() : '';\n }\n const attr = (name) => {\n const s = node.getAttribute(name);\n const v = s ? parseFloat(s) : 0;\n return Number.isNaN(v) ? 0 : v;\n };\n let r;\n let bbox;\n switch (tagName) {\n case 'rect':\n bbox = new Rectangle(attr('x'), attr('y'), attr('width'), attr('height'));\n break;\n case 'circle':\n r = attr('r');\n bbox = new Rectangle(attr('cx') - r, attr('cy') - r, 2 * r, 2 * r);\n break;\n default:\n break;\n }\n return bbox;\n}\n// Matrix is calculated by the transform attribute on the node\nexport function getMatrixByElementAttr(elem, target) {\n let matrix = createSVGMatrix();\n if (isSVGGraphicsElement(target) && isSVGGraphicsElement(elem)) {\n let node = elem;\n const matrixList = [];\n while (node && node !== target) {\n const transform = node.getAttribute('transform') || null;\n const nodeMatrix = transformStringToMatrix(transform);\n matrixList.push(nodeMatrix);\n node = node.parentNode;\n }\n matrixList.reverse().forEach((m) => {\n matrix = matrix.multiply(m);\n });\n }\n return matrix;\n}\n/**\n * Returns an DOMMatrix that specifies the transformation necessary\n * to convert `elem` coordinate system into `target` coordinate system.\n */\nexport function getTransformToElement(elem, target) {\n if (isSVGGraphicsElement(target) && isSVGGraphicsElement(elem)) {\n const targetCTM = target.getScreenCTM();\n const nodeCTM = elem.getScreenCTM();\n if (targetCTM && nodeCTM) {\n return targetCTM.inverse().multiply(nodeCTM);\n }\n }\n // Could not get actual transformation matrix\n return createSVGMatrix();\n}\n/**\n * Converts a global point with coordinates `x` and `y` into the\n * coordinate space of the element.\n */\nexport function toLocalPoint(elem, x, y) {\n const svg = elem instanceof SVGSVGElement\n ? elem\n : elem.ownerSVGElement;\n const p = svg.createSVGPoint();\n p.x = x;\n p.y = y;\n try {\n const ctm = svg.getScreenCTM();\n const globalPoint = p.matrixTransform(ctm.inverse());\n const globalToLocalMatrix = getTransformToElement(elem, svg).inverse();\n return globalPoint.matrixTransform(globalToLocalMatrix);\n }\n catch (e) {\n return p;\n }\n}\n/**\n * Convert the SVGElement to an equivalent geometric shape. The element's\n * transformations are not taken into account.\n *\n * SVGRectElement => Rectangle\n *\n * SVGLineElement => Line\n *\n * SVGCircleElement => Ellipse\n *\n * SVGEllipseElement => Ellipse\n *\n * SVGPolygonElement => Polyline\n *\n * SVGPolylineElement => Polyline\n *\n * SVGPathElement => Path\n *\n * others => Rectangle\n */\nexport function toGeometryShape(elem) {\n const attr = (name) => {\n const s = elem.getAttribute(name);\n const v = s ? parseFloat(s) : 0;\n return Number.isNaN(v) ? 0 : v;\n };\n switch (elem instanceof SVGElement && elem.nodeName.toLowerCase()) {\n case 'rect':\n return new Rectangle(attr('x'), attr('y'), attr('width'), attr('height'));\n case 'circle':\n return new Ellipse(attr('cx'), attr('cy'), attr('r'), attr('r'));\n case 'ellipse':\n return new Ellipse(attr('cx'), attr('cy'), attr('rx'), attr('ry'));\n case 'polyline': {\n const points = getPointsFromSvgElement(elem);\n return new Polyline(points);\n }\n case 'polygon': {\n const points = getPointsFromSvgElement(elem);\n if (points.length > 1) {\n points.push(points[0]);\n }\n return new Polyline(points);\n }\n case 'path': {\n let d = elem.getAttribute('d');\n if (!Path.isValid(d)) {\n d = Path.normalize(d);\n }\n return Path.parse(d);\n }\n case 'line': {\n return new Line(attr('x1'), attr('y1'), attr('x2'), attr('y2'));\n }\n default:\n break;\n }\n // Anything else is a rectangle\n return getBBox(elem);\n}\nexport function getIntersection(elem, ref, target) {\n const svg = elem instanceof SVGSVGElement ? elem : elem.ownerSVGElement;\n target = target || svg; // eslint-disable-line\n const bbox = getBBox(target);\n const center = bbox.getCenter();\n if (!bbox.intersectsWithLineFromCenterToPoint(ref)) {\n return null;\n }\n let spot = null;\n const tagName = elem.tagName.toLowerCase();\n // Little speed up optimization for `<rect>` element. We do not do convert\n // to path element and sampling but directly calculate the intersection\n // through a transformed geometrical rectangle.\n if (tagName === 'rect') {\n const gRect = new Rectangle(parseFloat(elem.getAttribute('x') || '0'), parseFloat(elem.getAttribute('y') || '0'), parseFloat(elem.getAttribute('width') || '0'), parseFloat(elem.getAttribute('height') || '0'));\n // Get the rect transformation matrix with regards to the SVG document.\n const rectMatrix = getTransformToElement(elem, target);\n const rectMatrixComponents = decomposeMatrix(rectMatrix);\n // Rotate the rectangle back so that we can use\n // `intersectsWithLineFromCenterToPoint()`.\n const reseted = svg.createSVGTransform();\n reseted.setRotate(-rectMatrixComponents.rotation, center.x, center.y);\n const rect = transformRectangle(gRect, reseted.matrix.multiply(rectMatrix));\n spot = Rectangle.create(rect).intersectsWithLineFromCenterToPoint(ref, rectMatrixComponents.rotation);\n }\n else if (tagName === 'path' ||\n tagName === 'polygon' ||\n tagName === 'polyline' ||\n tagName === 'circle' ||\n tagName === 'ellipse') {\n const pathNode = tagName === 'path' ? elem : toPath(elem);\n const samples = sample(pathNode);\n let minDistance = Infinity;\n let closestSamples = [];\n for (let i = 0, ii = samples.length; i < ii; i += 1) {\n const sample = samples[i];\n // Convert the sample point in the local coordinate system\n // to the global coordinate system.\n let gp = createSVGPoint(sample.x, sample.y);\n gp = gp.matrixTransform(getTransformToElement(elem, target));\n const ggp = Point.create(gp);\n const centerDistance = ggp.distance(center);\n // Penalize a higher distance to the reference point by 10%.\n // This gives better results. This is due to\n // inaccuracies introduced by rounding errors and getPointAtLength() returns.\n const refDistance = ggp.distance(ref) * 1.1;\n const distance = centerDistance + refDistance;\n if (distance < minDistance) {\n minDistance = distance;\n closestSamples = [{ sample, refDistance }];\n }\n else if (distance < minDistance + 1) {\n closestSamples.push({ sample, refDistance });\n }\n }\n closestSamples.sort((a, b) => a.refDistance - b.refDistance);\n if (closestSamples[0]) {\n spot = Point.create(closestSamples[0].sample);\n }\n }\n return spot;\n}\nexport function animate(elem, options) {\n return createAnimation(elem, options, 'animate');\n}\nexport function animateTransform(elem, options) {\n return createAnimation(elem, options, 'animateTransform');\n}\nfunction createAnimation(elem, options, type) {\n // @see\n // https://www.w3.org/TR/SVG11/animate.html#AnimateElement\n // https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimateElement\n // https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimateTransformElement\n const animate = createSvgElement(type);\n elem.appendChild(animate);\n try {\n return setupAnimation(animate, options);\n }\n catch (error) {\n // pass\n }\n return () => { };\n}\nfunction setupAnimation(animate, options) {\n const { start, complete, repeat } = options, attrs = __rest(options, [\"start\", \"complete\", \"repeat\"]);\n attr(animate, attrs);\n start && animate.addEventListener('beginEvent', start);\n complete && animate.addEventListener('endEvent', complete);\n repeat && animate.addEventListener('repeatEvent', repeat);\n const ani = animate;\n ani.beginElement();\n return () => ani.endElement();\n}\n/**\n * Animate the element along the path SVG element (or Vector object).\n * `attrs` contain Animation Timing attributes describing the animation.\n */\nexport function animateAlongPath(elem, options, path) {\n const id = ensureId(path);\n // https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimationElement\n const animate = createSvgElement('animateMotion');\n const mpath = createSvgElement('mpath');\n attr(mpath, { 'xlink:href': `#${id}` });\n animate.appendChild(mpath);\n elem.appendChild(animate);\n try {\n return setupAnimation(animate, options);\n }\n catch (e) {\n // Fallback for IE 9.\n if (document.documentElement.getAttribute('smiling') === 'fake') {\n // Register the animation. (See `https://answers.launchpad.net/smil/+question/203333`)\n const ani = animate;\n ani.animators = [];\n const win = window;\n const animationID = ani.getAttribute('id');\n if (animationID) {\n win.id2anim[animationID] = ani;\n }\n const targets = win.getTargets(ani);\n for (let i = 0, ii = targets.length; i < ii; i += 1) {\n const target = targets[i];\n const animator = new win.Animator(ani, target, i);\n win.animators.push(animator);\n ani.animators[i] = animator;\n animator.register();\n }\n }\n }\n return () => { };\n}\nexport function getBoundingOffsetRect(elem) {\n let left = 0;\n let top = 0;\n let width = 0;\n let height = 0;\n if (elem) {\n let current = elem;\n while (current) {\n left += current.offsetLeft;\n top += current.offsetTop;\n current = current.offsetParent;\n if (current) {\n left += parseInt(getComputedStyle(current, 'borderLeft'), 10);\n top += parseInt(getComputedStyle(current, 'borderTop'), 10);\n }\n }\n width = elem.offsetWidth;\n height = elem.offsetHeight;\n }\n return { left, top, width, height };\n}\n//# sourceMappingURL=geom.js.map","import { Point } from '../../geometry';\nimport { attr } from './attr';\nimport { getBBox, getTransformToElement } from './geom';\nimport { createSVGTransform, parseTransformString, transformStringToMatrix, matrixToTransformString, } from './matrix';\nexport function transform(elem, matrix, options = {}) {\n if (matrix == null) {\n return transformStringToMatrix(attr(elem, 'transform'));\n }\n if (options.absolute) {\n elem.setAttribute('transform', matrixToTransformString(matrix));\n return;\n }\n const transformList = elem.transform;\n const svgTransform = createSVGTransform(matrix);\n transformList.baseVal.appendItem(svgTransform);\n}\nexport function translate(elem, tx, ty = 0, options = {}) {\n let transformAttr = attr(elem, 'transform');\n const transform = parseTransformString(transformAttr);\n if (tx == null) {\n return transform.translation;\n }\n transformAttr = transform.raw;\n transformAttr = transformAttr.replace(/translate\\([^)]*\\)/g, '').trim();\n const newTx = options.absolute ? tx : transform.translation.tx + tx;\n const newTy = options.absolute ? ty : transform.translation.ty + ty;\n const newTranslate = `translate(${newTx},${newTy})`;\n // Note that `translate()` is always the first transformation. This is\n // usually the desired case.\n elem.setAttribute('transform', `${newTranslate} ${transformAttr}`.trim());\n}\nexport function rotate(elem, angle, cx, cy, options = {}) {\n let transformAttr = attr(elem, 'transform');\n const transform = parseTransformString(transformAttr);\n if (angle == null) {\n return transform.rotation;\n }\n transformAttr = transform.raw;\n transformAttr = transformAttr.replace(/rotate\\([^)]*\\)/g, '').trim();\n angle %= 360; // eslint-disable-line\n const newAngle = options.absolute ? angle : transform.rotation.angle + angle;\n const newOrigin = cx != null && cy != null ? `,${cx},${cy}` : '';\n const newRotate = `rotate(${newAngle}${newOrigin})`;\n elem.setAttribute('transform', `${transformAttr} ${newRotate}`.trim());\n}\nexport function scale(elem, sx, sy) {\n let transformAttr = attr(elem, 'transform');\n const transform = parseTransformString(transformAttr);\n if (sx == null) {\n return transform.scale;\n }\n sy = sy == null ? sx : sy; // eslint-disable-line\n transformAttr = transform.raw;\n transformAttr = transformAttr.replace(/scale\\([^)]*\\)/g, '').trim();\n const newScale = `scale(${sx},${sy})`;\n elem.setAttribute('transform', `${transformAttr} ${newScale}`.trim());\n}\nexport function translateAndAutoOrient(elem, position, reference, target) {\n const pos = Point.create(position);\n const ref = Point.create(reference);\n if (!target) {\n const svg = elem instanceof SVGSVGElement ? elem : elem.ownerSVGElement;\n target = svg; // eslint-disable-line\n }\n // Clean-up previously set transformations except the scale.\n // If we didn't clean up the previous transformations then they'd\n // add up with the old ones. Scale is an exception as it doesn't\n // add up, consider: `this.scale(2).scale(2).scale(2)`. The result\n // is that the element is scaled by the factor 2, not 8.\n const s = scale(elem);\n elem.setAttribute('transform', '');\n const bbox = getBBox(elem, { target }).scale(s.sx, s.sy);\n // 1. Translate to origin.\n const translateToOrigin = createSVGTransform();\n translateToOrigin.setTranslate(-bbox.x - bbox.width / 2, -bbox.y - bbox.height / 2);\n // 2. Rotate around origin.\n const rotateAroundOrigin = createSVGTransform();\n const angle = pos.angleBetween(ref, pos.clone().translate(1, 0));\n if (angle)\n rotateAroundOrigin.setRotate(angle, 0, 0);\n // 3. Translate to the `position` + the offset (half my width)\n // towards the `reference` point.\n const translateFromOrigin = createSVGTransform();\n const finalPosition = pos.clone().move(ref, bbox.width / 2);\n translateFromOrigin.setTranslate(2 * pos.x - finalPosition.x, 2 * pos.y - finalPosition.y);\n // 4. Get the current transformation matrix of this node\n const ctm = getTransformToElement(elem, target);\n // 5. Apply transformations and the scale\n const transform = createSVGTransform();\n transform.setMatrix(translateFromOrigin.matrix.multiply(rotateAroundOrigin.matrix.multiply(translateToOrigin.matrix.multiply(ctm.scale(s.sx, s.sy)))));\n elem.setAttribute('transform', matrixToTransformString(transform.matrix));\n}\n//# sourceMappingURL=transform.js.map","import JQuery from 'jquery';\nimport { Platform } from '../platform';\nexport class MouseWheelHandle {\n constructor(target, onWheelCallback, onWheelGuard) {\n this.animationFrameId = 0;\n this.deltaX = 0;\n this.deltaY = 0;\n this.eventName = Platform.isEventSupported('wheel')\n ? 'wheel'\n : 'mousewheel';\n this.target = target;\n this.onWheelCallback = onWheelCallback;\n this.onWheelGuard = onWheelGuard;\n this.onWheel = this.onWheel.bind(this);\n this.didWheel = this.didWheel.bind(this);\n }\n enable() {\n if (Platform.SUPPORT_PASSIVE) {\n this.target.addEventListener(this.eventName, this.onWheel, {\n passive: false,\n });\n }\n else {\n JQuery(this.target).on('mousewheel', this.onWheel);\n }\n }\n disable() {\n if (Platform.SUPPORT_PASSIVE) {\n this.target.removeEventListener(this.eventName, this.onWheel);\n }\n else {\n JQuery(this.target).off('mousewheel');\n }\n }\n onWheel(e) {\n if (this.onWheelGuard != null && !this.onWheelGuard(e)) {\n return;\n }\n this.deltaX += e.deltaX;\n this.deltaY += e.deltaY;\n e.preventDefault();\n let changed;\n if (this.deltaX !== 0 || this.deltaY !== 0) {\n e.stopPropagation();\n changed = true;\n }\n if (changed === true && this.animationFrameId === 0) {\n this.animationFrameId = requestAnimationFrame(() => {\n this.didWheel(e);\n });\n }\n }\n didWheel(e) {\n this.animationFrameId = 0;\n this.onWheelCallback(e, this.deltaX, this.deltaY);\n this.deltaX = 0;\n this.deltaY = 0;\n }\n}\n//# sourceMappingURL=mousewheel.js.map","import { Vector } from '../vector';\n/**\n * **Deprecation Notice:** `Dom.isVector` is deprecated and will be moved in next\n * major release. Use `Vector.isVector()` instead.\n *\n * @deprecated\n */\nexport const isVector = Vector.isVector;\n/**\n * **Deprecation Notice:** `Dom.createVector` is deprecated and will be moved\n * in next major release. Use `Vector.create()` instead.\n *\n * @deprecated\n */\nexport const createVector = Vector.create;\n/**\n * **Deprecation Notice:** `Dom.createVectors` is deprecated and will be moved\n * in next major release. Use `Vector.createVectors()` instead.\n *\n * @deprecated\n */\nexport const createVectors = Vector.createVectors;\n//# sourceMappingURL=vector.js.map","export function debounce(fn, delay = 60) {\n let timer = null;\n return (...args) => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = window.setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n//# sourceMappingURL=util.js.map","import { debounce } from './util';\nexport function createSensor(element) {\n let sensor = null;\n let listeners = [];\n const create = () => {\n if (getComputedStyle(element).position === 'static') {\n const style = element.style;\n style.position = 'relative';\n }\n const obj = document.createElement('object');\n obj.onload = () => {\n obj.contentDocument.defaultView.addEventListener('resize', trigger);\n trigger();\n };\n obj.style.display = 'block';\n obj.style.position = 'absolute';\n obj.style.top = '0';\n obj.style.left = '0';\n obj.style.height = '100%';\n obj.style.width = '100%';\n obj.style.overflow = 'hidden';\n obj.style.pointerEvents = 'none';\n obj.style.zIndex = '-1';\n obj.style.opacity = '0';\n obj.setAttribute('tabindex', '-1');\n obj.type = 'text/html';\n element.appendChild(obj);\n // for ie, should set data attribute delay, or will be white screen\n obj.data = 'about:blank';\n return obj;\n };\n const trigger = debounce(() => {\n listeners.forEach((listener) => listener(element));\n });\n const bind = (listener) => {\n if (!sensor) {\n sensor = create();\n }\n if (listeners.indexOf(listener) === -1) {\n listeners.push(listener);\n }\n };\n const destroy = () => {\n if (sensor && sensor.parentNode) {\n if (sensor.contentDocument) {\n sensor.contentDocument.defaultView.removeEventListener('resize', trigger);\n }\n sensor.parentNode.removeChild(sensor);\n sensor = null;\n listeners = [];\n }\n };\n const unbind = (listener) => {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n // no listener, and sensor is exist then destroy the sensor\n if (listeners.length === 0 && sensor) {\n destroy();\n }\n };\n return {\n element,\n bind,\n destroy,\n unbind,\n };\n}\n//# sourceMappingURL=object.js.map","import { debounce } from './util';\nexport function createSensor(element) {\n let sensor = null;\n let listeners = [];\n const trigger = debounce(() => {\n listeners.forEach((listener) => {\n listener(element);\n });\n });\n const create = () => {\n const s = new ResizeObserver(trigger);\n s.observe(element);\n trigger();\n return s;\n };\n const bind = (listener) => {\n if (!sensor) {\n sensor = create();\n }\n if (listeners.indexOf(listener) === -1) {\n listeners.push(listener);\n }\n };\n const destroy = () => {\n if (sensor) {\n sensor.disconnect();\n listeners = [];\n sensor = null;\n }\n };\n const unbind = (listener) => {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n // no listener, and sensor is exist then destroy the sensor\n if (listeners.length === 0 && sensor) {\n destroy();\n }\n };\n return {\n element,\n bind,\n destroy,\n unbind,\n };\n}\n//# sourceMappingURL=observer.js.map","import { createSensor as createObjectSensor } from './object';\nimport { createSensor as createResizeObserverSensor } from './observer';\nexport const createSensor = typeof ResizeObserver !== 'undefined'\n ? createResizeObserverSensor\n : createObjectSensor;\n//# sourceMappingURL=index.js.map","import { createSensor } from './sensors';\nexport var SizeSensor;\n(function (SizeSensor) {\n const cache = new WeakMap();\n function get(element) {\n let sensor = cache.get(element);\n if (sensor) {\n return sensor;\n }\n sensor = createSensor(element);\n cache.set(element, sensor);\n return sensor;\n }\n function remove(sensor) {\n sensor.destroy();\n cache.delete(sensor.element);\n }\n SizeSensor.bind = (element, cb) => {\n const sensor = get(element);\n sensor.bind(cb);\n return () => sensor.unbind(cb);\n };\n SizeSensor.clear = (element) => {\n const sensor = get(element);\n remove(sensor);\n };\n})(SizeSensor || (SizeSensor = {}));\n//# sourceMappingURL=index.js.map","export var Scheduler;\n(function (Scheduler) {\n const queue = [];\n const threshold = 1000 / 60;\n const unit = [];\n let deadline = 0;\n const getTime = () => performance.now();\n const peek = (queue) => queue[0];\n const schedule = (cb) => unit.push(cb) === 1 && postMessage();\n const postMessage = (() => {\n const cb = () => unit.splice(0, unit.length).forEach((c) => c());\n if (typeof MessageChannel !== 'undefined') {\n const { port1, port2 } = new MessageChannel();\n port1.onmessage = cb;\n return () => port2.postMessage(null);\n }\n return () => setTimeout(cb);\n })();\n const flushTask = () => {\n deadline = getTime() + threshold;\n let job = peek(queue);\n while (job && !Scheduler.shouldYield()) {\n const { callback, data } = job;\n job.callback = null;\n const next = callback && callback(data);\n if (next) {\n job.callback = next;\n }\n else {\n queue.shift();\n }\n job = peek(queue);\n }\n job && schedule(flushTask);\n };\n Scheduler.scheduleTask = (callback, data) => {\n const task = {\n callback,\n data,\n };\n queue.push(task);\n schedule(flushTask);\n };\n Scheduler.shouldYield = () => {\n var _a, _b;\n return (((_b = (_a = navigator) === null || _a === void 0 ? void 0 : _a.scheduling) === null || _b === void 0 ? void 0 : _b.isInputPending()) || getTime() >= deadline);\n };\n})(Scheduler || (Scheduler = {}));\n//# sourceMappingURL=index.js.map","import { StringExt, FunctionExt, Platform } from '../util';\nexport class Registry {\n constructor(options) {\n this.options = Object.assign({}, options);\n this.data = this.options.data || {};\n this.register = this.register.bind(this);\n this.unregister = this.unregister.bind(this);\n }\n get names() {\n return Object.keys(this.data);\n }\n register(name, options, force = false) {\n if (typeof name === 'object') {\n Object.keys(name).forEach((key) => {\n this.register(key, name[key], options);\n });\n return;\n }\n if (this.exist(name) && !force && !Platform.isApplyingHMR()) {\n this.onDuplicated(name);\n }\n const process = this.options.process;\n const entity = process\n ? FunctionExt.call(process, this, name, options)\n : options;\n this.data[name] = entity;\n return entity;\n }\n unregister(name) {\n const entity = name ? this.data[name] : null;\n delete this.data[name];\n return entity;\n }\n get(name) {\n return name ? this.data[name] : null;\n }\n exist(name) {\n return name ? this.data[name] != null : false;\n }\n onDuplicated(name) {\n // eslint-disable-next-line no-useless-catch\n try {\n // race\n if (this.options.onConflict) {\n FunctionExt.call(this.options.onConflict, this, name);\n }\n throw new Error(`${StringExt.upperFirst(this.options.type)} with name '${name}' already registered.`);\n }\n catch (err) {\n throw err;\n }\n }\n onNotFound(name, prefix) {\n throw new Error(this.getSpellingSuggestion(name, prefix));\n }\n getSpellingSuggestion(name, prefix) {\n const suggestion = this.getSpellingSuggestionForName(name);\n const prefixed = prefix\n ? `${prefix} ${StringExt.lowerFirst(this.options.type)}`\n : this.options.type;\n return (\n // eslint-disable-next-line\n `${StringExt.upperFirst(prefixed)} with name '${name}' does not exist.${suggestion ? ` Did you mean '${suggestion}'?` : ''}`);\n }\n getSpellingSuggestionForName(name) {\n return StringExt.getSpellingSuggestion(name, Object.keys(this.data), (candidate) => candidate);\n }\n}\n(function (Registry) {\n function create(options) {\n return new Registry(options);\n }\n Registry.create = create;\n})(Registry || (Registry = {}));\n//# sourceMappingURL=registry.js.map","export const raw = {\n xlinkHref: 'xlink:href',\n xlinkShow: 'xlink:show',\n xlinkRole: 'xlink:role',\n xlinkType: 'xlink:type',\n xlinkArcrole: 'xlink:arcrole',\n xlinkTitle: 'xlink:title',\n xlinkActuate: 'xlink:actuate',\n xmlSpace: 'xml:space',\n xmlBase: 'xml:base',\n xmlLang: 'xml:lang',\n preserveAspectRatio: 'preserveAspectRatio',\n requiredExtension: 'requiredExtension',\n requiredFeatures: 'requiredFeatures',\n systemLanguage: 'systemLanguage',\n externalResourcesRequired: 'externalResourceRequired',\n};\n//# sourceMappingURL=raw.js.map","import { Point, Path, Polyline } from '../../geometry';\nimport { NumberExt, FunctionExt } from '../../util';\nexport const ref = {\n// We do not set `ref` attribute directly on an element.\n// The attribute itself does not qualify for relative positioning.\n};\n// if `refX` is in [0, 1] then `refX` is a fraction of bounding box width\n// if `refX` is < 0 then `refX`'s absolute values is the right coordinate of the bounding box\n// otherwise, `refX` is the left coordinate of the bounding box\nexport const refX = {\n position: positionWrapper('x', 'width', 'origin'),\n};\nexport const refY = {\n position: positionWrapper('y', 'height', 'origin'),\n};\n// `ref-dx` and `ref-dy` define the offset of the subelement relative to the right and/or bottom\n// coordinate of the reference element.\nexport const refDx = {\n position: positionWrapper('x', 'width', 'corner'),\n};\nexport const refDy = {\n position: positionWrapper('y', 'height', 'corner'),\n};\n// 'ref-width'/'ref-height' defines the width/height of the subelement relatively to\n// the reference element size\n// val in 0..1 ref-width = 0.75 sets the width to 75% of the ref. el. width\n// val < 0 || val > 1 ref-height = -20 sets the height to the ref. el. height shorter by 20\nexport const refWidth = {\n set: setWrapper('width', 'width'),\n};\nexport const refHeight = {\n set: setWrapper('height', 'height'),\n};\nexport const refRx = {\n set: setWrapper('rx', 'width'),\n};\nexport const refRy = {\n set: setWrapper('ry', 'height'),\n};\nexport const refRInscribed = {\n set: ((attrName) => {\n const widthFn = setWrapper(attrName, 'width');\n const heightFn = setWrapper(attrName, 'height');\n return function (value, options) {\n const refBBox = options.refBBox;\n const fn = refBBox.height > refBBox.width ? widthFn : heightFn;\n return FunctionExt.call(fn, this, value, options);\n };\n })('r'),\n};\nexport const refRCircumscribed = {\n set(val, { refBBox }) {\n let value = parseFloat(val);\n const percentage = NumberExt.isPercentage(val);\n if (percentage) {\n value /= 100;\n }\n const diagonalLength = Math.sqrt(refBBox.height * refBBox.height + refBBox.width * refBBox.width);\n let rValue;\n if (Number.isFinite(value)) {\n if (percentage || (value >= 0 && value <= 1)) {\n rValue = value * diagonalLength;\n }\n else {\n rValue = Math.max(value + diagonalLength, 0);\n }\n }\n return { r: rValue };\n },\n};\nexport const refCx = {\n set: setWrapper('cx', 'width'),\n};\nexport const refCy = {\n set: setWrapper('cy', 'height'),\n};\nexport const refDResetOffset = {\n set: dWrapper({ resetOffset: true }),\n};\nexport const refDKeepOffset = {\n set: dWrapper({ resetOffset: false }),\n};\nexport const refPointsResetOffset = {\n set: pointsWrapper({ resetOffset: true }),\n};\nexport const refPointsKeepOffset = {\n set: pointsWrapper({ resetOffset: false }),\n};\n// aliases\n// -------\nexport const refR = refRInscribed;\nexport const refD = refDResetOffset;\nexport const refPoints = refPointsResetOffset;\n// Allows to combine both absolute and relative positioning\n// refX: 50%, refX2: 20\nexport const refX2 = refX;\nexport const refY2 = refY;\nexport const refWidth2 = refWidth;\nexport const refHeight2 = refHeight;\n// utils\n// -----\nfunction positionWrapper(axis, dimension, origin) {\n return (val, { refBBox }) => {\n if (val == null) {\n return null;\n }\n let value = parseFloat(val);\n const percentage = NumberExt.isPercentage(val);\n if (percentage) {\n value /= 100;\n }\n let delta;\n if (Number.isFinite(value)) {\n const refOrigin = refBBox[origin];\n if (percentage || (value > 0 && value < 1)) {\n delta = refOrigin[axis] + refBBox[dimension] * value;\n }\n else {\n delta = refOrigin[axis] + value;\n }\n }\n const point = new Point();\n point[axis] = delta || 0;\n return point;\n };\n}\nfunction setWrapper(attrName, dimension) {\n return function (val, { refBBox }) {\n let value = parseFloat(val);\n const percentage = NumberExt.isPercentage(val);\n if (percentage) {\n value /= 100;\n }\n const attrs = {};\n if (Number.isFinite(value)) {\n const attrValue = percentage || (value >= 0 && value <= 1)\n ? value * refBBox[dimension]\n : Math.max(value + refBBox[dimension], 0);\n attrs[attrName] = attrValue;\n }\n return attrs;\n };\n}\nfunction shapeWrapper(shapeConstructor, options) {\n const cacheName = 'x6-shape';\n const resetOffset = options && options.resetOffset;\n return function (value, { view, elem, refBBox }) {\n const $elem = view.$(elem);\n let cache = $elem.data(cacheName);\n if (!cache || cache.value !== value) {\n // only recalculate if value has changed\n const cachedShape = shapeConstructor(value);\n cache = {\n value,\n shape: cachedShape,\n shapeBBox: cachedShape.bbox(),\n };\n $elem.data(cacheName, cache);\n }\n const shape = cache.shape.clone();\n const shapeBBox = cache.shapeBBox.clone();\n const shapeOrigin = shapeBBox.getOrigin();\n const refOrigin = refBBox.getOrigin();\n shapeBBox.x = refOrigin.x;\n shapeBBox.y = refOrigin.y;\n const fitScale = refBBox.getMaxScaleToFit(shapeBBox, refOrigin);\n // `maxRectScaleToFit` can give Infinity if width or height is 0\n const sx = shapeBBox.width === 0 || refBBox.width === 0 ? 1 : fitScale.sx;\n const sy = shapeBBox.height === 0 || refBBox.height === 0 ? 1 : fitScale.sy;\n shape.scale(sx, sy, shapeOrigin);\n if (resetOffset) {\n shape.translate(-shapeOrigin.x, -shapeOrigin.y);\n }\n return shape;\n };\n}\n// `d` attribute for SVGPaths\nfunction dWrapper(options) {\n function pathConstructor(value) {\n return Path.parse(value);\n }\n const shape = shapeWrapper(pathConstructor, options);\n return (value, args) => {\n const path = shape(value, args);\n return {\n d: path.serialize(),\n };\n };\n}\n// `points` attribute for SVGPolylines and SVGPolygons\nfunction pointsWrapper(options) {\n const shape = shapeWrapper((points) => new Polyline(points), options);\n return (value, args) => {\n const polyline = shape(value, args);\n return {\n points: polyline.serialize(),\n };\n };\n}\n//# sourceMappingURL=ref.js.map","import { ObjectExt } from '../../util';\nexport const fill = {\n qualify: ObjectExt.isPlainObject,\n set(fill, { view }) {\n return `url(#${view.graph.defineGradient(fill)})`;\n },\n};\n//# sourceMappingURL=fill.js.map","import { ObjectExt } from '../../util';\nexport const stroke = {\n qualify: ObjectExt.isPlainObject,\n set(stroke, { view }) {\n const cell = view.cell;\n const options = Object.assign({}, stroke);\n if (cell.isEdge() && options.type === 'linearGradient') {\n const edgeView = view;\n const source = edgeView.sourcePoint;\n const target = edgeView.targetPoint;\n options.id = `gradient-${options.type}-${cell.id}`;\n options.attrs = Object.assign(Object.assign({}, options.attrs), { x1: source.x, y1: source.y, x2: target.x, y2: target.y, gradientUnits: 'userSpaceOnUse' });\n view.graph.defs.remove(options.id);\n }\n return `url(#${view.graph.defineGradient(options)})`;\n },\n};\n//# sourceMappingURL=stroke.js.map","import { ObjectExt, NumberExt, Dom, FunctionExt, } from '../../util';\nexport const text = {\n qualify(text, { attrs }) {\n return attrs.textWrap == null || !ObjectExt.isPlainObject(attrs.textWrap);\n },\n set(text, { view, elem, attrs }) {\n const cacheName = 'x6-text';\n const $elem = view.$(elem);\n const cache = $elem.data(cacheName);\n const json = (str) => {\n try {\n return JSON.parse(str);\n }\n catch (error) {\n return str;\n }\n };\n const options = {\n x: attrs.x,\n eol: attrs.eol,\n annotations: json(attrs.annotations),\n textPath: json(attrs['text-path'] || attrs.textPath),\n textVerticalAnchor: (attrs['text-vertical-anchor'] ||\n attrs.textVerticalAnchor),\n displayEmpty: (attrs['display-empty'] || attrs.displayEmpty) === 'true',\n lineHeight: (attrs['line-height'] || attrs.lineHeight),\n };\n const fontSize = (attrs['font-size'] || attrs.fontSize);\n const textHash = JSON.stringify([text, options]);\n if (fontSize) {\n elem.setAttribute('font-size', fontSize);\n }\n // Updates the text only if there was a change in the string\n // or any of its attributes.\n if (cache == null || cache !== textHash) {\n // Text Along Path Selector\n const textPath = options.textPath;\n if (textPath != null && typeof textPath === 'object') {\n const selector = textPath.selector;\n if (typeof selector === 'string') {\n const pathNode = view.find(selector)[0];\n if (pathNode instanceof SVGPathElement) {\n Dom.ensureId(pathNode);\n options.textPath = Object.assign({ 'xlink:href': `#${pathNode.id}` }, textPath);\n }\n }\n }\n Dom.text(elem, `${text}`, options);\n $elem.data(cacheName, textHash);\n }\n },\n};\nexport const textWrap = {\n qualify: ObjectExt.isPlainObject,\n set(val, { view, elem, attrs, refBBox }) {\n const info = val;\n // option `width`\n const width = info.width || 0;\n if (NumberExt.isPercentage(width)) {\n refBBox.width *= parseFloat(width) / 100;\n }\n else if (width <= 0) {\n refBBox.width += width;\n }\n else {\n refBBox.width = width;\n }\n // option `height`\n const height = info.height || 0;\n if (NumberExt.isPercentage(height)) {\n refBBox.height *= parseFloat(height) / 100;\n }\n else if (height <= 0) {\n refBBox.height += height;\n }\n else {\n refBBox.height = height;\n }\n // option `text`\n let wrappedText;\n let txt = info.text;\n if (txt == null) {\n txt = attrs.text;\n }\n if (txt != null) {\n wrappedText = Dom.breakText(`${txt}`, refBBox, {\n 'font-weight': attrs['font-weight'] || attrs.fontWeight,\n 'font-size': attrs['font-size'] || attrs.fontSize,\n 'font-family': attrs['font-family'] || attrs.fontFamily,\n lineHeight: attrs.lineHeight,\n }, {\n svgDocument: view.graph.view.svg,\n ellipsis: info.ellipsis,\n hyphen: info.hyphen,\n breakWord: info.breakWord,\n });\n }\n else {\n wrappedText = '';\n }\n FunctionExt.call(text.set, this, wrappedText, {\n view,\n elem,\n attrs,\n refBBox,\n cell: view.cell,\n });\n },\n};\nconst isTextInUse = (val, { attrs }) => {\n return attrs.text !== undefined;\n};\nexport const lineHeight = {\n qualify: isTextInUse,\n};\nexport const textVerticalAnchor = {\n qualify: isTextInUse,\n};\nexport const textPath = {\n qualify: isTextInUse,\n};\nexport const annotations = {\n qualify: isTextInUse,\n};\nexport const eol = {\n qualify: isTextInUse,\n};\nexport const displayEmpty = {\n qualify: isTextInUse,\n};\n//# sourceMappingURL=text.js.map","export const title = {\n qualify(title, { elem }) {\n // HTMLElement title is specified via an attribute (i.e. not an element)\n return elem instanceof SVGElement;\n },\n set(val, { view, elem }) {\n const cacheName = 'x6-title';\n const title = `${val}`;\n const $elem = view.$(elem);\n const cache = $elem.data(cacheName);\n if (cache == null || cache !== title) {\n $elem.data(cacheName, title);\n // Generally SVGTitleElement should be the first child\n // element of its parent.\n const firstChild = elem.firstChild;\n if (firstChild && firstChild.tagName.toUpperCase() === 'TITLE') {\n // Update an existing title\n const titleElem = firstChild;\n titleElem.textContent = title;\n }\n else {\n // Create a new title\n const titleNode = document.createElementNS(elem.namespaceURI, 'title');\n titleNode.textContent = title;\n elem.insertBefore(titleNode, firstChild);\n }\n }\n },\n};\n//# sourceMappingURL=title.js.map","import { NumberExt } from '../../util';\nimport { Point } from '../../geometry';\n// `x-align` when set to `middle` causes centering of the subelement around its new x coordinate.\n// `x-align` when set to `right` uses the x coordinate as referenced to the right of the bbox.\nexport const xAlign = {\n offset: offsetWrapper('x', 'width', 'right'),\n};\n// `y-align` when set to `middle` causes centering of the subelement around its new y coordinate.\n// `y-align` when set to `bottom` uses the y coordinate as referenced to the bottom of the bbox.\nexport const yAlign = {\n offset: offsetWrapper('y', 'height', 'bottom'),\n};\nexport const resetOffset = {\n offset(val, { refBBox }) {\n return val ? { x: -refBBox.x, y: -refBBox.y } : { x: 0, y: 0 };\n },\n};\nfunction offsetWrapper(axis, dimension, corner) {\n return (value, { refBBox }) => {\n const point = new Point();\n let delta;\n if (value === 'middle') {\n delta = refBBox[dimension] / 2;\n }\n else if (value === corner) {\n delta = refBBox[dimension];\n }\n else if (typeof value === 'number' && Number.isFinite(value)) {\n delta = value > -1 && value < 1 ? -refBBox[dimension] * value : -value;\n }\n else if (NumberExt.isPercentage(value)) {\n delta = (refBBox[dimension] * parseFloat(value)) / 100;\n }\n else {\n delta = 0;\n }\n point[axis] = -(refBBox[axis] + delta);\n return point;\n };\n}\n//# sourceMappingURL=align.js.map","import { ObjectExt } from '../../util';\nexport const style = {\n qualify: ObjectExt.isPlainObject,\n set(styles, { view, elem }) {\n view.$(elem).css(styles);\n },\n};\n//# sourceMappingURL=style.js.map","export const html = {\n set(html, { view, elem }) {\n view.$(elem).html(`${html}`);\n },\n};\n//# sourceMappingURL=html.js.map","import { ObjectExt } from '../../util';\nexport const filter = {\n qualify: ObjectExt.isPlainObject,\n set(filter, { view }) {\n return `url(#${view.graph.defineFilter(filter)})`;\n },\n};\n//# sourceMappingURL=filter.js.map","export const port = {\n set(port) {\n if (port != null && typeof port === 'object' && port.id) {\n return port.id;\n }\n return port;\n },\n};\n//# sourceMappingURL=port.js.map","import { Path } from '../../geometry';\nexport function normalize(d, offset1, offset2) {\n let offsetX;\n let offsetY;\n if (typeof offset1 === 'object') {\n offsetX = offset1.x;\n offsetY = offset1.y;\n }\n else {\n offsetX = offset1;\n offsetY = offset2;\n }\n const path = Path.parse(d);\n const bbox = path.bbox();\n if (bbox) {\n let ty = -bbox.height / 2 - bbox.y;\n let tx = -bbox.width / 2 - bbox.x;\n if (typeof offsetX === 'number') {\n tx -= offsetX;\n }\n if (typeof offsetY === 'number') {\n ty -= offsetY;\n }\n path.translate(tx, ty);\n }\n return path.serialize();\n}\n//# sourceMappingURL=util.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Path } from '../../geometry';\nimport { NumberExt } from '../../util';\nimport { normalize } from './util';\nexport const block = (_a) => {\n var { size, width, height, offset, open } = _a, attrs = __rest(_a, [\"size\", \"width\", \"height\", \"offset\", \"open\"]);\n return createClassicMarker({ size, width, height, offset }, open === true, true, undefined, attrs);\n};\nexport const classic = (_a) => {\n var { size, width, height, offset, factor } = _a, attrs = __rest(_a, [\"size\", \"width\", \"height\", \"offset\", \"factor\"]);\n return createClassicMarker({ size, width, height, offset }, false, false, factor, attrs);\n};\nfunction createClassicMarker(options, open, full, factor = 3 / 4, attrs = {}) {\n const size = options.size || 10;\n const width = options.width || size;\n const height = options.height || size;\n const path = new Path();\n const localAttrs = {};\n if (open) {\n path\n .moveTo(width, 0)\n .lineTo(0, height / 2)\n .lineTo(width, height);\n localAttrs.fill = 'none';\n }\n else {\n path.moveTo(0, height / 2);\n path.lineTo(width, 0);\n if (!full) {\n const f = NumberExt.clamp(factor, 0, 1);\n path.lineTo(width * f, height / 2);\n }\n path.lineTo(width, height);\n path.close();\n }\n return Object.assign(Object.assign(Object.assign({}, localAttrs), attrs), { tagName: 'path', d: normalize(path.serialize(), {\n x: options.offset != null ? options.offset : -width / 2,\n }) });\n}\n//# sourceMappingURL=classic.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Path } from '../../geometry';\nimport { normalize } from './util';\nexport const diamond = (_a) => {\n var { size, width, height, offset } = _a, attrs = __rest(_a, [\"size\", \"width\", \"height\", \"offset\"]);\n const s = size || 10;\n const w = width || s;\n const h = height || s;\n const path = new Path();\n path\n .moveTo(0, h / 2)\n .lineTo(w / 2, 0)\n .lineTo(w, h / 2)\n .lineTo(w / 2, h)\n .close();\n return Object.assign(Object.assign({}, attrs), { tagName: 'path', d: normalize(path.serialize(), offset == null ? -w / 2 : offset) });\n};\n//# sourceMappingURL=diamond.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { normalize } from './util';\nexport const path = (_a) => {\n var { d, offsetX, offsetY } = _a, attrs = __rest(_a, [\"d\", \"offsetX\", \"offsetY\"]);\n return Object.assign(Object.assign({}, attrs), { tagName: 'path', d: normalize(d, offsetX, offsetY) });\n};\n//# sourceMappingURL=path.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Path } from '../../geometry';\nimport { normalize } from './util';\nexport const cross = (_a) => {\n var { size, width, height, offset } = _a, attrs = __rest(_a, [\"size\", \"width\", \"height\", \"offset\"]);\n const s = size || 10;\n const w = width || s;\n const h = height || s;\n const path = new Path();\n path.moveTo(0, 0).lineTo(w, h).moveTo(0, h).lineTo(w, 0);\n return Object.assign(Object.assign({}, attrs), { tagName: 'path', fill: 'none', d: normalize(path.serialize(), offset || -w / 2) });\n};\n//# sourceMappingURL=cross.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Path } from '../../geometry';\nimport { normalize } from './util';\nexport const async = (_a) => {\n var { width, height, offset, open, flip } = _a, attrs = __rest(_a, [\"width\", \"height\", \"offset\", \"open\", \"flip\"]);\n let h = height || 6;\n const w = width || 10;\n const opened = open === true;\n const fliped = flip === true;\n const result = Object.assign(Object.assign({}, attrs), { tagName: 'path' });\n if (fliped) {\n h = -h;\n }\n const path = new Path();\n path.moveTo(0, h).lineTo(w, 0);\n if (!opened) {\n path.lineTo(w, h);\n path.close();\n }\n else {\n result.fill = 'none';\n }\n result.d = normalize(path.serialize(), {\n x: offset || -w / 2,\n y: h / 2,\n });\n return result;\n};\n//# sourceMappingURL=async.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Path } from '../../geometry';\nimport { normalize } from './util';\nexport const circle = (_a) => {\n var { r } = _a, attrs = __rest(_a, [\"r\"]);\n const radius = r || 5;\n return Object.assign(Object.assign({ cx: radius }, attrs), { tagName: 'circle', r: radius });\n};\nexport const circlePlus = (_a) => {\n var { r } = _a, attrs = __rest(_a, [\"r\"]);\n const radius = r || 5;\n const path = new Path();\n path.moveTo(radius, 0).lineTo(radius, radius * 2);\n path.moveTo(0, radius).lineTo(radius * 2, radius);\n return {\n children: [\n Object.assign(Object.assign({}, circle({ r: radius })), { fill: 'none' }),\n Object.assign(Object.assign({}, attrs), { tagName: 'path', d: normalize(path.serialize(), -radius) }),\n ],\n };\n};\n//# sourceMappingURL=circle.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nexport const ellipse = (_a) => {\n var { rx, ry } = _a, attrs = __rest(_a, [\"rx\", \"ry\"]);\n const radiusX = rx || 5;\n const radiusy = ry || 5;\n return Object.assign(Object.assign({ cx: radiusX }, attrs), { tagName: 'ellipse', rx: radiusX, ry: radiusy });\n};\n//# sourceMappingURL=ellipse.js.map","import { Registry } from '../registry';\nimport * as markers from './main';\nimport { normalize as normalizeMarker } from './util';\nexport var Marker;\n(function (Marker) {\n Marker.presets = markers;\n Marker.registry = Registry.create({\n type: 'marker',\n });\n Marker.registry.register(Marker.presets, true);\n})(Marker || (Marker = {}));\n(function (Marker) {\n Marker.normalize = normalizeMarker;\n})(Marker || (Marker = {}));\n//# sourceMappingURL=index.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt } from '../../util';\nimport { Marker } from '../marker';\nfunction qualify(value) {\n return typeof value === 'string' || ObjectExt.isPlainObject(value);\n}\nexport const sourceMarker = {\n qualify,\n set(marker, { view, attrs }) {\n return createMarker('marker-start', marker, view, attrs);\n },\n};\nexport const targetMarker = {\n qualify,\n set(marker, { view, attrs }) {\n return createMarker('marker-end', marker, view, attrs, {\n transform: 'rotate(180)',\n });\n },\n};\nexport const vertexMarker = {\n qualify,\n set(marker, { view, attrs }) {\n return createMarker('marker-mid', marker, view, attrs);\n },\n};\nfunction createMarker(type, marker, view, attrs, manual = {}) {\n const def = typeof marker === 'string' ? { name: marker } : marker;\n const { name, args } = def, others = __rest(def, [\"name\", \"args\"]);\n let preset = others;\n if (name && typeof name === 'string') {\n const fn = Marker.registry.get(name);\n if (fn) {\n preset = fn(Object.assign(Object.assign({}, others), args));\n }\n else {\n return Marker.registry.onNotFound(name);\n }\n }\n const options = Object.assign(Object.assign(Object.assign({}, normalizeAttr(attrs, type)), manual), preset);\n return {\n [type]: `url(#${view.graph.defineMarker(options)})`,\n };\n}\nfunction normalizeAttr(attr, type) {\n const result = {};\n // The context 'fill' is disregared here. The usual case is to use the\n // marker with a connection(for which 'fill' attribute is set to 'none').\n const stroke = attr.stroke;\n if (typeof stroke === 'string') {\n result.stroke = stroke;\n result.fill = stroke;\n }\n // Again the context 'fill-opacity' is ignored.\n let strokeOpacity = attr.strokeOpacity;\n if (strokeOpacity == null) {\n strokeOpacity = attr['stroke-opacity'];\n }\n if (strokeOpacity == null) {\n strokeOpacity = attr.opacity;\n }\n if (strokeOpacity != null) {\n result['stroke-opacity'] = strokeOpacity;\n result['fill-opacity'] = strokeOpacity;\n }\n if (type !== 'marker-mid') {\n const strokeWidth = parseFloat((attr.strokeWidth || attr['stroke-width']));\n if (Number.isFinite(strokeWidth) && strokeWidth > 1) {\n const offset = Math.ceil(strokeWidth / 2);\n result.refX = type === 'marker-start' ? offset : -offset;\n }\n }\n return result;\n}\n//# sourceMappingURL=marker.js.map","const isEdgeView = (val, { view }) => {\n return view.cell.isEdge();\n};\nexport const connection = {\n qualify: isEdgeView,\n set(val, args) {\n const view = args.view;\n const stubs = (val.stubs || 0);\n let d;\n if (Number.isFinite(stubs) && stubs !== 0) {\n let offset;\n if (stubs < 0) {\n const len = view.getConnectionLength() || 0;\n offset = (len + stubs) / 2;\n }\n else {\n offset = stubs;\n }\n const path = view.getConnection();\n if (path) {\n const sourceParts = path.divideAtLength(offset);\n const targetParts = path.divideAtLength(-offset);\n if (sourceParts && targetParts) {\n d = `${sourceParts[0].serialize()} ${targetParts[1].serialize()}`;\n }\n }\n }\n return { d: d || view.getConnectionPathData() };\n },\n};\nexport const atConnectionLengthKeepGradient = {\n qualify: isEdgeView,\n set: atConnectionWrapper('getTangentAtLength', { rotate: true }),\n};\nexport const atConnectionLengthIgnoreGradient = {\n qualify: isEdgeView,\n set: atConnectionWrapper('getTangentAtLength', { rotate: false }),\n};\nexport const atConnectionRatioKeepGradient = {\n qualify: isEdgeView,\n set: atConnectionWrapper('getTangentAtRatio', { rotate: true }),\n};\nexport const atConnectionRatioIgnoreGradient = {\n qualify: isEdgeView,\n set: atConnectionWrapper('getTangentAtRatio', { rotate: false }),\n};\n// aliases\n// -------\nexport const atConnectionLength = atConnectionLengthKeepGradient;\nexport const atConnectionRatio = atConnectionRatioKeepGradient;\n// utils\n// -----\nfunction atConnectionWrapper(method, options) {\n const zeroVector = { x: 1, y: 0 };\n return (value, args) => {\n let p;\n let angle;\n const view = args.view;\n const tangent = view[method](Number(value));\n if (tangent) {\n angle = options.rotate ? tangent.vector().vectorAngle(zeroVector) : 0;\n p = tangent.start;\n }\n else {\n p = view.path.start;\n angle = 0;\n }\n if (angle === 0) {\n return { transform: `translate(${p.x},${p.y}')` };\n }\n return {\n transform: `translate(${p.x},${p.y}') rotate(${angle})`,\n };\n };\n}\n//# sourceMappingURL=connection.js.map","import { FunctionExt } from '../../util';\nimport { Registry } from '../registry';\nimport { raw } from './raw';\nimport * as attrs from './main';\nexport var Attr;\n(function (Attr) {\n function isValidDefinition(def, val, options) {\n if (def != null) {\n if (typeof def === 'string') {\n return true;\n }\n if (typeof def.qualify !== 'function' ||\n FunctionExt.call(def.qualify, this, val, options)) {\n return true;\n }\n }\n return false;\n }\n Attr.isValidDefinition = isValidDefinition;\n})(Attr || (Attr = {}));\n(function (Attr) {\n Attr.presets = Object.assign(Object.assign({}, raw), attrs);\n Attr.registry = Registry.create({\n type: 'attribute definition',\n });\n Attr.registry.register(Attr.presets, true);\n})(Attr || (Attr = {}));\n//# sourceMappingURL=index.js.map","import { Dom } from '../../util';\nexport const dot = {\n color: '#aaaaaa',\n thickness: 1,\n markup: 'rect',\n update(elem, options) {\n const width = options.thickness * options.sx;\n const height = options.thickness * options.sy;\n Dom.attr(elem, {\n width,\n height,\n rx: width,\n ry: height,\n fill: options.color,\n });\n },\n};\n//# sourceMappingURL=dot.js.map","import { Dom } from '../../util';\nexport const fixedDot = {\n color: '#aaaaaa',\n thickness: 1,\n markup: 'rect',\n update(elem, options) {\n const size = options.sx <= 1 ? options.thickness * options.sx : options.thickness;\n Dom.attr(elem, {\n width: size,\n height: size,\n rx: size,\n ry: size,\n fill: options.color,\n });\n },\n};\n//# sourceMappingURL=fixed-dot.js.map","import { Dom } from '../../util';\nexport const mesh = {\n color: 'rgba(224,224,224,1)',\n thickness: 1,\n markup: 'path',\n update(elem, options) {\n let d;\n const width = options.width;\n const height = options.height;\n const thickness = options.thickness;\n if (width - thickness >= 0 && height - thickness >= 0) {\n d = ['M', width, 0, 'H0 M0 0 V0', height].join(' ');\n }\n else {\n d = 'M 0 0 0 0';\n }\n Dom.attr(elem, {\n d,\n stroke: options.color,\n 'stroke-width': options.thickness,\n });\n },\n};\n//# sourceMappingURL=mesh.js.map","import { Dom } from '../../util';\nexport const doubleMesh = [\n {\n color: 'rgba(224,224,224,1)',\n thickness: 1,\n markup: 'path',\n update(elem, options) {\n let d;\n const width = options.width;\n const height = options.height;\n const thickness = options.thickness;\n if (width - thickness >= 0 && height - thickness >= 0) {\n d = ['M', width, 0, 'H0 M0 0 V0', height].join(' ');\n }\n else {\n d = 'M 0 0 0 0';\n }\n Dom.attr(elem, {\n d,\n stroke: options.color,\n 'stroke-width': options.thickness,\n });\n },\n },\n {\n color: 'rgba(224,224,224,0.2)',\n thickness: 3,\n factor: 4,\n markup: 'path',\n update(elem, options) {\n let d;\n const factor = options.factor || 1;\n const width = options.width * factor;\n const height = options.height * factor;\n const thickness = options.thickness;\n if (width - thickness >= 0 && height - thickness >= 0) {\n d = ['M', width, 0, 'H0 M0 0 V0', height].join(' ');\n }\n else {\n d = 'M 0 0 0 0';\n }\n // update wrapper size\n options.width = width;\n options.height = height;\n Dom.attr(elem, {\n d,\n stroke: options.color,\n 'stroke-width': options.thickness,\n });\n },\n },\n];\n//# sourceMappingURL=double-mesh.js.map","import { Dom, Vector } from '../../util';\nimport { Registry } from '../registry';\nimport * as patterns from './main';\nexport class Grid {\n constructor() {\n this.patterns = {};\n this.root = Vector.create(Dom.createSvgDocument(), {\n width: '100%',\n height: '100%',\n }, [Dom.createSvgElement('defs')]).node;\n }\n add(id, elem) {\n const firstChild = this.root.childNodes[0];\n if (firstChild) {\n firstChild.appendChild(elem);\n }\n this.patterns[id] = elem;\n Vector.create('rect', {\n width: '100%',\n height: '100%',\n fill: `url(#${id})`,\n }).appendTo(this.root);\n }\n get(id) {\n return this.patterns[id];\n }\n has(id) {\n return this.patterns[id] != null;\n }\n}\n(function (Grid) {\n Grid.presets = patterns;\n Grid.registry = Registry.create({\n type: 'grid',\n });\n Grid.registry.register(Grid.presets, true);\n})(Grid || (Grid = {}));\n//# sourceMappingURL=index.js.map","export function getString(value, defaultValue) {\n return value != null ? value : defaultValue;\n}\nexport function getNumber(num, defaultValue) {\n return num != null && Number.isFinite(num) ? num : defaultValue;\n}\n//# sourceMappingURL=util.js.map","import { getString, getNumber } from './util';\nexport function outline(args = {}) {\n const color = getString(args.color, 'blue');\n const width = getNumber(args.width, 1);\n const margin = getNumber(args.margin, 2);\n const opacity = getNumber(args.opacity, 1);\n const innerRadius = margin;\n const outerRadius = margin + width;\n return `\n <filter>\n <feFlood flood-color=\"${color}\" flood-opacity=\"${opacity}\" result=\"colored\"/>\n <feMorphology in=\"SourceAlpha\" result=\"morphedOuter\" operator=\"dilate\" radius=\"${outerRadius}\" />\n <feMorphology in=\"SourceAlpha\" result=\"morphedInner\" operator=\"dilate\" radius=\"${innerRadius}\" />\n <feComposite result=\"morphedOuterColored\" in=\"colored\" in2=\"morphedOuter\" operator=\"in\"/>\n <feComposite operator=\"xor\" in=\"morphedOuterColored\" in2=\"morphedInner\" result=\"outline\"/>\n <feMerge>\n <feMergeNode in=\"outline\"/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=outline.js.map","import { getString, getNumber } from './util';\nexport function highlight(args = {}) {\n const color = getString(args.color, 'red');\n const blur = getNumber(args.blur, 0);\n const width = getNumber(args.width, 1);\n const opacity = getNumber(args.opacity, 1);\n return `\n <filter>\n <feFlood flood-color=\"${color}\" flood-opacity=\"${opacity}\" result=\"colored\"/>\n <feMorphology result=\"morphed\" in=\"SourceGraphic\" operator=\"dilate\" radius=\"${width}\"/>\n <feComposite result=\"composed\" in=\"colored\" in2=\"morphed\" operator=\"in\"/>\n <feGaussianBlur result=\"blured\" in=\"composed\" stdDeviation=\"${blur}\"/>\n <feBlend in=\"SourceGraphic\" in2=\"blured\" mode=\"normal\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=highlight.js.map","import { getNumber } from './util';\nexport function blur(args = {}) {\n const x = getNumber(args.x, 2);\n const stdDeviation = args.y != null && Number.isFinite(args.y) ? [x, args.y] : x;\n return `\n <filter>\n <feGaussianBlur stdDeviation=\"${stdDeviation}\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=blur.js.map","import { getString, getNumber } from './util';\nexport function dropShadow(args = {}) {\n const dx = getNumber(args.dx, 0);\n const dy = getNumber(args.dy, 0);\n const color = getString(args.color, 'black');\n const blur = getNumber(args.blur, 4);\n const opacity = getNumber(args.opacity, 1);\n return 'SVGFEDropShadowElement' in window\n ? `<filter>\n <feDropShadow stdDeviation=\"${blur}\" dx=\"${dx}\" dy=\"${dy}\" flood-color=\"${color}\" flood-opacity=\"${opacity}\" />\n </filter>`.trim()\n : `<filter>\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"${blur}\" />\n <feOffset dx=\"${dx}\" dy=\"${dy}\" result=\"offsetblur\" />\n <feFlood flood-color=\"${color}\" />\n <feComposite in2=\"offsetblur\" operator=\"in\" />\n <feComponentTransfer>\n <feFuncA type=\"linear\" slope=\"${opacity}\" />\n </feComponentTransfer>\n <feMerge>\n <feMergeNode/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>`.trim();\n}\n//# sourceMappingURL=drop-shadow.js.map","import { getNumber } from './util';\nexport function grayScale(args = {}) {\n const amount = getNumber(args.amount, 1);\n const a = 0.2126 + 0.7874 * (1 - amount);\n const b = 0.7152 - 0.7152 * (1 - amount);\n const c = 0.0722 - 0.0722 * (1 - amount);\n const d = 0.2126 - 0.2126 * (1 - amount);\n const e = 0.7152 + 0.2848 * (1 - amount);\n const f = 0.0722 - 0.0722 * (1 - amount);\n const g = 0.2126 - 0.2126 * (1 - amount);\n const h = 0.0722 + 0.9278 * (1 - amount);\n return `\n <filter>\n <feColorMatrix type=\"matrix\" values=\"${a} ${b} ${c} 0 0 ${d} ${e} ${f} 0 0 ${g} ${b} ${h} 0 0 0 0 0 1 0\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=gray-scale.js.map","import { getNumber } from './util';\nexport function sepia(args = {}) {\n const amount = getNumber(args.amount, 1);\n const a = 0.393 + 0.607 * (1 - amount);\n const b = 0.769 - 0.769 * (1 - amount);\n const c = 0.189 - 0.189 * (1 - amount);\n const d = 0.349 - 0.349 * (1 - amount);\n const e = 0.686 + 0.314 * (1 - amount);\n const f = 0.168 - 0.168 * (1 - amount);\n const g = 0.272 - 0.272 * (1 - amount);\n const h = 0.534 - 0.534 * (1 - amount);\n const i = 0.131 + 0.869 * (1 - amount);\n return `\n <filter>\n <feColorMatrix type=\"matrix\" values=\"${a} ${b} ${c} 0 0 ${d} ${e} ${f} 0 0 ${g} ${h} ${i} 0 0 0 0 0 1 0\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=sepia.js.map","import { getNumber } from './util';\nexport function saturate(args = {}) {\n const amount = getNumber(args.amount, 1);\n return `\n <filter>\n <feColorMatrix type=\"saturate\" values=\"${1 - amount}\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=saturate.js.map","import { getNumber } from './util';\nexport function hueRotate(args = {}) {\n const angle = getNumber(args.angle, 0);\n return `\n <filter>\n <feColorMatrix type=\"hueRotate\" values=\"${angle}\"/>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=hue-rotate.js.map","import { getNumber } from './util';\nexport function invert(args = {}) {\n const amount = getNumber(args.amount, 1);\n const amount2 = 1 - amount;\n return `\n <filter>\n <feComponentTransfer>\n <feFuncR type=\"table\" tableValues=\"${amount} ${amount2}\"/>\n <feFuncG type=\"table\" tableValues=\"${amount} ${amount2}\"/>\n <feFuncB type=\"table\" tableValues=\"${amount} ${amount2}\"/>\n </feComponentTransfer>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=invert.js.map","import { getNumber } from './util';\nexport function brightness(args = {}) {\n const amount = getNumber(args.amount, 1);\n return `\n <filter>\n <feComponentTransfer>\n <feFuncR type=\"linear\" slope=\"${amount}\"/>\n <feFuncG type=\"linear\" slope=\"${amount}\"/>\n <feFuncB type=\"linear\" slope=\"${amount}\"/>\n </feComponentTransfer>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=brightness.js.map","import { getNumber } from './util';\nexport function contrast(args = {}) {\n const amount = getNumber(args.amount, 1);\n const amount2 = 0.5 - amount / 2;\n return `\n <filter>\n <feComponentTransfer>\n <feFuncR type=\"linear\" slope=\"${amount}\" intercept=\"${amount2}\"/>\n <feFuncG type=\"linear\" slope=\"${amount}\" intercept=\"${amount2}\"/>\n <feFuncB type=\"linear\" slope=\"${amount}\" intercept=\"${amount2}\"/>\n </feComponentTransfer>\n </filter>\n `.trim();\n}\n//# sourceMappingURL=contrast.js.map","import { Registry } from '../registry';\nimport * as filters from './main';\nexport var Filter;\n(function (Filter) {\n Filter.presets = filters;\n Filter.registry = Registry.create({\n type: 'filter',\n });\n Filter.registry.register(Filter.presets, true);\n})(Filter || (Filter = {}));\n//# sourceMappingURL=index.js.map","export const flipX = function (img) {\n // d b\n // d b\n const canvas = document.createElement('canvas');\n const width = img.width;\n const height = img.height;\n canvas.width = width * 2;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n // left image\n ctx.drawImage(img, 0, 0, width, height);\n // flipped right image\n ctx.translate(2 * width, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n};\n//# sourceMappingURL=flip-x.js.map","export const flipY = function (img) {\n // d d\n // q q\n const canvas = document.createElement('canvas');\n const width = img.width;\n const height = img.height;\n canvas.width = width;\n canvas.height = height * 2;\n const ctx = canvas.getContext('2d');\n // top image\n ctx.drawImage(img, 0, 0, width, height);\n // flipped bottom image\n ctx.translate(0, 2 * height);\n ctx.scale(1, -1);\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n};\n//# sourceMappingURL=flip-y.js.map","export const flipXY = function (img) {\n // d b\n // q p\n const canvas = document.createElement('canvas');\n const width = img.width;\n const height = img.height;\n canvas.width = 2 * width;\n canvas.height = 2 * height;\n const ctx = canvas.getContext('2d');\n // top-left image\n ctx.drawImage(img, 0, 0, width, height);\n // xy-flipped bottom-right image\n ctx.setTransform(-1, 0, 0, -1, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, width, height);\n // x-flipped top-right image\n ctx.setTransform(-1, 0, 0, 1, canvas.width, 0);\n ctx.drawImage(img, 0, 0, width, height);\n // y-flipped bottom-left image\n ctx.setTransform(1, 0, 0, -1, 0, canvas.height);\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n};\n//# sourceMappingURL=flip-xy.js.map","import { Angle } from '../../geometry';\nexport const watermark = function (img, options) {\n const width = img.width;\n const height = img.height;\n const canvas = document.createElement('canvas');\n canvas.width = width * 3;\n canvas.height = height * 3;\n const ctx = canvas.getContext('2d');\n const angle = options.angle != null ? -options.angle : -20;\n const radians = Angle.toRad(angle);\n const stepX = canvas.width / 4;\n const stepY = canvas.height / 4;\n for (let i = 0; i < 4; i += 1) {\n for (let j = 0; j < 4; j += 1) {\n if ((i + j) % 2 > 0) {\n ctx.setTransform(1, 0, 0, 1, (2 * i - 1) * stepX, (2 * j - 1) * stepY);\n ctx.rotate(radians);\n ctx.drawImage(img, -width / 2, -height / 2, width, height);\n }\n }\n }\n return canvas;\n};\n//# sourceMappingURL=watermark.js.map","import { Registry } from '../registry';\nimport * as patterns from './main';\nexport var Background;\n(function (Background) {\n Background.presets = Object.assign({}, patterns);\n Background.presets['flip-x'] = patterns.flipX;\n Background.presets['flip-y'] = patterns.flipY;\n Background.presets['flip-xy'] = patterns.flipXY;\n Background.registry = Registry.create({\n type: 'background pattern',\n });\n Background.registry.register(Background.presets, true);\n})(Background || (Background = {}));\n//# sourceMappingURL=index.js.map","export const Config = {\n prefixCls: 'x6',\n autoInsertCSS: true,\n useCSSSelector: true,\n trackable: false,\n trackInfo: {},\n /**\n * Turn on/off collect information of user client.\n *\n * In order to serve the users better, x6 will send the URL and version\n * information back to the AntV server:https://kcart.alipay.com/web/bi.do\n *\n * Except for URL and G2 version information, no other information will\n * be collected.\n *\n * @param enabled Specifies if seed client information to AntV server.\n */\n track(enabled) {\n Config.trackable = enabled;\n },\n};\n//# sourceMappingURL=config.js.map","import { snapToGrid as snap } from '../geometry/util';\nimport { normalize } from '../registry/marker/util';\nimport { Config } from './config';\nexport var Util;\n(function (Util) {\n Util.snapToGrid = snap;\n Util.normalizeMarker = normalize;\n function prefix(suffix) {\n return `${Config.prefixCls}-${suffix}`;\n }\n Util.prefix = prefix;\n})(Util || (Util = {}));\n(function (Util) {\n function makeTree(parent, options, parentNode, collector = []) {\n const children = typeof options.children === 'function'\n ? options.children(parent)\n : parent[options.children || 'children'];\n if (!parentNode) {\n parentNode = options.createNode(parent); // eslint-disable-line\n collector.push(parentNode);\n }\n if (Array.isArray(children)) {\n children.forEach((child) => {\n const node = options.createNode(child);\n const edge = options.createEdge(parentNode, node);\n collector.push(node, edge);\n this.makeTree(child, options, node, collector);\n });\n }\n return collector;\n }\n Util.makeTree = makeTree;\n})(Util || (Util = {}));\n//# sourceMappingURL=util.js.map","import { Dom } from '../../util';\nimport { Util } from '../../global';\nconst defaultClassName = Util.prefix('highlighted');\nexport const className = {\n highlight(cellView, magnet, options) {\n const cls = (options && options.className) || defaultClassName;\n Dom.addClass(magnet, cls);\n },\n unhighlight(cellView, magnet, options) {\n const cls = (options && options.className) || defaultClassName;\n Dom.removeClass(magnet, cls);\n },\n};\n//# sourceMappingURL=class.js.map","import { Dom } from '../../util';\nimport { Util } from '../../global';\nconst className = Util.prefix('highlight-opacity');\nexport const opacity = {\n highlight(cellView, magnet) {\n Dom.addClass(magnet, className);\n },\n unhighlight(cellView, magnetEl) {\n Dom.removeClass(magnetEl, className);\n },\n};\n//# sourceMappingURL=opacity.js.map","import { ObjectExt, Dom, Vector } from '../../util';\nimport { Util } from '../../global';\nconst defaultOptions = {\n padding: 3,\n rx: 0,\n ry: 0,\n attrs: {\n 'stroke-width': 3,\n stroke: '#FEB663',\n },\n};\nexport const stroke = {\n highlight(cellView, magnet, options) {\n const id = Private.getHighlighterId(magnet, options);\n if (Private.hasCache(id)) {\n return;\n }\n // eslint-disable-next-line\n options = ObjectExt.defaultsDeep({}, options, defaultOptions);\n const magnetVel = Vector.create(magnet);\n let pathData;\n let magnetBBox;\n try {\n pathData = magnetVel.toPathData();\n }\n catch (error) {\n // Failed to get path data from magnet element.\n // Draw a rectangle around the entire cell view instead.\n magnetBBox = magnetVel.bbox(true /* without transforms */);\n pathData = Dom.rectToPathData(Object.assign(Object.assign({}, options), magnetBBox));\n }\n const path = Dom.createSvgElement('path');\n Dom.attr(path, Object.assign({ d: pathData, 'pointer-events': 'none', 'vector-effect': 'non-scaling-stroke', fill: 'none' }, (options.attrs ? Dom.kebablizeAttrs(options.attrs) : null)));\n // const highlightVel = v.create('path').attr()\n if (cellView.isEdgeElement(magnet)) {\n Dom.attr(path, 'd', cellView.getConnectionPathData());\n }\n else {\n let highlightMatrix = magnetVel.getTransformToElement(cellView.container);\n // Add padding to the highlight element.\n const padding = options.padding;\n if (padding) {\n if (magnetBBox == null) {\n magnetBBox = magnetVel.bbox(true);\n }\n const cx = magnetBBox.x + magnetBBox.width / 2;\n const cy = magnetBBox.y + magnetBBox.height / 2;\n magnetBBox = Dom.transformRectangle(magnetBBox, highlightMatrix);\n const width = Math.max(magnetBBox.width, 1);\n const height = Math.max(magnetBBox.height, 1);\n const sx = (width + padding) / width;\n const sy = (height + padding) / height;\n const paddingMatrix = Dom.createSVGMatrix({\n a: sx,\n b: 0,\n c: 0,\n d: sy,\n e: cx - sx * cx,\n f: cy - sy * cy,\n });\n highlightMatrix = highlightMatrix.multiply(paddingMatrix);\n }\n Dom.transform(path, highlightMatrix);\n }\n Dom.addClass(path, Util.prefix('highlight-stroke'));\n const cell = cellView.cell;\n const removeHandler = () => Private.removeHighlighter(id);\n cell.on('removed', removeHandler);\n if (cell.model) {\n cell.model.on('reseted', removeHandler);\n }\n cellView.container.appendChild(path);\n Private.setCache(id, path);\n },\n unhighlight(cellView, magnet, opt) {\n Private.removeHighlighter(Private.getHighlighterId(magnet, opt));\n },\n};\nvar Private;\n(function (Private) {\n function getHighlighterId(magnet, options) {\n Dom.ensureId(magnet);\n return magnet.id + JSON.stringify(options);\n }\n Private.getHighlighterId = getHighlighterId;\n const cache = {};\n function setCache(id, elem) {\n cache[id] = elem;\n }\n Private.setCache = setCache;\n function hasCache(id) {\n return cache[id] != null;\n }\n Private.hasCache = hasCache;\n function removeHighlighter(id) {\n const elem = cache[id];\n if (elem) {\n Dom.remove(elem);\n delete cache[id];\n }\n }\n Private.removeHighlighter = removeHighlighter;\n})(Private || (Private = {}));\n//# sourceMappingURL=stroke.js.map","import { Registry } from '../registry';\nimport * as highlighters from './main';\nexport var Highlighter;\n(function (Highlighter) {\n function check(name, highlighter) {\n if (typeof highlighter.highlight !== 'function') {\n throw new Error(`Highlighter '${name}' is missing required \\`highlight()\\` method`);\n }\n if (typeof highlighter.unhighlight !== 'function') {\n throw new Error(`Highlighter '${name}' is missing required \\`unhighlight()\\` method`);\n }\n }\n Highlighter.check = check;\n})(Highlighter || (Highlighter = {}));\n(function (Highlighter) {\n Highlighter.presets = highlighters;\n Highlighter.registry = Registry.create({\n type: 'highlighter',\n });\n Highlighter.registry.register(Highlighter.presets, true);\n})(Highlighter || (Highlighter = {}));\n//# sourceMappingURL=index.js.map","import { NumberExt } from '../../util';\nimport { Point } from '../../geometry';\nexport function normalizePoint(bbox, args = {}) {\n return new Point(NumberExt.normalizePercentage(args.x, bbox.width), NumberExt.normalizePercentage(args.y, bbox.height));\n}\nexport function toResult(point, angle, rawArgs) {\n return Object.assign({ angle, position: point.toJSON() }, rawArgs);\n}\n//# sourceMappingURL=util.js.map","import { normalizePoint, toResult } from './util';\nexport const absolute = (portsPositionArgs, elemBBox) => {\n return portsPositionArgs.map(({ x, y, angle }) => toResult(normalizePoint(elemBBox, { x, y }), angle || 0));\n};\n//# sourceMappingURL=absolute.js.map","import { Ellipse } from '../../geometry';\nimport { toResult } from './util';\nexport const ellipse = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n const startAngle = groupPositionArgs.start || 0;\n const stepAngle = groupPositionArgs.step || 20;\n return ellipseLayout(portsPositionArgs, elemBBox, startAngle, (index, count) => (index + 0.5 - count / 2) * stepAngle);\n};\nexport const ellipseSpread = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n const startAngle = groupPositionArgs.start || 0;\n const stepAngle = groupPositionArgs.step || 360 / portsPositionArgs.length;\n return ellipseLayout(portsPositionArgs, elemBBox, startAngle, (index) => {\n return index * stepAngle;\n });\n};\nfunction ellipseLayout(portsPositionArgs, elemBBox, startAngle, stepFn) {\n const center = elemBBox.getCenter();\n const start = elemBBox.getTopCenter();\n const ratio = elemBBox.width / elemBBox.height;\n const ellipse = Ellipse.fromRect(elemBBox);\n const count = portsPositionArgs.length;\n return portsPositionArgs.map((item, index) => {\n const angle = startAngle + stepFn(index, count);\n const p = start.clone().rotate(-angle, center).scale(ratio, 1, center);\n const theta = item.compensateRotate ? -ellipse.tangentTheta(p) : 0;\n if (item.dx || item.dy) {\n p.translate(item.dx || 0, item.dy || 0);\n }\n if (item.dr) {\n p.move(center, item.dr);\n }\n return toResult(p.round(), theta, item);\n });\n}\n//# sourceMappingURL=ellipse.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Line } from '../../geometry';\nimport { normalizePoint, toResult } from './util';\nexport const line = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n const start = normalizePoint(elemBBox, groupPositionArgs.start || elemBBox.getOrigin());\n const end = normalizePoint(elemBBox, groupPositionArgs.end || elemBBox.getCorner());\n return lineLayout(portsPositionArgs, start, end, groupPositionArgs);\n};\nexport const left = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n return lineLayout(portsPositionArgs, elemBBox.getTopLeft(), elemBBox.getBottomLeft(), groupPositionArgs);\n};\nexport const right = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n return lineLayout(portsPositionArgs, elemBBox.getTopRight(), elemBBox.getBottomRight(), groupPositionArgs);\n};\nexport const top = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n return lineLayout(portsPositionArgs, elemBBox.getTopLeft(), elemBBox.getTopRight(), groupPositionArgs);\n};\nexport const bottom = (portsPositionArgs, elemBBox, groupPositionArgs) => {\n return lineLayout(portsPositionArgs, elemBBox.getBottomLeft(), elemBBox.getBottomRight(), groupPositionArgs);\n};\nfunction lineLayout(portsPositionArgs, p1, p2, groupPositionArgs) {\n const line = new Line(p1, p2);\n const length = portsPositionArgs.length;\n return portsPositionArgs.map((_a, index) => {\n var { strict } = _a, offset = __rest(_a, [\"strict\"]);\n const ratio = strict || groupPositionArgs.strict\n ? (index + 1) / (length + 1)\n : (index + 0.5) / length;\n const p = line.pointAt(ratio);\n if (offset.dx || offset.dy) {\n p.translate(offset.dx || 0, offset.dy || 0);\n }\n return toResult(p.round(), 0, offset);\n });\n}\n//# sourceMappingURL=line.js.map","import { Registry } from '../registry';\nimport * as layouts from './main';\nexport var PortLayout;\n(function (PortLayout) {\n PortLayout.presets = layouts;\n PortLayout.registry = Registry.create({\n type: 'port layout',\n });\n PortLayout.registry.register(PortLayout.presets, true);\n})(PortLayout || (PortLayout = {}));\n//# sourceMappingURL=index.js.map","import { ObjectExt } from '../../util';\nconst defaults = {\n position: { x: 0, y: 0 },\n angle: 0,\n attrs: {\n '.': {\n y: '0',\n 'text-anchor': 'start',\n },\n },\n};\nexport function toResult(preset, args) {\n const { x, y, angle, attrs } = args || {};\n return ObjectExt.defaultsDeep({}, { angle, attrs, position: { x, y } }, preset, defaults);\n}\n//# sourceMappingURL=util.js.map","import { toResult } from './util';\nexport const manual = (portPosition, elemBBox, args) => toResult({ position: elemBBox.getTopLeft() }, args);\nexport const left = (portPosition, elemBBox, args) => toResult({\n position: { x: -15, y: 0 },\n attrs: { '.': { y: '.3em', 'text-anchor': 'end' } },\n}, args);\nexport const right = (portPosition, elemBBox, args) => toResult({\n position: { x: 15, y: 0 },\n attrs: { '.': { y: '.3em', 'text-anchor': 'start' } },\n}, args);\nexport const top = (portPosition, elemBBox, args) => toResult({\n position: { x: 0, y: -15 },\n attrs: { '.': { 'text-anchor': 'middle' } },\n}, args);\nexport const bottom = (portPosition, elemBBox, args) => toResult({\n position: { x: 0, y: 15 },\n attrs: { '.': { y: '.6em', 'text-anchor': 'middle' } },\n}, args);\n//# sourceMappingURL=side.js.map","import { toResult } from './util';\nexport const outside = (portPosition, elemBBox, args) => outsideLayout(portPosition, elemBBox, false, args);\nexport const outsideOriented = (portPosition, elemBBox, args) => outsideLayout(portPosition, elemBBox, true, args);\nexport const inside = (portPosition, elemBBox, args) => insideLayout(portPosition, elemBBox, false, args);\nexport const insideOriented = (portPosition, elemBBox, args) => insideLayout(portPosition, elemBBox, true, args);\nfunction outsideLayout(portPosition, elemBBox, autoOrient, args) {\n const offset = args.offset != null ? args.offset : 15;\n const angle = elemBBox.getCenter().theta(portPosition);\n const bboxAngles = getBBoxAngles(elemBBox);\n let y;\n let tx;\n let ty;\n let textAnchor;\n let orientAngle = 0;\n if (angle < bboxAngles[1] || angle > bboxAngles[2]) {\n y = '.3em';\n tx = offset;\n ty = 0;\n textAnchor = 'start';\n }\n else if (angle < bboxAngles[0]) {\n y = '0';\n tx = 0;\n ty = -offset;\n if (autoOrient) {\n orientAngle = -90;\n textAnchor = 'start';\n }\n else {\n textAnchor = 'middle';\n }\n }\n else if (angle < bboxAngles[3]) {\n y = '.3em';\n tx = -offset;\n ty = 0;\n textAnchor = 'end';\n }\n else {\n y = '.6em';\n tx = 0;\n ty = offset;\n if (autoOrient) {\n orientAngle = 90;\n textAnchor = 'start';\n }\n else {\n textAnchor = 'middle';\n }\n }\n return toResult({\n position: {\n x: Math.round(tx),\n y: Math.round(ty),\n },\n angle: orientAngle,\n attrs: {\n '.': {\n y,\n 'text-anchor': textAnchor,\n },\n },\n }, args);\n}\nfunction insideLayout(portPosition, elemBBox, autoOrient, args) {\n const offset = args.offset != null ? args.offset : 15;\n const angle = elemBBox.getCenter().theta(portPosition);\n const bboxAngles = getBBoxAngles(elemBBox);\n let y;\n let tx;\n let ty;\n let textAnchor;\n let orientAngle = 0;\n if (angle < bboxAngles[1] || angle > bboxAngles[2]) {\n y = '.3em';\n tx = -offset;\n ty = 0;\n textAnchor = 'end';\n }\n else if (angle < bboxAngles[0]) {\n y = '.6em';\n tx = 0;\n ty = offset;\n if (autoOrient) {\n orientAngle = 90;\n textAnchor = 'start';\n }\n else {\n textAnchor = 'middle';\n }\n }\n else if (angle < bboxAngles[3]) {\n y = '.3em';\n tx = offset;\n ty = 0;\n textAnchor = 'start';\n }\n else {\n y = '0em';\n tx = 0;\n ty = -offset;\n if (autoOrient) {\n orientAngle = -90;\n textAnchor = 'start';\n }\n else {\n textAnchor = 'middle';\n }\n }\n return toResult({\n position: {\n x: Math.round(tx),\n y: Math.round(ty),\n },\n angle: orientAngle,\n attrs: {\n '.': {\n y,\n 'text-anchor': textAnchor,\n },\n },\n }, args);\n}\nfunction getBBoxAngles(elemBBox) {\n const center = elemBBox.getCenter();\n const tl = center.theta(elemBBox.getTopLeft());\n const bl = center.theta(elemBBox.getBottomLeft());\n const br = center.theta(elemBBox.getBottomRight());\n const tr = center.theta(elemBBox.getTopRight());\n return [tl, tr, br, bl];\n}\n//# sourceMappingURL=inout.js.map","import { Point } from '../../geometry';\nimport { toResult } from './util';\nexport const radial = (portPosition, elemBBox, args) => radialLayout(portPosition.diff(elemBBox.getCenter()), false, args);\nexport const radialOriented = (portPosition, elemBBox, args) => radialLayout(portPosition.diff(elemBBox.getCenter()), true, args);\nfunction radialLayout(portCenterOffset, autoOrient, args) {\n const offset = args.offset != null ? args.offset : 20;\n const origin = new Point(0, 0);\n const angle = -portCenterOffset.theta(origin);\n const pos = portCenterOffset\n .clone()\n .move(origin, offset)\n .diff(portCenterOffset)\n .round();\n let y = '.3em';\n let textAnchor;\n let orientAngle = angle;\n if ((angle + 90) % 180 === 0) {\n textAnchor = autoOrient ? 'end' : 'middle';\n if (!autoOrient && angle === -270) {\n y = '0em';\n }\n }\n else if (angle > -270 && angle < -90) {\n textAnchor = 'start';\n orientAngle = angle - 180;\n }\n else {\n textAnchor = 'end';\n }\n return toResult({\n position: pos.round().toJSON(),\n angle: autoOrient ? orientAngle : 0,\n attrs: {\n '.': {\n y,\n 'text-anchor': textAnchor,\n },\n },\n }, args);\n}\n//# sourceMappingURL=radial.js.map","import { Registry } from '../registry';\nimport * as layouts from './main';\nexport var PortLabelLayout;\n(function (PortLabelLayout) {\n PortLabelLayout.presets = layouts;\n PortLabelLayout.registry = Registry.create({\n type: 'port label layout',\n });\n PortLabelLayout.registry.register(PortLabelLayout.presets, true);\n})(PortLabelLayout || (PortLabelLayout = {}));\n//# sourceMappingURL=index.js.map","import { FunctionExt } from '../util';\nexport class Events {\n constructor() {\n this.listeners = {};\n }\n on(name, handler, context) {\n if (handler == null) {\n return this;\n }\n if (!this.listeners[name]) {\n this.listeners[name] = [];\n }\n const cache = this.listeners[name];\n cache.push(handler, context);\n return this;\n }\n once(name, handler, context) {\n const cb = (...args) => {\n this.off(name, cb);\n return Private.call([handler, context], args);\n };\n return this.on(name, cb, this);\n }\n off(name, handler, context) {\n // remove all events.\n if (!(name || handler || context)) {\n this.listeners = {};\n return this;\n }\n const listeners = this.listeners;\n const names = name ? [name] : Object.keys(listeners);\n names.forEach((n) => {\n const cache = listeners[n];\n if (!cache) {\n return;\n }\n // remove all events with specified name.\n if (!(handler || context)) {\n delete listeners[n];\n return;\n }\n for (let i = cache.length - 2; i >= 0; i -= 2) {\n if (!((handler && cache[i] !== handler) ||\n (context && cache[i + 1] !== context))) {\n cache.splice(i, 2);\n }\n }\n });\n return this;\n }\n trigger(name, ...args) {\n let returned = true;\n if (name !== '*') {\n const list = this.listeners[name];\n if (list != null) {\n returned = Private.call([...list], args);\n }\n }\n const list = this.listeners['*'];\n if (list != null) {\n return FunctionExt.toAsyncBoolean([\n returned,\n Private.call([...list], [name, ...args]),\n ]);\n }\n return returned;\n }\n emit(name, ...args) {\n return this.trigger(name, ...args);\n }\n}\nvar Private;\n(function (Private) {\n function call(list, args) {\n const results = [];\n for (let i = 0; i < list.length; i += 2) {\n const handler = list[i];\n const context = list[i + 1];\n const params = Array.isArray(args) ? args : [args];\n const ret = FunctionExt.apply(handler, context, params);\n results.push(ret);\n }\n return FunctionExt.toAsyncBoolean(results);\n }\n Private.call = call;\n})(Private || (Private = {}));\n//# sourceMappingURL=events.js.map","import { NumberExt } from '../util/number';\nexport class Color {\n constructor(color, g, b, a) {\n if (color == null) {\n return this.set(255, 255, 255, 1);\n }\n if (typeof color === 'number') {\n return this.set(color, g, b, a);\n }\n if (typeof color === 'string') {\n return Color.fromString(color) || this;\n }\n if (Array.isArray(color)) {\n return this.set(color);\n }\n this.set(color.r, color.g, color.b, color.a == null ? 1 : color.a);\n }\n blend(start, end, weight) {\n this.set(start.r + (end.r - start.r) * weight, start.g + (end.g - start.g) * weight, start.b + (end.b - start.b) * weight, start.a + (end.a - start.a) * weight);\n }\n lighten(amount) {\n const rgba = Color.lighten(this.toArray(), amount);\n this.r = rgba[0];\n this.g = rgba[1];\n this.b = rgba[2];\n this.a = rgba[3];\n }\n darken(amount) {\n this.lighten(-amount);\n }\n set(arg0, arg1, arg2, arg3) {\n const r = Array.isArray(arg0) ? arg0[0] : arg0;\n const g = Array.isArray(arg0) ? arg0[1] : arg1;\n const b = Array.isArray(arg0) ? arg0[2] : arg2;\n const a = Array.isArray(arg0) ? arg0[3] : arg3;\n this.r = Math.round(NumberExt.clamp(r, 0, 255));\n this.g = Math.round(NumberExt.clamp(g, 0, 255));\n this.b = Math.round(NumberExt.clamp(b, 0, 255));\n this.a = a == null ? 1 : NumberExt.clamp(a, 0, 1);\n return this;\n }\n toHex() {\n const hex = ['r', 'g', 'b'].map((key) => {\n const str = this[key].toString(16);\n return str.length < 2 ? `0${str}` : str;\n });\n return `#${hex.join('')}`;\n }\n toRGBA() {\n return this.toArray();\n }\n toHSLA() {\n return Color.rgba2hsla(this.r, this.g, this.b, this.a);\n }\n toCSS(ignoreAlpha) {\n const rgb = `${this.r},${this.g},${this.b},`;\n return ignoreAlpha ? `rgb(${rgb})` : `rgba(${rgb},${this.a})`;\n }\n toGrey() {\n return Color.makeGrey(Math.round((this.r + this.g + this.b) / 3), this.a);\n }\n toArray() {\n return [this.r, this.g, this.b, this.a];\n }\n toString() {\n return this.toCSS();\n }\n}\n(function (Color) {\n function fromArray(arr) {\n return new Color(arr);\n }\n Color.fromArray = fromArray;\n function fromHex(color) {\n return new Color([...hex2rgb(color), 1]);\n }\n Color.fromHex = fromHex;\n function fromRGBA(color) {\n const matches = color.toLowerCase().match(/^rgba?\\(([\\s.,0-9]+)\\)/);\n if (matches) {\n const arr = matches[1].split(/\\s*,\\s*/).map((v) => parseInt(v, 10));\n return new Color(arr);\n }\n return null;\n }\n Color.fromRGBA = fromRGBA;\n function hue2rgb(m1, m2, h) {\n if (h < 0) {\n ++h; // eslint-disable-line\n }\n if (h > 1) {\n --h; // eslint-disable-line\n }\n const h6 = 6 * h;\n if (h6 < 1) {\n return m1 + (m2 - m1) * h6;\n }\n if (2 * h < 1) {\n return m2;\n }\n if (3 * h < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n return m1;\n }\n function fromHSLA(color) {\n const matches = color.toLowerCase().match(/^hsla?\\(([\\s.,0-9]+)\\)/);\n if (matches) {\n const arr = matches[2].split(/\\s*,\\s*/);\n const h = (((parseFloat(arr[0]) % 360) + 360) % 360) / 360;\n const s = parseFloat(arr[1]) / 100;\n const l = parseFloat(arr[2]) / 100;\n const a = arr[3] == null ? 1 : parseInt(arr[3], 10);\n return new Color(hsla2rgba(h, s, l, a));\n }\n return null;\n }\n Color.fromHSLA = fromHSLA;\n function fromString(color) {\n if (color.startsWith('#')) {\n return fromHex(color);\n }\n if (color.startsWith('rgb')) {\n return fromRGBA(color);\n }\n const preset = Color.named[color];\n if (preset) {\n return fromHex(preset);\n }\n return fromHSLA(color);\n }\n Color.fromString = fromString;\n function makeGrey(g, a) {\n return Color.fromArray([g, g, g, a]);\n }\n Color.makeGrey = makeGrey;\n function rgba2hsla(arg0, arg1, arg2, arg3) {\n const r = Array.isArray(arg0) ? arg0[0] : arg0;\n const g = Array.isArray(arg0) ? arg0[1] : arg1;\n const b = Array.isArray(arg0) ? arg0[2] : arg2;\n const a = Array.isArray(arg0) ? arg0[3] : arg3;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (min !== max) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return [h, s, l, a == null ? 1 : a];\n }\n Color.rgba2hsla = rgba2hsla;\n function hsla2rgba(arg0, arg1, arg2, arg3) {\n const h = Array.isArray(arg0) ? arg0[0] : arg0;\n const s = Array.isArray(arg0) ? arg0[1] : arg1;\n const l = Array.isArray(arg0) ? arg0[2] : arg2;\n const a = Array.isArray(arg0) ? arg0[3] : arg3;\n const m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n const m1 = 2 * l - m2;\n return [\n hue2rgb(m1, m2, h + 1 / 3) * 256,\n hue2rgb(m1, m2, h) * 256,\n hue2rgb(m1, m2, h - 1 / 3) * 256,\n a == null ? 1 : a,\n ];\n }\n Color.hsla2rgba = hsla2rgba;\n function random(ignoreAlpha) {\n return new Color(Math.round(Math.random() * 256), Math.round(Math.random() * 256), Math.round(Math.random() * 256), ignoreAlpha ? undefined : parseFloat(Math.random().toFixed(2)));\n }\n Color.random = random;\n function randomHex() {\n const letters = '0123456789ABCDEF';\n let color = '#';\n for (let i = 0; i < 6; i += 1) {\n color += letters[Math.floor(Math.random() * 16)];\n }\n return color;\n }\n Color.randomHex = randomHex;\n function randomRGBA(ignoreAlpha) {\n return random(ignoreAlpha).toString();\n }\n Color.randomRGBA = randomRGBA;\n function invert(color, bw) {\n if (typeof color === 'string') {\n const pound = color[0] === '#';\n const [r, g, b] = hex2rgb(color);\n if (bw) {\n // http://stackoverflow.com/a/3943023/112731\n return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#ffffff';\n }\n return `${pound ? '#' : ''}${rgb2hex(255 - r, 255 - g, 255 - b)}`;\n }\n const r = color[0];\n const g = color[1];\n const b = color[2];\n const a = color[3];\n if (bw) {\n return r * 0.299 + g * 0.587 + b * 0.114 > 186\n ? [0, 0, 0, a]\n : [255, 255, 255, a];\n }\n return [255 - r, 255 - g, 255 - b, a];\n }\n Color.invert = invert;\n function hex2rgb(hex) {\n const color = hex.indexOf('#') === 0 ? hex : `#${hex}`;\n let val = Number(`0x${color.substr(1)}`);\n if (!(color.length === 4 || color.length === 7) || Number.isNaN(val)) {\n throw new Error('Invalid hex color.');\n }\n const bits = color.length === 4 ? 4 : 8;\n const mask = (1 << bits) - 1;\n const bgr = ['b', 'g', 'r'].map(() => {\n const c = val & mask;\n val >>= bits;\n return bits === 4 ? 17 * c : c;\n });\n return [bgr[2], bgr[1], bgr[0]];\n }\n function rgb2hex(r, g, b) {\n const pad = (hex) => (hex.length < 2 ? `0${hex}` : hex);\n return `${pad(r.toString(16))}${pad(g.toString(16))}${pad(b.toString(16))}`;\n }\n function lighten(color, amt) {\n return lum(color, amt);\n }\n Color.lighten = lighten;\n function darken(color, amt) {\n return lum(color, -amt);\n }\n Color.darken = darken;\n function lum(color, amt) {\n if (typeof color === 'string') {\n const pound = color[0] === '#';\n const num = parseInt(pound ? color.substr(1) : color, 16);\n const r = NumberExt.clamp((num >> 16) + amt, 0, 255);\n const g = NumberExt.clamp(((num >> 8) & 0x00ff) + amt, 0, 255);\n const b = NumberExt.clamp((num & 0x0000ff) + amt, 0, 255);\n return `${pound ? '#' : ''}${(b | (g << 8) | (r << 16)).toString(16)}`;\n }\n const hex = rgb2hex(color[0], color[1], color[2]);\n const arr = hex2rgb(lum(hex, amt));\n return [arr[0], arr[1], arr[2], color[3]];\n }\n})(Color || (Color = {}));\n(function (Color) {\n Color.named = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n burntsienna: '#ea7e5d',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n };\n})(Color || (Color = {}));\n//# sourceMappingURL=color.js.map","/* eslint-disable no-underscore-dangle */\nexport class Disposable {\n get disposed() {\n return this._disposed === true;\n }\n dispose() {\n this._disposed = true;\n }\n}\n(function (Disposable) {\n function dispose() {\n return (target, methodName, descriptor) => {\n const raw = descriptor.value;\n const proto = target.__proto__; // eslint-disable-line\n descriptor.value = function () {\n if (this.disposed) {\n return;\n }\n raw.call(this);\n proto.dispose.call(this);\n };\n };\n }\n Disposable.dispose = dispose;\n})(Disposable || (Disposable = {}));\n/**\n * A disposable object which delegates to a callback function.\n */\nexport class DisposableDelegate {\n /**\n * Construct a new disposable delegate.\n *\n * @param callback - The callback function to invoke on dispose.\n */\n constructor(callback) {\n this.callback = callback;\n }\n /**\n * Test whether the delegate has been disposed.\n */\n get disposed() {\n return !this.callback;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (!this.callback) {\n return;\n }\n const callback = this.callback;\n this.callback = null;\n callback();\n }\n}\n/**\n * An object which manages a collection of disposable items.\n */\nexport class DisposableSet {\n constructor() {\n this.isDisposed = false; // eslint-disable-line:variable-name\n this.items = new Set();\n }\n /**\n * Test whether the set has been disposed.\n */\n get disposed() {\n return this.isDisposed;\n }\n /**\n * Dispose of the set and the items it contains.\n *\n * #### Notes\n * Items are disposed in the order they are added to the set.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.items.forEach((item) => {\n item.dispose();\n });\n this.items.clear();\n }\n /**\n * Test whether the set contains a specific item.\n *\n * @param item - The item of interest.\n *\n * @returns `true` if the set contains the item, `false` otherwise.\n */\n contains(item) {\n return this.items.has(item);\n }\n /**\n * Add a disposable item to the set.\n *\n * @param item - The item to add to the set.\n *\n * #### Notes\n * If the item is already contained in the set, this is a no-op.\n */\n add(item) {\n this.items.add(item);\n }\n /**\n * Remove a disposable item from the set.\n *\n * @param item - The item to remove from the set.\n *\n * #### Notes\n * If the item is not contained in the set, this is a no-op.\n */\n remove(item) {\n this.items.delete(item);\n }\n /**\n * Remove all items from the set.\n */\n clear() {\n this.items.clear();\n }\n}\n(function (DisposableSet) {\n /**\n * Create a disposable set from an iterable of items.\n *\n * @param items - The iterable or array-like object of interest.\n *\n * @returns A new disposable initialized with the given items.\n */\n function from(items) {\n const set = new DisposableSet();\n items.forEach((item) => {\n set.add(item);\n });\n return set;\n }\n DisposableSet.from = from;\n})(DisposableSet || (DisposableSet = {}));\n//# sourceMappingURL=disposable.js.map","import { ObjectExt } from '../util';\nimport { Events } from './events';\nimport { Disposable } from './disposable';\nexport class Basecoat extends Events {\n}\n(function (Basecoat) {\n Basecoat.dispose = Disposable.dispose;\n})(Basecoat || (Basecoat = {}));\nObjectExt.applyMixins(Basecoat, Disposable);\n//# sourceMappingURL=basecoat.js.map","/* eslint-disable no-underscore-dangle */\nimport { Basecoat } from './basecoat';\nexport class Disablable extends Basecoat {\n get disabled() {\n return this._disabled === true;\n }\n enable() {\n delete this._disabled;\n }\n disable() {\n this._disabled = true;\n }\n}\n//# sourceMappingURL=disablable.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Disposable } from './disposable';\nexport class Dictionary extends Disposable {\n constructor() {\n super();\n this.clear();\n }\n clear() {\n this.map = new WeakMap();\n this.arr = [];\n }\n has(key) {\n return this.map.has(key);\n }\n get(key) {\n return this.map.get(key);\n }\n set(key, value) {\n this.map.set(key, value);\n this.arr.push(key);\n }\n delete(key) {\n const index = this.arr.indexOf(key);\n if (index >= 0) {\n this.arr.splice(index, 1);\n }\n const ret = this.map.get(key);\n this.map.delete(key);\n return ret;\n }\n each(iterator) {\n this.arr.forEach((key) => {\n const value = this.map.get(key);\n iterator(value, key);\n });\n }\n dispose() {\n this.clear();\n }\n}\n__decorate([\n Disposable.dispose()\n], Dictionary.prototype, \"dispose\", null);\n//# sourceMappingURL=dictionary.js.map","import { PriorityQueue } from './priorityqueue';\nexport var Dijkstra;\n(function (Dijkstra) {\n function run(adjacencyList, source, weight = (u, v) => 1) {\n const dist = {};\n const previous = {};\n const scanned = {};\n const queue = new PriorityQueue();\n dist[source] = 0;\n Object.keys(adjacencyList).forEach((v) => {\n if (v !== source) {\n dist[v] = Infinity;\n }\n queue.insert(dist[v], v, v);\n });\n while (!queue.isEmpty()) {\n const u = queue.remove();\n scanned[u] = true;\n const neighbours = adjacencyList[u] || [];\n for (let i = 0; i < neighbours.length; i += 1) {\n const v = neighbours[i];\n if (!scanned[v]) {\n const alt = dist[u] + weight(u, v);\n if (alt < dist[v]) {\n dist[v] = alt;\n previous[v] = u;\n queue.updatePriority(v, alt);\n }\n }\n }\n }\n return previous;\n }\n Dijkstra.run = run;\n})(Dijkstra || (Dijkstra = {}));\n//# sourceMappingURL=dijkstra.js.map","export var Timing;\n(function (Timing) {\n Timing.linear = (t) => t;\n Timing.quad = (t) => t * t;\n Timing.cubic = (t) => t * t * t;\n Timing.inout = (t) => {\n if (t <= 0) {\n return 0;\n }\n if (t >= 1) {\n return 1;\n }\n const t2 = t * t;\n const t3 = t2 * t;\n return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n };\n Timing.exponential = (t) => {\n return Math.pow(2, 10 * (t - 1)); // eslint-disable-line\n };\n Timing.bounce = ((t) => {\n // eslint-disable-next-line\n for (let a = 0, b = 1; 1; a += b, b /= 2) {\n if (t >= (7 - 4 * a) / 11) {\n const q = (11 - 6 * a - 11 * t) / 4;\n return -q * q + b * b;\n }\n }\n });\n})(Timing || (Timing = {}));\n(function (Timing) {\n Timing.decorators = {\n reverse(f) {\n return (t) => 1 - f(1 - t);\n },\n reflect(f) {\n return (t) => 0.5 * (t < 0.5 ? f(2 * t) : 2 - f(2 - 2 * t));\n },\n clamp(f, n = 0, x = 1) {\n return (t) => {\n const r = f(t);\n return r < n ? n : r > x ? x : r;\n };\n },\n back(s = 1.70158) {\n return (t) => t * t * ((s + 1) * t - s);\n },\n elastic(x = 1.5) {\n return (t) => Math.pow(2, 10 * (t - 1)) * Math.cos(((20 * Math.PI * x) / 3) * t); // eslint-disable-line\n },\n };\n})(Timing || (Timing = {}));\n(function (Timing) {\n // Slight acceleration from zero to full speed\n function easeInSine(t) {\n return -1 * Math.cos(t * (Math.PI / 2)) + 1;\n }\n Timing.easeInSine = easeInSine;\n // Slight deceleration at the end\n function easeOutSine(t) {\n return Math.sin(t * (Math.PI / 2));\n }\n Timing.easeOutSine = easeOutSine;\n // Slight acceleration at beginning and slight deceleration at end\n function easeInOutSine(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n }\n Timing.easeInOutSine = easeInOutSine;\n // Accelerating from zero velocity\n function easeInQuad(t) {\n return t * t;\n }\n Timing.easeInQuad = easeInQuad;\n // Decelerating to zero velocity\n function easeOutQuad(t) {\n return t * (2 - t);\n }\n Timing.easeOutQuad = easeOutQuad;\n // Acceleration until halfway, then deceleration\n function easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n Timing.easeInOutQuad = easeInOutQuad;\n // Accelerating from zero velocity\n function easeInCubic(t) {\n return t * t * t;\n }\n Timing.easeInCubic = easeInCubic;\n // Decelerating to zero velocity\n function easeOutCubic(t) {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n }\n Timing.easeOutCubic = easeOutCubic;\n // Acceleration until halfway, then deceleration\n function easeInOutCubic(t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n }\n Timing.easeInOutCubic = easeInOutCubic;\n // Accelerating from zero velocity\n function easeInQuart(t) {\n return t * t * t * t;\n }\n Timing.easeInQuart = easeInQuart;\n // Decelerating to zero velocity\n function easeOutQuart(t) {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n }\n Timing.easeOutQuart = easeOutQuart;\n // Acceleration until halfway, then deceleration\n function easeInOutQuart(t) {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n }\n Timing.easeInOutQuart = easeInOutQuart;\n // Accelerating from zero velocity\n function easeInQuint(t) {\n return t * t * t * t * t;\n }\n Timing.easeInQuint = easeInQuint;\n // Decelerating to zero velocity\n function easeOutQuint(t) {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n }\n Timing.easeOutQuint = easeOutQuint;\n // Acceleration until halfway, then deceleration\n function easeInOutQuint(t) {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n }\n Timing.easeInOutQuint = easeInOutQuint;\n // Accelerate exponentially until finish\n function easeInExpo(t) {\n if (t === 0) {\n return 0;\n }\n return Math.pow(2, 10 * (t - 1)); // eslint-disable-line\n }\n Timing.easeInExpo = easeInExpo;\n // Initial exponential acceleration slowing to stop\n function easeOutExpo(t) {\n if (t === 1) {\n return 1;\n }\n return -Math.pow(2, -10 * t) + 1; // eslint-disable-line\n }\n Timing.easeOutExpo = easeOutExpo;\n // Exponential acceleration and deceleration\n function easeInOutExpo(t) {\n if (t === 0 || t === 1) {\n return t;\n }\n const scaledTime = t * 2;\n const scaledTime1 = scaledTime - 1;\n if (scaledTime < 1) {\n return 0.5 * Math.pow(2, 10 * scaledTime1); // eslint-disable-line\n }\n return 0.5 * (-Math.pow(2, -10 * scaledTime1) + 2); // eslint-disable-line\n }\n Timing.easeInOutExpo = easeInOutExpo;\n // Increasing velocity until stop\n function easeInCirc(t) {\n const scaledTime = t / 1;\n return -1 * (Math.sqrt(1 - scaledTime * t) - 1);\n }\n Timing.easeInCirc = easeInCirc;\n // Start fast, decreasing velocity until stop\n function easeOutCirc(t) {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n }\n Timing.easeOutCirc = easeOutCirc;\n // Fast increase in velocity, fast decrease in velocity\n function easeInOutCirc(t) {\n const scaledTime = t * 2;\n const scaledTime1 = scaledTime - 2;\n if (scaledTime < 1) {\n return -0.5 * (Math.sqrt(1 - scaledTime * scaledTime) - 1);\n }\n return 0.5 * (Math.sqrt(1 - scaledTime1 * scaledTime1) + 1);\n }\n Timing.easeInOutCirc = easeInOutCirc;\n // Slow movement backwards then fast snap to finish\n function easeInBack(t, magnitude = 1.70158) {\n return t * t * ((magnitude + 1) * t - magnitude);\n }\n Timing.easeInBack = easeInBack;\n // Fast snap to backwards point then slow resolve to finish\n function easeOutBack(t, magnitude = 1.70158) {\n const scaledTime = t / 1 - 1;\n return (scaledTime * scaledTime * ((magnitude + 1) * scaledTime + magnitude) + 1);\n }\n Timing.easeOutBack = easeOutBack;\n // Slow movement backwards, fast snap to past finish, slow resolve to finish\n function easeInOutBack(t, magnitude = 1.70158) {\n const scaledTime = t * 2;\n const scaledTime2 = scaledTime - 2;\n const s = magnitude * 1.525;\n if (scaledTime < 1) {\n return 0.5 * scaledTime * scaledTime * ((s + 1) * scaledTime - s);\n }\n return 0.5 * (scaledTime2 * scaledTime2 * ((s + 1) * scaledTime2 + s) + 2);\n }\n Timing.easeInOutBack = easeInOutBack;\n // Bounces slowly then quickly to finish\n function easeInElastic(t, magnitude = 0.7) {\n if (t === 0 || t === 1) {\n return t;\n }\n const scaledTime = t / 1;\n const scaledTime1 = scaledTime - 1;\n const p = 1 - magnitude;\n const s = (p / (2 * Math.PI)) * Math.asin(1);\n return -(Math.pow(2, 10 * scaledTime1) * // eslint-disable-line\n Math.sin(((scaledTime1 - s) * (2 * Math.PI)) / p));\n }\n Timing.easeInElastic = easeInElastic;\n // Fast acceleration, bounces to zero\n function easeOutElastic(t, magnitude = 0.7) {\n const p = 1 - magnitude;\n const scaledTime = t * 2;\n if (t === 0 || t === 1) {\n return t;\n }\n const s = (p / (2 * Math.PI)) * Math.asin(1);\n return (Math.pow(2, -10 * scaledTime) * // eslint-disable-line\n Math.sin(((scaledTime - s) * (2 * Math.PI)) / p) +\n 1);\n }\n Timing.easeOutElastic = easeOutElastic;\n // Slow start and end, two bounces sandwich a fast motion\n function easeInOutElastic(t, magnitude = 0.65) {\n const p = 1 - magnitude;\n if (t === 0 || t === 1) {\n return t;\n }\n const scaledTime = t * 2;\n const scaledTime1 = scaledTime - 1;\n const s = (p / (2 * Math.PI)) * Math.asin(1);\n if (scaledTime < 1) {\n return (-0.5 *\n (Math.pow(2, 10 * scaledTime1) * // eslint-disable-line\n Math.sin(((scaledTime1 - s) * (2 * Math.PI)) / p)));\n }\n return (Math.pow(2, -10 * scaledTime1) * // eslint-disable-line\n Math.sin(((scaledTime1 - s) * (2 * Math.PI)) / p) *\n 0.5 +\n 1);\n }\n Timing.easeInOutElastic = easeInOutElastic;\n // Bounce to completion\n function easeOutBounce(t) {\n const scaledTime = t / 1;\n if (scaledTime < 1 / 2.75) {\n return 7.5625 * scaledTime * scaledTime;\n }\n if (scaledTime < 2 / 2.75) {\n const scaledTime2 = scaledTime - 1.5 / 2.75;\n return 7.5625 * scaledTime2 * scaledTime2 + 0.75;\n }\n if (scaledTime < 2.5 / 2.75) {\n const scaledTime2 = scaledTime - 2.25 / 2.75;\n return 7.5625 * scaledTime2 * scaledTime2 + 0.9375;\n }\n {\n const scaledTime2 = scaledTime - 2.625 / 2.75;\n return 7.5625 * scaledTime2 * scaledTime2 + 0.984375;\n }\n }\n Timing.easeOutBounce = easeOutBounce;\n // Bounce increasing in velocity until completion\n function easeInBounce(t) {\n return 1 - easeOutBounce(1 - t);\n }\n Timing.easeInBounce = easeInBounce;\n // Bounce in and bounce out\n function easeInOutBounce(t) {\n if (t < 0.5) {\n return easeInBounce(t * 2) * 0.5;\n }\n return easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n }\n Timing.easeInOutBounce = easeInOutBounce;\n})(Timing || (Timing = {}));\n//# sourceMappingURL=timing.js.map","export var Interp;\n(function (Interp) {\n Interp.number = (a, b) => {\n const d = b - a;\n return (t) => {\n return a + d * t;\n };\n };\n Interp.object = (a, b) => {\n const keys = Object.keys(a);\n return (t) => {\n const ret = {};\n for (let i = keys.length - 1; i !== -1; i -= 1) {\n const key = keys[i];\n ret[key] = a[key] + (b[key] - a[key]) * t;\n }\n return ret;\n };\n };\n Interp.unit = (a, b) => {\n const reg = /(-?[0-9]*.[0-9]*)(px|em|cm|mm|in|pt|pc|%)/;\n const ma = reg.exec(a);\n const mb = reg.exec(b);\n const pb = mb ? mb[1] : '';\n const aa = ma ? +ma[1] : 0;\n const bb = mb ? +mb[1] : 0;\n const index = pb.indexOf('.');\n const precision = index > 0 ? pb[1].length - index - 1 : 0;\n const d = bb - aa;\n const u = ma ? ma[2] : '';\n return (t) => {\n return (aa + d * t).toFixed(precision) + u;\n };\n };\n Interp.color = (a, b) => {\n const ca = parseInt(a.slice(1), 16);\n const cb = parseInt(b.slice(1), 16);\n const ra = ca & 0x0000ff;\n const rd = (cb & 0x0000ff) - ra;\n const ga = ca & 0x00ff00;\n const gd = (cb & 0x00ff00) - ga;\n const ba = ca & 0xff0000;\n const bd = (cb & 0xff0000) - ba;\n return (t) => {\n const r = (ra + rd * t) & 0x000000ff;\n const g = (ga + gd * t) & 0x0000ff00;\n const b = (ba + bd * t) & 0x00ff0000;\n return `#${((1 << 24) | r | g | b).toString(16).slice(1)}`;\n };\n };\n})(Interp || (Interp = {}));\n//# sourceMappingURL=interp.js.map","import { Config } from '../global/config';\nimport { StringExt, FunctionExt } from '../util';\nexport var LocalStorage;\n(function (LocalStorage) {\n const prefix = `${Config.prefixCls}.storage`;\n function insert(collection, doc, cb) {\n const id = doc.id || StringExt.uniqueId('doc-');\n const index = loadIndex(collection);\n index.keys.push(id);\n setItem(docKey(collection, id), doc);\n setItem(indexKey(collection), index);\n callback(cb, null, Object.assign(Object.assign({}, doc), { id }));\n }\n LocalStorage.insert = insert;\n function find(collection, query, cb) {\n const index = loadIndex(collection);\n const docs = [];\n if (query == null) {\n index.keys.forEach((id) => {\n const doc = getItem(docKey(collection, id));\n if (!doc) {\n callback(cb, new Error(`No document found for an ID '${id}' from index.`));\n }\n else {\n docs.push(doc);\n }\n });\n callback(cb, null, docs);\n }\n else if (query.id) {\n const doc = getItem(docKey(collection, query.id));\n callback(cb, null, doc ? [doc] : []);\n }\n else {\n callback(cb, null, []);\n }\n }\n LocalStorage.find = find;\n function remove(collection, query, cb) {\n const index = loadIndex(collection);\n if (query == null) {\n index.keys.forEach((id) => {\n localStorage.removeItem(docKey(collection, id));\n });\n localStorage.removeItem(indexKey(collection));\n callback(cb, null);\n }\n else if (query.id) {\n const idx = index.keys.indexOf(query.id);\n if (idx >= 0) {\n index.keys.splice(idx, 1);\n }\n localStorage.removeItem(docKey(collection, query.id));\n setItem(indexKey(collection), index);\n callback(cb, null);\n }\n }\n LocalStorage.remove = remove;\n // util\n // ----\n function callback(cb, err, ret) {\n if (cb) {\n FunctionExt.defer(() => {\n cb(err, ret);\n });\n }\n }\n function setItem(key, item) {\n localStorage.setItem(key, JSON.stringify(item));\n }\n function getItem(key) {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n }\n function loadIndex(collection) {\n const index = getItem(indexKey(collection));\n if (index) {\n if (index.keys == null) {\n index.keys = [];\n }\n return index;\n }\n return { keys: [] };\n }\n function docKey(collection, id) {\n return `${prefix}.${collection}.docs.${id}`;\n }\n function indexKey(collection) {\n return `${prefix}.${collection}.index`;\n }\n})(LocalStorage || (LocalStorage = {}));\n//# sourceMappingURL=localstorage.js.map","import JQuery from 'jquery';\nimport { Dom } from '../util';\nimport { Basecoat } from '../common';\nimport { Util, Config } from '../global';\nexport class View extends Basecoat {\n constructor() {\n super();\n this.cid = Private.uniqueId();\n View.views[this.cid] = this;\n }\n get priority() {\n return 2;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n confirmUpdate(flag, options) {\n return 0;\n }\n $(elem) {\n return View.$(elem);\n }\n empty(elem = this.container) {\n this.$(elem).empty();\n return this;\n }\n unmount(elem = this.container) {\n this.$(elem).remove();\n return this;\n }\n remove(elem = this.container) {\n if (elem === this.container) {\n this.removeEventListeners(document);\n this.onRemove();\n delete View.views[this.cid];\n }\n this.unmount(elem);\n return this;\n }\n onRemove() { }\n setClass(className, elem = this.container) {\n elem.classList.value = Array.isArray(className)\n ? className.join(' ')\n : className;\n }\n addClass(className, elem = this.container) {\n this.$(elem).addClass(Array.isArray(className) ? className.join(' ') : className);\n return this;\n }\n removeClass(className, elem = this.container) {\n this.$(elem).removeClass(Array.isArray(className) ? className.join(' ') : className);\n return this;\n }\n setStyle(style, elem = this.container) {\n this.$(elem).css(style);\n return this;\n }\n setAttrs(attrs, elem = this.container) {\n if (attrs != null && elem != null) {\n if (elem instanceof SVGElement) {\n Dom.attr(elem, attrs);\n }\n else {\n this.$(elem).attr(attrs);\n }\n }\n return this;\n }\n /**\n * Returns the value of the specified attribute of `node`.\n *\n * If the node does not set a value for attribute, start recursing up\n * the DOM tree from node to lookup for attribute at the ancestors of\n * node. If the recursion reaches CellView's root node and attribute\n * is not found even there, return `null`.\n */\n findAttr(attrName, elem = this.container) {\n let current = elem;\n while (current && current.nodeType === 1) {\n const value = current.getAttribute(attrName);\n if (value != null) {\n return value;\n }\n if (current === this.container) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n }\n find(selector, rootElem = this.container, selectors = this.selectors) {\n return View.find(selector, rootElem, selectors).elems;\n }\n findOne(selector, rootElem = this.container, selectors = this.selectors) {\n const nodes = this.find(selector, rootElem, selectors);\n return nodes.length > 0 ? nodes[0] : null;\n }\n findByAttr(attrName, elem = this.container) {\n let node = elem;\n while (node && node.getAttribute) {\n const val = node.getAttribute(attrName);\n if ((val != null || node === this.container) && val !== 'false') {\n return node;\n }\n node = node.parentNode;\n }\n // If the overall cell has set `magnet === false`, then returns\n // `null` to announce there is no magnet found for this cell.\n // This is especially useful to set on cells that have 'ports'.\n // In this case, only the ports have set `magnet === true` and the\n // overall element has `magnet === false`.\n return null;\n }\n getSelector(elem, prevSelector) {\n let selector;\n if (elem === this.container) {\n if (typeof prevSelector === 'string') {\n selector = `> ${prevSelector}`;\n }\n return selector;\n }\n if (elem) {\n const nth = Dom.index(elem) + 1;\n selector = `${elem.tagName.toLowerCase()}:nth-child(${nth})`;\n if (prevSelector) {\n selector += ` > ${prevSelector}`;\n }\n selector = this.getSelector(elem.parentNode, selector);\n }\n return selector;\n }\n prefixClassName(className) {\n return Util.prefix(className);\n }\n delegateEvents(events, append) {\n if (events == null) {\n return this;\n }\n if (!append) {\n this.undelegateEvents();\n }\n const splitter = /^(\\S+)\\s*(.*)$/;\n Object.keys(events).forEach((key) => {\n const match = key.match(splitter);\n if (match == null) {\n return;\n }\n const method = this.getEventHandler(events[key]);\n if (typeof method === 'function') {\n this.delegateEvent(match[1], match[2], method);\n }\n });\n return this;\n }\n undelegateEvents() {\n this.$(this.container).off(this.getEventNamespace());\n return this;\n }\n delegateDocumentEvents(events, data) {\n this.addEventListeners(document, events, data);\n return this;\n }\n undelegateDocumentEvents() {\n this.removeEventListeners(document);\n return this;\n }\n delegateEvent(eventName, selector, listener) {\n this.$(this.container).on(eventName + this.getEventNamespace(), selector, listener);\n return this;\n }\n undelegateEvent(eventName, selector, listener) {\n const name = eventName + this.getEventNamespace();\n if (selector == null) {\n this.$(this.container).off(name);\n }\n else if (typeof selector === 'string') {\n this.$(this.container).off(name, selector, listener);\n }\n else {\n this.$(this.container).off(name, selector);\n }\n return this;\n }\n addEventListeners(elem, events, data) {\n if (events == null) {\n return this;\n }\n const ns = this.getEventNamespace();\n const $elem = this.$(elem);\n Object.keys(events).forEach((eventName) => {\n const method = this.getEventHandler(events[eventName]);\n if (typeof method === 'function') {\n $elem.on(eventName + ns, data, method);\n }\n });\n return this;\n }\n removeEventListeners(elem) {\n if (elem != null) {\n this.$(elem).off(this.getEventNamespace());\n }\n return this;\n }\n getEventNamespace() {\n return `.${Config.prefixCls}-event-${this.cid}`;\n }\n // eslint-disable-next-line\n getEventHandler(handler) {\n // eslint-disable-next-line\n let method;\n if (typeof handler === 'string') {\n const fn = this[handler];\n if (typeof fn === 'function') {\n method = (...args) => fn.call(this, ...args);\n }\n }\n else {\n method = (...args) => handler.call(this, ...args);\n }\n return method;\n }\n getEventTarget(e, options = {}) {\n // Touchmove/Touchend event's target is not reflecting the element\n // under the coordinates as mousemove does.\n // It holds the element when a touchstart triggered.\n const { target, type, clientX = 0, clientY = 0 } = e;\n if (options.fromPoint || type === 'touchmove' || type === 'touchend') {\n return document.elementFromPoint(clientX, clientY);\n }\n return target;\n }\n stopPropagation(e) {\n this.setEventData(e, { propagationStopped: true });\n return this;\n }\n isPropagationStopped(e) {\n return this.getEventData(e).propagationStopped === true;\n }\n getEventData(e) {\n return this.eventData(e);\n }\n setEventData(e, data) {\n return this.eventData(e, data);\n }\n eventData(e, data) {\n if (e == null) {\n throw new TypeError('Event object required');\n }\n let currentData = e.data;\n const key = `__${this.cid}__`;\n // get\n if (data == null) {\n if (currentData == null) {\n return {};\n }\n return currentData[key] || {};\n }\n // set\n if (currentData == null) {\n currentData = e.data = {};\n }\n if (currentData[key] == null) {\n currentData[key] = Object.assign({}, data);\n }\n else {\n currentData[key] = Object.assign(Object.assign({}, currentData[key]), data);\n }\n return currentData[key];\n }\n normalizeEvent(evt) {\n return View.normalizeEvent(evt);\n }\n}\n(function (View) {\n function $(elem) {\n return JQuery(elem);\n }\n View.$ = $;\n function createElement(tagName, isSvgElement) {\n return isSvgElement\n ? Dom.createSvgElement(tagName || 'g')\n : Dom.createElementNS(tagName || 'div');\n }\n View.createElement = createElement;\n function find(selector, rootElem, selectors) {\n if (!selector || selector === '.') {\n return { elems: [rootElem] };\n }\n if (selectors) {\n const nodes = selectors[selector];\n if (nodes) {\n return { elems: Array.isArray(nodes) ? nodes : [nodes] };\n }\n }\n if (Config.useCSSSelector) {\n return {\n isCSSSelector: true,\n // elems: Array.prototype.slice.call(rootElem.querySelectorAll(selector)),\n elems: $(rootElem).find(selector).toArray(),\n };\n }\n return { elems: [] };\n }\n View.find = find;\n function normalizeEvent(evt) {\n let normalizedEvent = evt;\n const originalEvent = evt.originalEvent;\n const touchEvt = originalEvent &&\n originalEvent.changedTouches &&\n originalEvent.changedTouches[0];\n if (touchEvt) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in evt) {\n // copy all the properties from the input event that are not\n // defined on the touch event (functions included).\n if (touchEvt[key] === undefined) {\n touchEvt[key] = evt[key];\n }\n }\n normalizedEvent = touchEvt;\n }\n // IE: evt.target could be set to SVGElementInstance for SVGUseElement\n const target = normalizedEvent.target;\n if (target) {\n const useElement = target.correspondingUseElement;\n if (useElement) {\n normalizedEvent.target = useElement;\n }\n }\n return normalizedEvent;\n }\n View.normalizeEvent = normalizeEvent;\n})(View || (View = {}));\n(function (View) {\n View.views = {};\n function getView(cid) {\n return View.views[cid] || null;\n }\n View.getView = getView;\n})(View || (View = {}));\nvar Private;\n(function (Private) {\n let counter = 0;\n function uniqueId() {\n const id = `v${counter}`;\n counter += 1;\n return id;\n }\n Private.uniqueId = uniqueId;\n})(Private || (Private = {}));\n//# sourceMappingURL=view.js.map","/**\n * An implementation of the Priority Queue abstract data type.\n *\n * @see: http://en.wikipedia.org/wiki/Priority_queue\n *\n * It is like a normal stack or queue, but where each item has assigned a\n * priority (a number). Items with higher priority are served before items\n * with lower priority. This implementation uses binary heap as an internal\n * representation of the queue. The time complexity of all the methods is as\n * follows:\n *\n * - create: `O(n)`\n * - insert: `O(log n)`\n * - remove: `O(log n)`\n * - peek: `O(1)`\n * - isEmpty: `O(1)`\n * - peekPriority: `O(1)`\n */\nexport class PriorityQueue {\n constructor(options = {}) {\n this.comparator = options.comparator || PriorityQueue.defaultComparator;\n this.index = {};\n this.data = options.data || [];\n this.heapify();\n }\n /**\n * Returns `true` if the priority queue is empty, `false` otherwise.\n */\n isEmpty() {\n return this.data.length === 0;\n }\n /**\n * Inserts a value with priority to the queue. Optionally pass a unique\n * id of this item. Passing unique IDs for each item you insert allows\n * you to use the `updatePriority()` operation.\n * @param priority\n * @param value\n * @param id\n */\n insert(priority, value, id) {\n const item = { priority, value };\n const index = this.data.length - 1;\n if (id) {\n item.id = id;\n this.index[id] = index;\n }\n this.data.push(item);\n this.bubbleUp(index);\n return this;\n }\n /**\n * Returns the value of an item with the highest priority.\n */\n peek() {\n return this.data[0] ? this.data[0].value : null;\n }\n /**\n * Returns the highest priority in the queue.\n */\n peekPriority() {\n return this.data[0] ? this.data[0].priority : null;\n }\n updatePriority(id, priority) {\n const index = this.index[id];\n if (typeof index === 'undefined') {\n throw new Error(`Node with id '${id}' was not found in the heap.`);\n }\n const data = this.data;\n const oldPriority = data[index].priority;\n const comp = this.comparator(priority, oldPriority);\n if (comp < 0) {\n data[index].priority = priority;\n this.bubbleUp(index);\n }\n else if (comp > 0) {\n data[index].priority = priority;\n this.bubbleDown(index);\n }\n }\n /**\n * Removes the item with the highest priority from the queue\n *\n * @returns The value of the removed item.\n */\n remove() {\n const data = this.data;\n const peek = data[0];\n const last = data.pop();\n delete this.index[data.length];\n if (data.length > 0) {\n data[0] = last;\n if (last.id) {\n this.index[last.id] = 0;\n }\n this.bubbleDown(0);\n }\n return peek ? peek.value : null;\n }\n heapify() {\n for (let i = 0; i < this.data.length; i += 1) {\n this.bubbleUp(i);\n }\n }\n bubbleUp(index) {\n const data = this.data;\n let tmp;\n let parent;\n let current = index;\n while (current > 0) {\n parent = (current - 1) >>> 1;\n if (this.comparator(data[current].priority, data[parent].priority) < 0) {\n tmp = data[parent];\n data[parent] = data[current];\n let id = data[current].id;\n if (id != null) {\n this.index[id] = parent;\n }\n data[current] = tmp;\n id = data[current].id;\n if (id != null) {\n this.index[id] = current;\n }\n current = parent;\n }\n else {\n break;\n }\n }\n }\n bubbleDown(index) {\n const data = this.data;\n const last = data.length - 1;\n let current = index;\n // eslint-disable-next-line\n while (true) {\n const left = (current << 1) + 1;\n const right = left + 1;\n let minIndex = current;\n if (left <= last &&\n this.comparator(data[left].priority, data[minIndex].priority) < 0) {\n minIndex = left;\n }\n if (right <= last &&\n this.comparator(data[right].priority, data[minIndex].priority) < 0) {\n minIndex = right;\n }\n if (minIndex !== current) {\n const tmp = data[minIndex];\n data[minIndex] = data[current];\n let id = data[current].id;\n if (id != null) {\n this.index[id] = minIndex;\n }\n data[current] = tmp;\n id = data[current].id;\n if (id != null) {\n this.index[id] = current;\n }\n current = minIndex;\n }\n else {\n break;\n }\n }\n }\n}\n(function (PriorityQueue) {\n PriorityQueue.defaultComparator = (a, b) => a - b;\n})(PriorityQueue || (PriorityQueue = {}));\n//# sourceMappingURL=priorityqueue.js.map","export const noop = (terminal) => terminal;\n//# sourceMappingURL=noop.js.map","import { Point } from '../../geometry';\nfunction toPercentage(value, max) {\n if (max === 0) {\n return '0%';\n }\n return `${Math.round((value / max) * 100)}%`;\n}\nfunction pin(relative) {\n const strategy = (terminal, view, magnet, coords) => {\n return view.isEdgeElement(magnet)\n ? pinEdgeTerminal(relative, terminal, view, magnet, coords)\n : pinNodeTerminal(relative, terminal, view, magnet, coords);\n };\n return strategy;\n}\nfunction pinNodeTerminal(relative, data, view, magnet, coords) {\n const node = view.cell;\n const angle = node.getAngle();\n const bbox = view.getUnrotatedBBoxOfElement(magnet);\n const center = node.getBBox().getCenter();\n const pos = Point.create(coords).rotate(angle, center);\n let dx = pos.x - bbox.x;\n let dy = pos.y - bbox.y;\n if (relative) {\n dx = toPercentage(dx, bbox.width);\n dy = toPercentage(dy, bbox.height);\n }\n data.anchor = {\n name: 'topLeft',\n args: {\n dx,\n dy,\n rotate: true,\n },\n };\n return data;\n}\nfunction pinEdgeTerminal(relative, end, view, magnet, coords) {\n const connection = view.getConnection();\n if (!connection) {\n return end;\n }\n const length = connection.closestPointLength(coords);\n if (relative) {\n const totalLength = connection.length();\n end.anchor = {\n name: 'ratio',\n args: {\n ratio: length / totalLength,\n },\n };\n }\n else {\n end.anchor = {\n name: 'length',\n args: {\n length,\n },\n };\n }\n return end;\n}\nexport const pinRelative = pin(true);\nexport const pinAbsolute = pin(false);\n//# sourceMappingURL=pin.js.map","import { Registry } from '../registry';\nimport * as strategies from './main';\nexport var ConnectionStrategy;\n(function (ConnectionStrategy) {\n ConnectionStrategy.presets = strategies;\n ConnectionStrategy.registry = Registry.create({\n type: 'connection strategy',\n });\n ConnectionStrategy.registry.register(ConnectionStrategy.presets, true);\n})(ConnectionStrategy || (ConnectionStrategy = {}));\n//# sourceMappingURL=index.js.map","import JQuery from 'jquery';\nimport { ObjectExt, StringExt, Dom, Vector } from '../util';\n// eslint-disable-next-line\nexport var Markup;\n(function (Markup) {\n function isJSONMarkup(markup) {\n return markup != null && !isStringMarkup(markup);\n }\n Markup.isJSONMarkup = isJSONMarkup;\n function isStringMarkup(markup) {\n return markup != null && typeof markup === 'string';\n }\n Markup.isStringMarkup = isStringMarkup;\n function clone(markup) {\n return markup == null || isStringMarkup(markup)\n ? markup\n : ObjectExt.cloneDeep(markup);\n }\n Markup.clone = clone;\n /**\n * Removes blank space in markup to prevent create empty text node.\n */\n function sanitize(markup) {\n return `${markup}`\n .trim()\n .replace(/[\\r|\\n]/g, ' ')\n .replace(/>\\s+</g, '><');\n }\n Markup.sanitize = sanitize;\n function parseStringMarkup(markup) {\n const fragment = document.createDocumentFragment();\n const groups = {};\n const selectors = {};\n const sanitized = sanitize(markup);\n const nodes = StringExt.sanitizeHTML(sanitized, { raw: true });\n nodes.forEach((node) => {\n fragment.appendChild(node);\n });\n return { fragment, selectors, groups };\n }\n Markup.parseStringMarkup = parseStringMarkup;\n function parseJSONMarkup(markup, options = { ns: Dom.ns.svg }) {\n const fragment = document.createDocumentFragment();\n const groups = {};\n const selectors = {};\n const queue = [\n {\n markup: Array.isArray(markup) ? markup : [markup],\n parent: fragment,\n ns: options.ns,\n },\n ];\n while (queue.length > 0) {\n const item = queue.pop();\n let ns = item.ns || Dom.ns.svg;\n const defines = item.markup;\n const parentNode = item.parent;\n defines.forEach((define) => {\n // tagName\n const tagName = define.tagName;\n if (!tagName) {\n throw new TypeError('Invalid tagName');\n }\n // ns\n if (define.ns) {\n ns = define.ns;\n }\n const svg = ns === Dom.ns.svg;\n const node = ns\n ? Dom.createElementNS(tagName, ns)\n : Dom.createElement(tagName);\n // attrs\n const attrs = define.attrs;\n if (attrs) {\n if (svg) {\n Dom.attr(node, Dom.kebablizeAttrs(attrs));\n }\n else {\n JQuery(node).attr(attrs);\n }\n }\n // style\n const style = define.style;\n if (style) {\n JQuery(node).css(style);\n }\n // classname\n const className = define.className;\n if (className != null) {\n node.setAttribute('class', Array.isArray(className) ? className.join(' ') : className);\n }\n // textContent\n if (define.textContent) {\n node.textContent = define.textContent;\n }\n // selector\n const selector = define.selector;\n if (selector != null) {\n if (selectors[selector]) {\n throw new TypeError('Selector must be unique');\n }\n selectors[selector] = node;\n }\n // group\n if (define.groupSelector) {\n let nodeGroups = define.groupSelector;\n if (!Array.isArray(nodeGroups)) {\n nodeGroups = [nodeGroups];\n }\n nodeGroups.forEach((name) => {\n if (!groups[name]) {\n groups[name] = [];\n }\n groups[name].push(node);\n });\n }\n parentNode.appendChild(node);\n // children\n const children = define.children;\n if (Array.isArray(children)) {\n queue.push({ ns, markup: children, parent: node });\n }\n });\n }\n Object.keys(groups).forEach((groupName) => {\n if (selectors[groupName]) {\n throw new Error('Ambiguous group selector');\n }\n selectors[groupName] = groups[groupName];\n });\n return { fragment, selectors, groups };\n }\n Markup.parseJSONMarkup = parseJSONMarkup;\n function createContainer(firstChild) {\n return firstChild instanceof SVGElement\n ? Dom.createSvgElement('g')\n : Dom.createElement('div');\n }\n function renderMarkup(markup) {\n if (isStringMarkup(markup)) {\n const nodes = Vector.createVectors(markup);\n const count = nodes.length;\n if (count === 1) {\n return {\n elem: nodes[0].node,\n };\n }\n if (count > 1) {\n const elem = createContainer(nodes[0].node);\n nodes.forEach((node) => {\n elem.appendChild(node.node);\n });\n return { elem };\n }\n return {};\n }\n const result = parseJSONMarkup(markup);\n const fragment = result.fragment;\n let elem = null;\n if (fragment.childNodes.length > 1) {\n elem = createContainer(fragment.firstChild);\n elem.appendChild(fragment);\n }\n else {\n elem = fragment.firstChild;\n }\n return { elem, selectors: result.selectors };\n }\n Markup.renderMarkup = renderMarkup;\n function parseLabelStringMarkup(markup) {\n const children = Vector.createVectors(markup);\n const fragment = document.createDocumentFragment();\n for (let i = 0, n = children.length; i < n; i += 1) {\n const currentChild = children[i].node;\n fragment.appendChild(currentChild);\n }\n return { fragment, selectors: {} };\n }\n Markup.parseLabelStringMarkup = parseLabelStringMarkup;\n})(Markup || (Markup = {}));\n// eslint-disable-next-line\n(function (Markup) {\n function getSelector(elem, stop, prev) {\n if (elem != null) {\n let selector;\n const tagName = elem.tagName.toLowerCase();\n if (elem === stop) {\n if (typeof prev === 'string') {\n selector = `> ${tagName} > ${prev}`;\n }\n else {\n selector = `> ${tagName}`;\n }\n return selector;\n }\n const parent = elem.parentNode;\n if (parent && parent.childNodes.length > 1) {\n const nth = Dom.index(elem) + 1;\n selector = `${tagName}:nth-child(${nth})`;\n }\n else {\n selector = tagName;\n }\n if (prev) {\n selector += ` > ${prev}`;\n }\n return getSelector(elem.parentNode, stop, selector);\n }\n return prev;\n }\n Markup.getSelector = getSelector;\n function parseNode(node, root, ns) {\n if (node.nodeName === '#text') {\n return null;\n }\n let selector = null;\n let groupSelector = null;\n // let classNames: string | null = null\n let attrs = null;\n let isCSSSelector = false;\n const markup = {\n tagName: node.tagName,\n };\n if (node.attributes) {\n attrs = {};\n for (let i = 0, l = node.attributes.length; i < l; i += 1) {\n const attr = node.attributes[i];\n const name = attr.nodeName;\n const value = attr.nodeValue;\n if (name === 'selector') {\n selector = value;\n }\n else if (name === 'groupSelector') {\n groupSelector = value;\n }\n else if (name === 'class') {\n markup.attrs = { class: value };\n }\n else {\n attrs[name] = value;\n }\n }\n }\n if (selector == null) {\n isCSSSelector = true;\n selector = getSelector(node, root);\n }\n if (node.namespaceURI) {\n markup.ns = node.namespaceURI;\n }\n if (markup.ns == null) {\n if ([\n 'body',\n 'div',\n 'section',\n 'main',\n 'nav',\n 'footer',\n 'span',\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'dl',\n 'center',\n 'strong',\n 'pre',\n 'form',\n 'select',\n 'textarea',\n 'fieldset',\n 'marquee',\n 'bgsound',\n 'iframe',\n 'frameset',\n ].includes(node.tagName)) {\n markup.ns = Dom.ns.xhtml;\n }\n else if (ns) {\n markup.ns = ns;\n }\n }\n if (selector) {\n markup.selector = selector;\n }\n if (groupSelector != null) {\n markup.groupSelector = groupSelector;\n }\n return {\n markup,\n attrs,\n isCSSSelector,\n };\n }\n function xml2json(xml) {\n const sanitized = Markup.sanitize(xml);\n const doc = Dom.parseXML(sanitized, { mimeType: 'image/svg+xml' });\n const nodes = Array.prototype.slice.call(doc.childNodes);\n const attrMap = {};\n const markupMap = new WeakMap();\n const parse = (node, root, ns) => {\n const data = parseNode(node, root, ns);\n if (data == null) {\n const parent = markupMap.get(node.parentNode);\n if (parent && node.textContent) {\n parent.textContent = node.textContent;\n }\n }\n else {\n const { markup, attrs, isCSSSelector } = data;\n markupMap.set(node, markup);\n if (markup.selector && attrs != null) {\n if (Object.keys(attrs).length) {\n attrMap[markup.selector] = attrs;\n }\n if (isCSSSelector) {\n delete markup.selector;\n }\n }\n if (node.childNodes && node.childNodes.length > 0) {\n for (let i = 0, l = node.childNodes.length; i < l; i += 1) {\n const child = node.childNodes[i];\n const childMarkup = parse(child, root, markup.ns);\n if (childMarkup) {\n if (markup.children == null) {\n markup.children = [];\n }\n markup.children.push(childMarkup);\n }\n }\n }\n return markup;\n }\n };\n const markup = nodes\n .map((node) => parse(node, node))\n .filter((mk) => mk != null);\n return {\n markup,\n attrs: attrMap,\n };\n }\n Markup.xml2json = xml2json;\n})(Markup || (Markup = {}));\n// eslint-disable-next-line\n(function (Markup) {\n function getPortContainerMarkup() {\n return 'g';\n }\n Markup.getPortContainerMarkup = getPortContainerMarkup;\n function getPortMarkup() {\n return {\n tagName: 'circle',\n selector: 'circle',\n attrs: {\n r: 10,\n fill: '#FFFFFF',\n stroke: '#000000',\n },\n };\n }\n Markup.getPortMarkup = getPortMarkup;\n function getPortLabelMarkup() {\n return {\n tagName: 'text',\n selector: 'text',\n attrs: {\n fill: '#000000',\n },\n };\n }\n Markup.getPortLabelMarkup = getPortLabelMarkup;\n})(Markup || (Markup = {}));\n// eslint-disable-next-line\n(function (Markup) {\n function getEdgeMarkup() {\n return Markup.sanitize(`\n <path class=\"connection\" stroke=\"black\" d=\"M 0 0 0 0\"/>\n <path class=\"source-marker\" fill=\"black\" stroke=\"black\" d=\"M 0 0 0 0\"/>\n <path class=\"target-marker\" fill=\"black\" stroke=\"black\" d=\"M 0 0 0 0\"/>\n <path class=\"connection-wrap\" d=\"M 0 0 0 0\"/>\n <g class=\"labels\"/>\n <g class=\"vertices\"/>\n <g class=\"arrowheads\"/>\n <g class=\"tools\"/>\n `);\n }\n Markup.getEdgeMarkup = getEdgeMarkup;\n function getEdgeToolMarkup() {\n return Markup.sanitize(`\n <g class=\"edge-tool\">\n <g class=\"tool-remove\" event=\"edge:remove\">\n <circle r=\"11\" />\n <path transform=\"scale(.8) translate(-16, -16)\" d=\"M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z\" />\n <title>Remove edge.</title>\n </g>\n <g class=\"tool-options\" event=\"edge:options\">\n <circle r=\"11\" transform=\"translate(25)\"/>\n <path fill=\"white\" transform=\"scale(.55) translate(29, -16)\" d=\"M31.229,17.736c0.064-0.571,0.104-1.148,0.104-1.736s-0.04-1.166-0.104-1.737l-4.377-1.557c-0.218-0.716-0.504-1.401-0.851-2.05l1.993-4.192c-0.725-0.91-1.549-1.734-2.458-2.459l-4.193,1.994c-0.647-0.347-1.334-0.632-2.049-0.849l-1.558-4.378C17.165,0.708,16.588,0.667,16,0.667s-1.166,0.041-1.737,0.105L12.707,5.15c-0.716,0.217-1.401,0.502-2.05,0.849L6.464,4.005C5.554,4.73,4.73,5.554,4.005,6.464l1.994,4.192c-0.347,0.648-0.632,1.334-0.849,2.05l-4.378,1.557C0.708,14.834,0.667,15.412,0.667,16s0.041,1.165,0.105,1.736l4.378,1.558c0.217,0.715,0.502,1.401,0.849,2.049l-1.994,4.193c0.725,0.909,1.549,1.733,2.459,2.458l4.192-1.993c0.648,0.347,1.334,0.633,2.05,0.851l1.557,4.377c0.571,0.064,1.148,0.104,1.737,0.104c0.588,0,1.165-0.04,1.736-0.104l1.558-4.377c0.715-0.218,1.399-0.504,2.049-0.851l4.193,1.993c0.909-0.725,1.733-1.549,2.458-2.458l-1.993-4.193c0.347-0.647,0.633-1.334,0.851-2.049L31.229,17.736zM16,20.871c-2.69,0-4.872-2.182-4.872-4.871c0-2.69,2.182-4.872,4.872-4.872c2.689,0,4.871,2.182,4.871,4.872C20.871,18.689,18.689,20.871,16,20.871z\"/>\n <title>Edge options.</title>\n </g>\n </g>\n `);\n }\n Markup.getEdgeToolMarkup = getEdgeToolMarkup;\n function getEdgeVertexMarkup() {\n return Markup.sanitize(`\n <g class=\"vertex-group\" transform=\"translate(<%= x %>, <%= y %>)\">\n <circle class=\"vertex\" data-index=\"<%= index %>\" r=\"10\" />\n <path class=\"vertex-remove-area\" data-index=\"<%= index %>\" d=\"M16,5.333c-7.732,0-14,4.701-14,10.5c0,1.982,0.741,3.833,2.016,5.414L2,25.667l5.613-1.441c2.339,1.317,5.237,2.107,8.387,2.107c7.732,0,14-4.701,14-10.5C30,10.034,23.732,5.333,16,5.333z\" transform=\"translate(5, -33)\"/>\n <path class=\"vertex-remove\" data-index=\"<%= index %>\" transform=\"scale(.8) translate(9.5, -37)\" d=\"M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z\">\n <title>Remove vertex.</title>\n </path>\n </g>\n `);\n }\n Markup.getEdgeVertexMarkup = getEdgeVertexMarkup;\n function getEdgeArrowheadMarkup() {\n return Markup.sanitize(`\n <g class=\"arrowhead-group arrowhead-group-<%= end %>\">\n <path class=\"arrowhead\" data-terminal=\"<%= end %>\" d=\"M 26 0 L 0 13 L 26 26 z\" />\n </g>\n `);\n }\n Markup.getEdgeArrowheadMarkup = getEdgeArrowheadMarkup;\n})(Markup || (Markup = {}));\n// eslint-disable-next-line\n(function (Markup) {\n function getForeignObjectMarkup(bare = false) {\n return {\n tagName: 'foreignObject',\n selector: 'fo',\n children: [\n {\n ns: Dom.ns.xhtml,\n tagName: 'body',\n selector: 'foBody',\n attrs: {\n xmlns: Dom.ns.xhtml,\n },\n style: {\n width: '100%',\n height: '100%',\n background: 'transparent',\n },\n children: bare\n ? []\n : [\n {\n tagName: 'div',\n selector: 'foContent',\n style: {\n width: '100%',\n height: '100%',\n },\n },\n ],\n },\n ],\n };\n }\n Markup.getForeignObjectMarkup = getForeignObjectMarkup;\n})(Markup || (Markup = {}));\n//# sourceMappingURL=markup.js.map","import { Dictionary } from '../common';\nimport { Dom } from '../util';\nexport class Cache {\n constructor(view) {\n this.view = view;\n this.clean();\n }\n clean() {\n if (this.elemCache) {\n this.elemCache.dispose();\n }\n this.elemCache = new Dictionary();\n this.pathCache = {};\n }\n get(elem) {\n const cache = this.elemCache;\n if (!cache.has(elem)) {\n this.elemCache.set(elem, {});\n }\n return this.elemCache.get(elem);\n }\n getData(elem) {\n const meta = this.get(elem);\n if (!meta.data) {\n meta.data = {};\n }\n return meta.data;\n }\n getMatrix(elem) {\n const meta = this.get(elem);\n if (meta.matrix == null) {\n const target = this.view.rotatableNode || this.view.container;\n meta.matrix = Dom.getTransformToElement(elem, target);\n }\n return Dom.createSVGMatrix(meta.matrix);\n }\n getShape(elem) {\n const meta = this.get(elem);\n if (meta.shape == null) {\n meta.shape = Dom.toGeometryShape(elem);\n }\n return meta.shape.clone();\n }\n getBoundingRect(elem) {\n const meta = this.get(elem);\n if (meta.boundingRect == null) {\n meta.boundingRect = Dom.getBBox(elem);\n }\n return meta.boundingRect.clone();\n }\n}\n//# sourceMappingURL=cache.js.map","import { ObjectExt, ArrayExt, Dom, FunctionExt, StringExt, Scheduler, } from '../util';\nimport { Point } from '../geometry';\nimport { Dictionary } from '../common';\nimport { Attr } from '../registry/attr';\nimport { View } from './view';\nexport class AttrManager {\n constructor(view) {\n this.view = view;\n }\n get cell() {\n return this.view.cell;\n }\n getDefinition(attrName) {\n return this.cell.getAttrDefinition(attrName);\n }\n processAttrs(elem, raw) {\n let normal;\n let set;\n let offset;\n let position;\n let delay;\n const specials = [];\n // divide the attributes between normal and special\n Object.keys(raw).forEach((name) => {\n const val = raw[name];\n const definition = this.getDefinition(name);\n const isValid = FunctionExt.call(Attr.isValidDefinition, this.view, definition, val, {\n elem,\n attrs: raw,\n cell: this.cell,\n view: this.view,\n });\n if (definition && isValid) {\n if (typeof definition === 'string') {\n if (normal == null) {\n normal = {};\n }\n normal[definition] = val;\n }\n else if (val !== null) {\n specials.push({ name, definition });\n }\n }\n else {\n if (normal == null) {\n normal = {};\n }\n const normalName = AttrManager.CASE_SENSITIVE_ATTR.includes(name)\n ? name\n : StringExt.kebabCase(name);\n normal[normalName] = val;\n }\n });\n specials.forEach(({ name, definition }) => {\n const val = raw[name];\n const setDefine = definition;\n if (typeof setDefine.set === 'function') {\n if (!Dom.isHTMLElement(elem) &&\n AttrManager.DELAY_ATTRS.includes(name)) {\n if (delay == null) {\n delay = {};\n }\n delay[name] = val;\n }\n else {\n if (set == null) {\n set = {};\n }\n set[name] = val;\n }\n }\n const offsetDefine = definition;\n if (typeof offsetDefine.offset === 'function') {\n if (offset == null) {\n offset = {};\n }\n offset[name] = val;\n }\n const positionDefine = definition;\n if (typeof positionDefine.position === 'function') {\n if (position == null) {\n position = {};\n }\n position[name] = val;\n }\n });\n return {\n raw,\n normal,\n set,\n offset,\n position,\n delay,\n };\n }\n mergeProcessedAttrs(allProcessedAttrs, roProcessedAttrs) {\n allProcessedAttrs.set = Object.assign(Object.assign({}, allProcessedAttrs.set), roProcessedAttrs.set);\n allProcessedAttrs.position = Object.assign(Object.assign({}, allProcessedAttrs.position), roProcessedAttrs.position);\n allProcessedAttrs.offset = Object.assign(Object.assign({}, allProcessedAttrs.offset), roProcessedAttrs.offset);\n // Handle also the special transform property.\n const transform = allProcessedAttrs.normal && allProcessedAttrs.normal.transform;\n if (transform != null && roProcessedAttrs.normal) {\n roProcessedAttrs.normal.transform = transform;\n }\n allProcessedAttrs.normal = roProcessedAttrs.normal;\n }\n findAttrs(cellAttrs, rootNode, selectorCache, selectors) {\n const merge = [];\n const result = new Dictionary();\n Object.keys(cellAttrs).forEach((selector) => {\n const attrs = cellAttrs[selector];\n if (!ObjectExt.isPlainObject(attrs)) {\n return;\n }\n const { isCSSSelector, elems } = View.find(selector, rootNode, selectors);\n selectorCache[selector] = elems;\n for (let i = 0, l = elems.length; i < l; i += 1) {\n const elem = elems[i];\n const unique = selectors && selectors[selector] === elem;\n const prev = result.get(elem);\n if (prev) {\n if (!prev.array) {\n merge.push(elem);\n prev.array = true;\n prev.attrs = [prev.attrs];\n prev.priority = [prev.priority];\n }\n const attributes = prev.attrs;\n const selectedLength = prev.priority;\n if (unique) {\n // node referenced by `selector`\n attributes.unshift(attrs);\n selectedLength.unshift(-1);\n }\n else {\n // node referenced by `groupSelector` or CSSSelector\n const sortIndex = ArrayExt.sortedIndex(selectedLength, isCSSSelector ? -1 : l);\n attributes.splice(sortIndex, 0, attrs);\n selectedLength.splice(sortIndex, 0, l);\n }\n }\n else {\n result.set(elem, {\n elem,\n attrs,\n priority: unique ? -1 : l,\n array: false,\n });\n }\n }\n });\n merge.forEach((node) => {\n const item = result.get(node);\n const arr = item.attrs;\n item.attrs = arr.reduceRight((memo, attrs) => ObjectExt.merge(memo, attrs), {});\n });\n return result;\n }\n updateRelativeAttrs(elem, processedAttrs, refBBox, options) {\n const rawAttrs = processedAttrs.raw || {};\n let nodeAttrs = processedAttrs.normal || {};\n const setAttrs = processedAttrs.set;\n const positionAttrs = processedAttrs.position;\n const offsetAttrs = processedAttrs.offset;\n const delayAttrs = processedAttrs.delay;\n const getOptions = () => ({\n elem,\n cell: this.cell,\n view: this.view,\n attrs: rawAttrs,\n refBBox: refBBox.clone(),\n });\n if (setAttrs != null) {\n Object.keys(setAttrs).forEach((name) => {\n const val = setAttrs[name];\n const def = this.getDefinition(name);\n if (def != null) {\n const ret = FunctionExt.call(def.set, this.view, val, getOptions());\n if (typeof ret === 'object') {\n nodeAttrs = Object.assign(Object.assign({}, nodeAttrs), ret);\n }\n else if (ret != null) {\n nodeAttrs[name] = ret;\n }\n }\n });\n }\n if (Dom.isHTMLElement(elem)) {\n // TODO: setting the `transform` attribute on HTMLElements\n // via `node.style.transform = 'matrix(...)';` would introduce\n // a breaking change (e.g. basic.TextBlock).\n this.view.setAttrs(nodeAttrs, elem);\n return;\n }\n // The final translation of the subelement.\n const nodeTransform = nodeAttrs.transform;\n const transform = nodeTransform ? `${nodeTransform}` : null;\n const nodeMatrix = Dom.transformStringToMatrix(transform);\n const nodePosition = new Point(nodeMatrix.e, nodeMatrix.f);\n if (nodeTransform) {\n delete nodeAttrs.transform;\n nodeMatrix.e = 0;\n nodeMatrix.f = 0;\n }\n // Calculates node scale determined by the scalable group.\n let sx = 1;\n let sy = 1;\n if (positionAttrs || offsetAttrs) {\n const scale = this.view.getScaleOfElement(elem, options.scalableNode);\n sx = scale.sx;\n sy = scale.sy;\n }\n let positioned = false;\n if (positionAttrs != null) {\n Object.keys(positionAttrs).forEach((name) => {\n const val = positionAttrs[name];\n const def = this.getDefinition(name);\n if (def != null) {\n const ts = FunctionExt.call(def.position, this.view, val, getOptions());\n if (ts != null) {\n positioned = true;\n nodePosition.translate(Point.create(ts).scale(sx, sy));\n }\n }\n });\n }\n // The node bounding box could depend on the `size`\n // set from the previous loop.\n this.view.setAttrs(nodeAttrs, elem);\n let offseted = false;\n if (offsetAttrs != null) {\n // Check if the node is visible\n const nodeBoundingRect = this.view.getBoundingRectOfElement(elem);\n if (nodeBoundingRect.width > 0 && nodeBoundingRect.height > 0) {\n const nodeBBox = Dom.transformRectangle(nodeBoundingRect, nodeMatrix).scale(1 / sx, 1 / sy);\n Object.keys(offsetAttrs).forEach((name) => {\n const val = offsetAttrs[name];\n const def = this.getDefinition(name);\n if (def != null) {\n const ts = FunctionExt.call(def.offset, this.view, val, {\n elem,\n cell: this.cell,\n view: this.view,\n attrs: rawAttrs,\n refBBox: nodeBBox,\n });\n if (ts != null) {\n offseted = true;\n nodePosition.translate(Point.create(ts).scale(sx, sy));\n }\n }\n });\n }\n }\n if (nodeTransform != null || positioned || offseted) {\n nodePosition.round(1);\n nodeMatrix.e = nodePosition.x;\n nodeMatrix.f = nodePosition.y;\n elem.setAttribute('transform', Dom.matrixToTransformString(nodeMatrix));\n }\n // delay render\n const updateDelayAttrs = () => {\n if (delayAttrs != null) {\n Object.keys(delayAttrs).forEach((name) => {\n const val = delayAttrs[name];\n const def = this.getDefinition(name);\n if (def != null) {\n const ret = FunctionExt.call(def.set, this.view, val, getOptions());\n if (typeof ret === 'object') {\n this.view.setAttrs(ret, elem);\n }\n else if (ret != null) {\n this.view.setAttrs({\n [name]: ret,\n }, elem);\n }\n }\n });\n }\n };\n if (options.forceSync) {\n updateDelayAttrs();\n }\n else {\n Scheduler.scheduleTask(updateDelayAttrs);\n }\n }\n update(rootNode, attrs, options) {\n const selectorCache = {};\n const nodesAttrs = this.findAttrs(options.attrs || attrs, rootNode, selectorCache, options.selectors);\n // `nodesAttrs` are different from all attributes, when\n // rendering only attributes sent to this method.\n const nodesAllAttrs = options.attrs\n ? this.findAttrs(attrs, rootNode, selectorCache, options.selectors)\n : nodesAttrs;\n const specialItems = [];\n nodesAttrs.each((data) => {\n const node = data.elem;\n const nodeAttrs = data.attrs;\n const processed = this.processAttrs(node, nodeAttrs);\n if (processed.set == null &&\n processed.position == null &&\n processed.offset == null &&\n processed.delay == null) {\n this.view.setAttrs(processed.normal, node);\n }\n else {\n const data = nodesAllAttrs.get(node);\n const nodeAllAttrs = data ? data.attrs : null;\n const refSelector = nodeAllAttrs && nodeAttrs.ref == null\n ? nodeAllAttrs.ref\n : nodeAttrs.ref;\n let refNode;\n if (refSelector) {\n refNode = (selectorCache[refSelector] ||\n this.view.find(refSelector, rootNode, options.selectors))[0];\n if (!refNode) {\n throw new Error(`\"${refSelector}\" reference does not exist.`);\n }\n }\n else {\n refNode = null;\n }\n const item = {\n node,\n refNode,\n attributes: nodeAllAttrs,\n processedAttributes: processed,\n };\n // If an element in the list is positioned relative to this one, then\n // we want to insert this one before it in the list.\n const index = specialItems.findIndex((item) => item.refNode === node);\n if (index > -1) {\n specialItems.splice(index, 0, item);\n }\n else {\n specialItems.push(item);\n }\n }\n });\n const bboxCache = new Dictionary();\n let rotatableMatrix;\n specialItems.forEach((item) => {\n const node = item.node;\n const refNode = item.refNode;\n let unrotatedRefBBox;\n const isRefNodeRotatable = refNode != null &&\n options.rotatableNode != null &&\n Dom.contains(options.rotatableNode, refNode);\n // Find the reference element bounding box. If no reference was\n // provided, we use the optional bounding box.\n if (refNode) {\n unrotatedRefBBox = bboxCache.get(refNode);\n }\n if (!unrotatedRefBBox) {\n const target = (isRefNodeRotatable ? options.rotatableNode : rootNode);\n unrotatedRefBBox = refNode\n ? Dom.getBBox(refNode, { target })\n : options.rootBBox;\n if (refNode) {\n bboxCache.set(refNode, unrotatedRefBBox);\n }\n }\n let processedAttrs;\n if (options.attrs && item.attributes) {\n // If there was a special attribute affecting the position amongst\n // passed-in attributes we have to merge it with the rest of the\n // element's attributes as they are necessary to update the position\n // relatively (i.e `ref-x` && 'ref-dx').\n processedAttrs = this.processAttrs(node, item.attributes);\n this.mergeProcessedAttrs(processedAttrs, item.processedAttributes);\n }\n else {\n processedAttrs = item.processedAttributes;\n }\n let refBBox = unrotatedRefBBox;\n if (isRefNodeRotatable &&\n options.rotatableNode != null &&\n !options.rotatableNode.contains(node)) {\n // If the referenced node is inside the rotatable group while the\n // updated node is outside, we need to take the rotatable node\n // transformation into account.\n if (!rotatableMatrix) {\n rotatableMatrix = Dom.transformStringToMatrix(Dom.attr(options.rotatableNode, 'transform'));\n }\n refBBox = Dom.transformRectangle(unrotatedRefBBox, rotatableMatrix);\n }\n const caller = specialItems.find((item) => item.refNode === node);\n if (caller) {\n options.forceSync = true;\n }\n this.updateRelativeAttrs(node, processedAttrs, refBBox, options);\n });\n }\n}\n(function (AttrManager) {\n AttrManager.CASE_SENSITIVE_ATTR = ['viewBox'];\n AttrManager.DELAY_ATTRS = [\n 'text',\n 'textWrap',\n 'sourceMarker',\n 'targetMarker',\n ];\n})(AttrManager || (AttrManager = {}));\n//# sourceMappingURL=attr.js.map","/* eslint-disable no-bitwise */\nexport class FlagManager {\n constructor(view, actions, bootstrap = []) {\n this.view = view;\n const flags = {};\n const attrs = {};\n let shift = 0;\n Object.keys(actions).forEach((attr) => {\n let labels = actions[attr];\n if (!Array.isArray(labels)) {\n labels = [labels];\n }\n labels.forEach((label) => {\n let flag = flags[label];\n if (!flag) {\n shift += 1;\n flag = flags[label] = 1 << shift;\n }\n attrs[attr] |= flag;\n });\n });\n let labels = bootstrap;\n if (!Array.isArray(labels)) {\n labels = [labels];\n }\n labels.forEach((label) => {\n if (!flags[label]) {\n shift += 1;\n flags[label] = 1 << shift;\n }\n });\n // 26 - 30 are reserved for paper flags\n // 31+ overflows maximal number\n if (shift > 25) {\n throw new Error('Maximum number of flags exceeded.');\n }\n this.flags = flags;\n this.attrs = attrs;\n this.bootstrap = bootstrap;\n }\n get cell() {\n return this.view.cell;\n }\n getFlag(label) {\n const flags = this.flags;\n if (flags == null) {\n return 0;\n }\n if (Array.isArray(label)) {\n return label.reduce((memo, key) => memo | flags[key], 0);\n }\n return flags[label] | 0;\n }\n hasAction(flag, label) {\n return flag & this.getFlag(label);\n }\n removeAction(flag, label) {\n return flag ^ (flag & this.getFlag(label));\n }\n getBootstrapFlag() {\n return this.getFlag(this.bootstrap);\n }\n getChangedFlag() {\n let flag = 0;\n if (!this.attrs) {\n return flag;\n }\n Object.keys(this.attrs).forEach((attr) => {\n if (this.cell.hasChanged(attr)) {\n flag |= this.attrs[attr];\n }\n });\n return flag;\n }\n}\n//# sourceMappingURL=flag.js.map","/* eslint-disable @typescript-eslint/no-unused-vars */\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Rectangle, Point } from '../geometry';\nimport { ArrayExt, ObjectExt, Dom, FunctionExt, Vector } from '../util';\nimport { Registry } from '../registry/registry';\nimport { ConnectionStrategy } from '../registry/connection-strategy';\nimport { View } from './view';\nimport { Cache } from './cache';\nimport { Markup } from './markup';\nimport { ToolsView } from './tool';\nimport { AttrManager } from './attr';\nimport { FlagManager } from './flag';\nexport class CellView extends View {\n constructor(cell, options = {}) {\n super();\n this.cell = cell;\n this.options = this.ensureOptions(options);\n this.graph = this.options.graph;\n this.attr = new AttrManager(this);\n this.flag = new FlagManager(this, this.options.actions, this.options.bootstrap);\n this.cache = new Cache(this);\n this.setContainer(this.ensureContainer());\n this.setup();\n this.$(this.container).data('view', this);\n this.init();\n }\n static getDefaults() {\n return this.defaults;\n }\n static config(options) {\n this.defaults = this.getOptions(options);\n }\n static getOptions(options) {\n const mergeActions = (arr1, arr2) => {\n if (arr2 != null) {\n return ArrayExt.uniq([\n ...(Array.isArray(arr1) ? arr1 : [arr1]),\n ...(Array.isArray(arr2) ? arr2 : [arr2]),\n ]);\n }\n return Array.isArray(arr1) ? [...arr1] : [arr1];\n };\n const ret = ObjectExt.cloneDeep(this.getDefaults());\n const { bootstrap, actions, events, documentEvents } = options, others = __rest(options, [\"bootstrap\", \"actions\", \"events\", \"documentEvents\"]);\n if (bootstrap) {\n ret.bootstrap = mergeActions(ret.bootstrap, bootstrap);\n }\n if (actions) {\n Object.keys(actions).forEach((key) => {\n const val = actions[key];\n const raw = ret.actions[key];\n if (val && raw) {\n ret.actions[key] = mergeActions(raw, val);\n }\n else if (val) {\n ret.actions[key] = mergeActions(val);\n }\n });\n }\n if (events) {\n ret.events = Object.assign(Object.assign({}, ret.events), events);\n }\n if (options.documentEvents) {\n ret.documentEvents = Object.assign(Object.assign({}, ret.documentEvents), documentEvents);\n }\n return ObjectExt.merge(ret, others);\n }\n get [Symbol.toStringTag]() {\n return CellView.toStringTag;\n }\n init() { }\n onRemove() {\n this.removeTools();\n }\n get priority() {\n return this.options.priority;\n }\n get rootSelector() {\n return this.options.rootSelector;\n }\n getConstructor() {\n return this.constructor;\n }\n ensureOptions(options) {\n return this.getConstructor().getOptions(options);\n }\n getContainerTagName() {\n return this.options.isSvgElement ? 'g' : 'div';\n }\n getContainerStyle() { }\n getContainerAttrs() {\n return {\n 'data-cell-id': this.cell.id,\n 'data-shape': this.cell.shape,\n };\n }\n getContainerClassName() {\n return this.prefixClassName('cell');\n }\n ensureContainer() {\n return View.createElement(this.getContainerTagName(), this.options.isSvgElement);\n }\n setContainer(container) {\n if (this.container !== container) {\n this.undelegateEvents();\n this.container = container;\n if (this.options.events != null) {\n this.delegateEvents(this.options.events);\n }\n const attrs = this.getContainerAttrs();\n if (attrs != null) {\n this.setAttrs(attrs, container);\n }\n const style = this.getContainerStyle();\n if (style != null) {\n this.setStyle(style, container);\n }\n const className = this.getContainerClassName();\n if (className != null) {\n this.addClass(className, container);\n }\n }\n return this;\n }\n isNodeView() {\n return false;\n }\n isEdgeView() {\n return false;\n }\n render() {\n return this;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n confirmUpdate(flag, options = {}) {\n return 0;\n }\n getBootstrapFlag() {\n return this.flag.getBootstrapFlag();\n }\n getFlag(actions) {\n return this.flag.getFlag(actions);\n }\n hasAction(flag, actions) {\n return this.flag.hasAction(flag, actions);\n }\n removeAction(flag, actions) {\n return this.flag.removeAction(flag, actions);\n }\n handleAction(flag, action, handle, additionalRemovedActions) {\n if (this.hasAction(flag, action)) {\n handle();\n const removedFlags = [action];\n if (additionalRemovedActions) {\n if (typeof additionalRemovedActions === 'string') {\n removedFlags.push(additionalRemovedActions);\n }\n else {\n removedFlags.push(...additionalRemovedActions);\n }\n }\n return this.removeAction(flag, removedFlags);\n }\n return flag;\n }\n setup() {\n this.cell.on('changed', ({ options }) => this.onAttrsChange(options));\n }\n onAttrsChange(options) {\n let flag = this.flag.getChangedFlag();\n if (options.updated || !flag) {\n return;\n }\n if (options.dirty && this.hasAction(flag, 'update')) {\n flag |= this.getFlag('render'); // eslint-disable-line no-bitwise\n }\n // tool changes should be sync render\n if (options.toolId) {\n options.async = false;\n }\n if (this.graph != null) {\n this.graph.renderer.requestViewUpdate(this, flag, this.priority, options);\n }\n }\n parseJSONMarkup(markup, rootElem) {\n const result = Markup.parseJSONMarkup(markup);\n const selectors = result.selectors;\n const rootSelector = this.rootSelector;\n if (rootElem && rootSelector) {\n if (selectors[rootSelector]) {\n throw new Error('Invalid root selector');\n }\n selectors[rootSelector] = rootElem;\n }\n return result;\n }\n can(feature) {\n let interacting = this.graph.options.interacting;\n if (typeof interacting === 'function') {\n interacting = FunctionExt.call(interacting, this.graph, this);\n }\n if (typeof interacting === 'object') {\n let val = interacting[feature];\n if (typeof val === 'function') {\n val = FunctionExt.call(val, this.graph, this);\n }\n return val !== false;\n }\n if (typeof interacting === 'boolean') {\n return interacting;\n }\n return false;\n }\n cleanCache() {\n this.cache.clean();\n return this;\n }\n getCache(elem) {\n return this.cache.get(elem);\n }\n getDataOfElement(elem) {\n return this.cache.getData(elem);\n }\n getMatrixOfElement(elem) {\n return this.cache.getMatrix(elem);\n }\n getShapeOfElement(elem) {\n return this.cache.getShape(elem);\n }\n getScaleOfElement(node, scalableNode) {\n let sx;\n let sy;\n if (scalableNode && scalableNode.contains(node)) {\n const scale = Dom.scale(scalableNode);\n sx = 1 / scale.sx;\n sy = 1 / scale.sy;\n }\n else {\n sx = 1;\n sy = 1;\n }\n return { sx, sy };\n }\n getBoundingRectOfElement(elem) {\n return this.cache.getBoundingRect(elem);\n }\n getBBoxOfElement(elem) {\n const rect = this.getBoundingRectOfElement(elem);\n const matrix = this.getMatrixOfElement(elem);\n const rm = this.getRootRotatedMatrix();\n const tm = this.getRootTranslatedMatrix();\n return Dom.transformRectangle(rect, tm.multiply(rm).multiply(matrix));\n }\n getUnrotatedBBoxOfElement(elem) {\n const rect = this.getBoundingRectOfElement(elem);\n const matrix = this.getMatrixOfElement(elem);\n const tm = this.getRootTranslatedMatrix();\n return Dom.transformRectangle(rect, tm.multiply(matrix));\n }\n getBBox(options = {}) {\n let bbox;\n if (options.useCellGeometry) {\n const cell = this.cell;\n const angle = cell.isNode() ? cell.getAngle() : 0;\n bbox = cell.getBBox().bbox(angle);\n }\n else {\n bbox = this.getBBoxOfElement(this.container);\n }\n return this.graph.localToGraph(bbox);\n }\n getRootTranslatedMatrix() {\n const cell = this.cell;\n const pos = cell.isNode() ? cell.getPosition() : { x: 0, y: 0 };\n return Dom.createSVGMatrix().translate(pos.x, pos.y);\n }\n getRootRotatedMatrix() {\n let matrix = Dom.createSVGMatrix();\n const cell = this.cell;\n const angle = cell.isNode() ? cell.getAngle() : 0;\n if (angle) {\n const bbox = cell.getBBox();\n const cx = bbox.width / 2;\n const cy = bbox.height / 2;\n matrix = matrix.translate(cx, cy).rotate(angle).translate(-cx, -cy);\n }\n return matrix;\n }\n findMagnet(elem = this.container) {\n // If the overall cell has set `magnet === false`, then returns\n // `undefined` to announce there is no magnet found for this cell.\n // This is especially useful to set on cells that have 'ports'.\n // In this case, only the ports have set `magnet === true` and the\n // overall element has `magnet === false`.\n return this.findByAttr('magnet', elem);\n }\n updateAttrs(rootNode, attrs, options = {}) {\n if (options.rootBBox == null) {\n options.rootBBox = new Rectangle();\n }\n if (options.selectors == null) {\n options.selectors = this.selectors;\n }\n this.attr.update(rootNode, attrs, options);\n }\n isEdgeElement(magnet) {\n return this.cell.isEdge() && (magnet == null || magnet === this.container);\n }\n // #region highlight\n prepareHighlight(elem, options = {}) {\n const magnet = (elem && this.$(elem)[0]) || this.container;\n options.partial = magnet === this.container;\n return magnet;\n }\n highlight(elem, options = {}) {\n const magnet = this.prepareHighlight(elem, options);\n this.notify('cell:highlight', {\n magnet,\n options,\n view: this,\n cell: this.cell,\n });\n if (this.isEdgeView()) {\n this.notify('edge:highlight', {\n magnet,\n options,\n view: this,\n edge: this.cell,\n cell: this.cell,\n });\n }\n else if (this.isNodeView()) {\n this.notify('node:highlight', {\n magnet,\n options,\n view: this,\n node: this.cell,\n cell: this.cell,\n });\n }\n return this;\n }\n unhighlight(elem, options = {}) {\n const magnet = this.prepareHighlight(elem, options);\n this.notify('cell:unhighlight', {\n magnet,\n options,\n view: this,\n cell: this.cell,\n });\n if (this.isNodeView()) {\n this.notify('node:unhighlight', {\n magnet,\n options,\n view: this,\n node: this.cell,\n cell: this.cell,\n });\n }\n else if (this.isEdgeView()) {\n this.notify('edge:unhighlight', {\n magnet,\n options,\n view: this,\n edge: this.cell,\n cell: this.cell,\n });\n }\n return this;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n notifyUnhighlight(magnet, options) { }\n // #endregion\n getEdgeTerminal(magnet, x, y, edge, type) {\n const cell = this.cell;\n const portId = this.findAttr('port', magnet);\n const selector = magnet.getAttribute('data-selector');\n const terminal = { cell: cell.id };\n if (selector != null) {\n terminal.magnet = selector;\n }\n if (portId != null) {\n terminal.port = portId;\n if (cell.isNode()) {\n if (!cell.hasPort(portId) && selector == null) {\n // port created via the `port` attribute (not API)\n terminal.selector = this.getSelector(magnet);\n }\n }\n }\n else if (selector == null && this.container !== magnet) {\n terminal.selector = this.getSelector(magnet);\n }\n return this.customizeEdgeTerminal(terminal, magnet, x, y, edge, type);\n }\n customizeEdgeTerminal(terminal, magnet, x, y, edge, type) {\n const raw = edge.getStrategy() || this.graph.options.connecting.strategy;\n if (raw) {\n const name = typeof raw === 'string' ? raw : raw.name;\n const args = typeof raw === 'string' ? {} : raw.args || {};\n const registry = ConnectionStrategy.registry;\n if (name) {\n const fn = registry.get(name);\n if (fn == null) {\n return registry.onNotFound(name);\n }\n const result = FunctionExt.call(fn, this.graph, terminal, this, magnet, new Point(x, y), edge, type, args);\n if (result) {\n return result;\n }\n }\n }\n return terminal;\n }\n getMagnetFromEdgeTerminal(terminal) {\n const cell = this.cell;\n const root = this.container;\n const portId = terminal.port;\n let selector = terminal.magnet;\n let magnet;\n if (portId != null && cell.isNode() && cell.hasPort(portId)) {\n magnet = this.findPortElem(portId, selector) || root;\n }\n else {\n if (!selector) {\n selector = terminal.selector;\n }\n if (!selector && portId != null) {\n selector = `[port=\"${portId}\"]`;\n }\n magnet = this.findOne(selector, root, this.selectors);\n }\n return magnet;\n }\n // #region animate\n animate(elem, options) {\n const target = typeof elem === 'string' ? this.findOne(elem) : elem;\n if (target == null) {\n throw new Error('Invalid animation element.');\n }\n const parent = target.parentNode;\n const revert = () => {\n if (!parent) {\n Dom.remove(target);\n }\n };\n const vTarget = Vector.create(target);\n if (!parent) {\n vTarget.appendTo(this.graph.view.stage);\n }\n const onComplete = options.complete;\n options.complete = (e) => {\n revert();\n if (onComplete) {\n onComplete(e);\n }\n };\n return vTarget.animate(options);\n }\n animateTransform(elem, options) {\n const target = typeof elem === 'string' ? this.findOne(elem) : elem;\n if (target == null) {\n throw new Error('Invalid animation element.');\n }\n const parent = target.parentNode;\n const revert = () => {\n if (!parent) {\n Dom.remove(target);\n }\n };\n const vTarget = Vector.create(target);\n if (!parent) {\n vTarget.appendTo(this.graph.view.stage);\n }\n const onComplete = options.complete;\n options.complete = (e) => {\n revert();\n if (onComplete) {\n onComplete(e);\n }\n };\n return vTarget.animateTransform(options);\n }\n hasTools(name) {\n const tools = this.tools;\n if (tools == null) {\n return false;\n }\n if (name == null) {\n return true;\n }\n return tools.name === name;\n }\n addTools(config) {\n if (!this.can('toolsAddable')) {\n return this;\n }\n this.removeTools();\n if (config) {\n const tools = ToolsView.isToolsView(config)\n ? config\n : new ToolsView(config);\n this.tools = tools;\n this.graph.on('tools:hide', this.hideTools, this);\n this.graph.on('tools:show', this.showTools, this);\n this.graph.on('tools:remove', this.removeTools, this);\n tools.config({ view: this });\n tools.mount();\n }\n return this;\n }\n updateTools(options = {}) {\n if (this.tools) {\n this.tools.update(options);\n }\n return this;\n }\n removeTools() {\n if (this.tools) {\n this.tools.remove();\n this.graph.off('tools:hide', this.hideTools, this);\n this.graph.off('tools:show', this.showTools, this);\n this.graph.off('tools:remove', this.removeTools, this);\n this.tools = null;\n }\n return this;\n }\n hideTools() {\n if (this.tools) {\n this.tools.hide();\n }\n return this;\n }\n showTools() {\n if (this.tools) {\n this.tools.show();\n }\n return this;\n }\n renderTools() {\n const tools = this.cell.getTools();\n this.addTools(tools);\n return this;\n }\n notify(name, args) {\n this.trigger(name, args);\n this.graph.trigger(name, args);\n return this;\n }\n getEventArgs(e, x, y) {\n const view = this; // eslint-disable-line @typescript-eslint/no-this-alias\n const cell = view.cell;\n if (x == null || y == null) {\n return { e, view, cell };\n }\n return { e, x, y, view, cell };\n }\n onClick(e, x, y) {\n this.notify('cell:click', this.getEventArgs(e, x, y));\n }\n onDblClick(e, x, y) {\n this.notify('cell:dblclick', this.getEventArgs(e, x, y));\n }\n onContextMenu(e, x, y) {\n this.notify('cell:contextmenu', this.getEventArgs(e, x, y));\n }\n onMouseDown(e, x, y) {\n if (this.cell.model) {\n this.cachedModelForMouseEvent = this.cell.model;\n this.cachedModelForMouseEvent.startBatch('mouse');\n }\n this.notify('cell:mousedown', this.getEventArgs(e, x, y));\n }\n onMouseUp(e, x, y) {\n this.notify('cell:mouseup', this.getEventArgs(e, x, y));\n if (this.cachedModelForMouseEvent) {\n this.cachedModelForMouseEvent.stopBatch('mouse', { cell: this.cell });\n this.cachedModelForMouseEvent = null;\n }\n }\n onMouseMove(e, x, y) {\n this.notify('cell:mousemove', this.getEventArgs(e, x, y));\n }\n onMouseOver(e) {\n this.notify('cell:mouseover', this.getEventArgs(e));\n }\n onMouseOut(e) {\n this.notify('cell:mouseout', this.getEventArgs(e));\n }\n onMouseEnter(e) {\n this.notify('cell:mouseenter', this.getEventArgs(e));\n }\n onMouseLeave(e) {\n this.notify('cell:mouseleave', this.getEventArgs(e));\n }\n onMouseWheel(e, x, y, delta) {\n this.notify('cell:mousewheel', Object.assign({ delta }, this.getEventArgs(e, x, y)));\n }\n onCustomEvent(e, name, x, y) {\n this.notify('cell:customevent', Object.assign({ name }, this.getEventArgs(e, x, y)));\n this.notify(name, Object.assign({}, this.getEventArgs(e, x, y)));\n }\n onMagnetMouseDown(e, magnet, x, y) { }\n onMagnetDblClick(e, magnet, x, y) { }\n onMagnetContextMenu(e, magnet, x, y) { }\n onLabelMouseDown(e, x, y) { }\n checkMouseleave(e) {\n const graph = this.graph;\n if (graph.renderer.isAsync()) {\n // Do the updates of the current view synchronously now\n graph.renderer.dumpView(this);\n }\n const target = this.getEventTarget(e, { fromPoint: true });\n const view = graph.renderer.findViewByElem(target);\n if (view === this) {\n return;\n }\n // Leaving the current view\n this.onMouseLeave(e);\n if (!view) {\n return;\n }\n // Entering another view\n view.onMouseEnter(e);\n }\n}\nCellView.defaults = {\n isSvgElement: true,\n rootSelector: 'root',\n priority: 0,\n bootstrap: [],\n actions: {},\n};\n(function (CellView) {\n CellView.Flag = FlagManager;\n CellView.Attr = AttrManager;\n})(CellView || (CellView = {}));\n(function (CellView) {\n CellView.toStringTag = `X6.${CellView.name}`;\n function isCellView(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof CellView) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const view = instance;\n if ((tag == null || tag === CellView.toStringTag) &&\n typeof view.isNodeView === 'function' &&\n typeof view.isEdgeView === 'function' &&\n typeof view.confirmUpdate === 'function') {\n return true;\n }\n return false;\n }\n CellView.isCellView = isCellView;\n})(CellView || (CellView = {}));\n// decorators\n// ----\n(function (CellView) {\n function priority(value) {\n return function (ctor) {\n ctor.config({ priority: value });\n };\n }\n CellView.priority = priority;\n function bootstrap(actions) {\n return function (ctor) {\n ctor.config({ bootstrap: actions });\n };\n }\n CellView.bootstrap = bootstrap;\n})(CellView || (CellView = {}));\n(function (CellView) {\n CellView.registry = Registry.create({\n type: 'view',\n });\n})(CellView || (CellView = {}));\n//# sourceMappingURL=cell.js.map","import { Dom, ObjectExt, StringExt } from '../util';\nimport { NodeTool, EdgeTool } from '../registry/tool';\nimport { View } from './view';\nimport { CellView } from './cell';\nimport { Markup } from './markup';\nexport class ToolsView extends View {\n constructor(options = {}) {\n super();\n this.svgContainer = this.createContainer(true, options);\n this.htmlContainer = this.createContainer(false, options);\n this.config(options);\n }\n get name() {\n return this.options.name;\n }\n get graph() {\n return this.cellView.graph;\n }\n get cell() {\n return this.cellView.cell;\n }\n get [Symbol.toStringTag]() {\n return ToolsView.toStringTag;\n }\n createContainer(svg, options) {\n const container = svg\n ? View.createElement('g', true)\n : View.createElement('div', false);\n Dom.addClass(container, this.prefixClassName('cell-tools'));\n if (options.className) {\n Dom.addClass(container, options.className);\n }\n return container;\n }\n config(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n if (!CellView.isCellView(options.view) || options.view === this.cellView) {\n return this;\n }\n this.cellView = options.view;\n if (this.cell.isEdge()) {\n Dom.addClass(this.svgContainer, this.prefixClassName('edge-tools'));\n Dom.addClass(this.htmlContainer, this.prefixClassName('edge-tools'));\n }\n else if (this.cell.isNode()) {\n Dom.addClass(this.svgContainer, this.prefixClassName('node-tools'));\n Dom.addClass(this.htmlContainer, this.prefixClassName('node-tools'));\n }\n this.svgContainer.setAttribute('data-cell-id', this.cell.id);\n this.htmlContainer.setAttribute('data-cell-id', this.cell.id);\n if (this.name) {\n this.svgContainer.setAttribute('data-tools-name', this.name);\n this.htmlContainer.setAttribute('data-tools-name', this.name);\n }\n const tools = this.options.items;\n if (!Array.isArray(tools)) {\n return this;\n }\n this.tools = [];\n const normalizedTools = [];\n tools.forEach((meta) => {\n if (ToolsView.ToolItem.isToolItem(meta)) {\n if (meta.name === 'vertices') {\n normalizedTools.unshift(meta);\n }\n else {\n normalizedTools.push(meta);\n }\n }\n else {\n const name = typeof meta === 'object' ? meta.name : meta;\n if (name === 'vertices') {\n normalizedTools.unshift(meta);\n }\n else {\n normalizedTools.push(meta);\n }\n }\n });\n for (let i = 0; i < normalizedTools.length; i += 1) {\n const meta = normalizedTools[i];\n let tool;\n if (ToolsView.ToolItem.isToolItem(meta)) {\n tool = meta;\n }\n else {\n const name = typeof meta === 'object' ? meta.name : meta;\n const args = typeof meta === 'object' ? meta.args || {} : {};\n if (name) {\n if (this.cell.isNode()) {\n const ctor = NodeTool.registry.get(name);\n if (ctor) {\n tool = new ctor(args); // eslint-disable-line\n }\n else {\n return NodeTool.registry.onNotFound(name);\n }\n }\n else if (this.cell.isEdge()) {\n const ctor = EdgeTool.registry.get(name);\n if (ctor) {\n tool = new ctor(args); // eslint-disable-line\n }\n else {\n return EdgeTool.registry.onNotFound(name);\n }\n }\n }\n }\n if (tool) {\n tool.config(this.cellView, this);\n tool.render();\n const container = tool.options.isSVGElement !== false\n ? this.svgContainer\n : this.htmlContainer;\n container.appendChild(tool.container);\n this.tools.push(tool);\n }\n }\n return this;\n }\n update(options = {}) {\n const tools = this.tools;\n if (tools) {\n tools.forEach((tool) => {\n if (options.toolId !== tool.cid && tool.isVisible()) {\n tool.update();\n }\n });\n }\n return this;\n }\n focus(focusedTool) {\n const tools = this.tools;\n if (tools) {\n tools.forEach((tool) => {\n if (focusedTool === tool) {\n tool.show();\n }\n else {\n tool.hide();\n }\n });\n }\n return this;\n }\n blur(blurredTool) {\n const tools = this.tools;\n if (tools) {\n tools.forEach((tool) => {\n if (tool !== blurredTool && !tool.isVisible()) {\n tool.show();\n tool.update();\n }\n });\n }\n return this;\n }\n hide() {\n return this.focus(null);\n }\n show() {\n return this.blur(null);\n }\n remove() {\n const tools = this.tools;\n if (tools) {\n tools.forEach((tool) => tool.remove());\n this.tools = null;\n }\n Dom.remove(this.svgContainer);\n Dom.remove(this.htmlContainer);\n return super.remove();\n }\n mount() {\n const tools = this.tools;\n const cellView = this.cellView;\n if (cellView && tools) {\n const hasSVG = tools.some((tool) => tool.options.isSVGElement !== false);\n const hasHTML = tools.some((tool) => tool.options.isSVGElement === false);\n if (hasSVG) {\n const parent = this.options.local\n ? cellView.container\n : cellView.graph.view.decorator;\n parent.appendChild(this.svgContainer);\n }\n if (hasHTML) {\n this.graph.container.appendChild(this.htmlContainer);\n }\n }\n return this;\n }\n}\n(function (ToolsView) {\n ToolsView.toStringTag = `X6.${ToolsView.name}`;\n function isToolsView(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof ToolsView) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const view = instance;\n if ((tag == null || tag === ToolsView.toStringTag) &&\n view.graph != null &&\n view.cell != null &&\n typeof view.config === 'function' &&\n typeof view.update === 'function' &&\n typeof view.focus === 'function' &&\n typeof view.blur === 'function' &&\n typeof view.show === 'function' &&\n typeof view.hide === 'function') {\n return true;\n }\n return false;\n }\n ToolsView.isToolsView = isToolsView;\n})(ToolsView || (ToolsView = {}));\n(function (ToolsView) {\n class ToolItem extends View {\n constructor(options = {}) {\n super();\n this.options = this.getOptions(options);\n this.container = View.createElement(this.options.tagName || 'g', this.options.isSVGElement !== false);\n Dom.addClass(this.container, this.prefixClassName('cell-tool'));\n if (typeof this.options.className === 'string') {\n Dom.addClass(this.container, this.options.className);\n }\n this.init();\n }\n static getDefaults() {\n return this.defaults;\n }\n static config(options) {\n this.defaults = this.getOptions(options);\n }\n static getOptions(options) {\n return ObjectExt.merge(ObjectExt.cloneDeep(this.getDefaults()), options);\n }\n get graph() {\n return this.cellView.graph;\n }\n get cell() {\n return this.cellView.cell;\n }\n get name() {\n return this.options.name;\n }\n get [Symbol.toStringTag]() {\n return ToolItem.toStringTag;\n }\n init() { }\n getOptions(options) {\n const ctor = this.constructor;\n return ctor.getOptions(options);\n }\n delegateEvents() {\n if (this.options.events) {\n super.delegateEvents(this.options.events);\n }\n return this;\n }\n config(view, toolsView) {\n this.cellView = view;\n this.parent = toolsView;\n this.stamp(this.container);\n if (this.cell.isEdge()) {\n Dom.addClass(this.container, this.prefixClassName('edge-tool'));\n }\n else if (this.cell.isNode()) {\n Dom.addClass(this.container, this.prefixClassName('node-tool'));\n }\n if (this.name) {\n this.container.setAttribute('data-tool-name', this.name);\n }\n this.delegateEvents();\n return this;\n }\n render() {\n this.empty();\n const markup = this.options.markup;\n if (markup) {\n const meta = Markup.isStringMarkup(markup)\n ? Markup.parseStringMarkup(markup)\n : Markup.parseJSONMarkup(markup);\n this.container.appendChild(meta.fragment);\n this.childNodes = meta.selectors;\n }\n this.onRender();\n return this;\n }\n onRender() { }\n update() {\n return this;\n }\n stamp(elem = this.container) {\n if (elem) {\n elem.setAttribute('data-cell-id', this.cellView.cell.id);\n }\n }\n show() {\n this.container.style.display = '';\n this.visible = true;\n return this;\n }\n hide() {\n this.container.style.display = 'none';\n this.visible = false;\n return this;\n }\n isVisible() {\n return this.visible;\n }\n focus() {\n const opacity = this.options.focusOpacity;\n if (opacity != null && Number.isFinite(opacity)) {\n this.container.style.opacity = `${opacity}`;\n }\n this.parent.focus(this);\n return this;\n }\n blur() {\n this.container.style.opacity = '';\n this.parent.blur(this);\n return this;\n }\n guard(evt) {\n if (this.graph == null || this.cellView == null) {\n return true;\n }\n return this.graph.view.guard(evt, this.cellView);\n }\n }\n // #region static\n ToolItem.defaults = {\n isSVGElement: true,\n tagName: 'g',\n };\n ToolsView.ToolItem = ToolItem;\n (function (ToolItem) {\n let counter = 0;\n function getClassName(name) {\n if (name) {\n return StringExt.pascalCase(name);\n }\n counter += 1;\n return `CustomTool${counter}`;\n }\n function define(options) {\n const tool = ObjectExt.createClass(getClassName(options.name), this);\n tool.config(options);\n return tool;\n }\n ToolItem.define = define;\n })(ToolItem = ToolsView.ToolItem || (ToolsView.ToolItem = {}));\n (function (ToolItem) {\n ToolItem.toStringTag = `X6.${ToolItem.name}`;\n function isToolItem(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof ToolItem) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const view = instance;\n if ((tag == null || tag === ToolItem.toStringTag) &&\n view.graph != null &&\n view.cell != null &&\n typeof view.config === 'function' &&\n typeof view.update === 'function' &&\n typeof view.focus === 'function' &&\n typeof view.blur === 'function' &&\n typeof view.show === 'function' &&\n typeof view.hide === 'function' &&\n typeof view.isVisible === 'function') {\n return true;\n }\n return false;\n }\n ToolItem.isToolItem = isToolItem;\n })(ToolItem = ToolsView.ToolItem || (ToolsView.ToolItem = {}));\n})(ToolsView || (ToolsView = {}));\n//# sourceMappingURL=tool.js.map","import { FunctionExt } from '../../util';\nimport { ConnectionStrategy } from '../connection-strategy';\nexport function getAnchor(pos, terminalView, terminalMagnet, type) {\n const end = FunctionExt.call(ConnectionStrategy.presets.pinRelative, this.graph, {}, terminalView, terminalMagnet, pos, this.cell, type, {});\n return end.anchor;\n}\nexport function getViewBBox(view, quick) {\n if (quick) {\n return view.cell.getBBox();\n }\n return view.cell.isEdge()\n ? view.getConnection().bbox()\n : view.getUnrotatedBBoxOfElement(view.container);\n}\n//# sourceMappingURL=util.js.map","import { Point } from '../../geometry';\nimport { Dom, NumberExt, FunctionExt } from '../../util';\nimport { ToolsView } from '../../view/tool';\nimport * as Util from './util';\nexport class Button extends ToolsView.ToolItem {\n onRender() {\n Dom.addClass(this.container, this.prefixClassName('cell-tool-button'));\n this.update();\n }\n update() {\n this.updatePosition();\n return this;\n }\n updatePosition() {\n const view = this.cellView;\n const matrix = view.cell.isEdge()\n ? this.getEdgeMatrix()\n : this.getNodeMatrix();\n Dom.transform(this.container, matrix, { absolute: true });\n }\n getNodeMatrix() {\n const view = this.cellView;\n const options = this.options;\n let { x = 0, y = 0 } = options;\n const { offset, useCellGeometry, rotate } = options;\n let bbox = Util.getViewBBox(view, useCellGeometry);\n const angle = view.cell.getAngle();\n if (!rotate) {\n bbox = bbox.bbox(angle);\n }\n let offsetX = 0;\n let offsetY = 0;\n if (typeof offset === 'number') {\n offsetX = offset;\n offsetY = offset;\n }\n else if (typeof offset === 'object') {\n offsetX = offset.x;\n offsetY = offset.y;\n }\n x = NumberExt.normalizePercentage(x, bbox.width);\n y = NumberExt.normalizePercentage(y, bbox.height);\n let matrix = Dom.createSVGMatrix().translate(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2);\n if (rotate) {\n matrix = matrix.rotate(angle);\n }\n matrix = matrix.translate(x + offsetX - bbox.width / 2, y + offsetY - bbox.height / 2);\n return matrix;\n }\n getEdgeMatrix() {\n const view = this.cellView;\n const options = this.options;\n const { offset = 0, distance = 0, rotate } = options;\n let tangent;\n let position;\n let angle;\n if (NumberExt.isPercentage(distance)) {\n tangent = view.getTangentAtRatio(parseFloat(distance) / 100);\n }\n else {\n tangent = view.getTangentAtLength(distance);\n }\n if (tangent) {\n position = tangent.start;\n angle = tangent.vector().vectorAngle(new Point(1, 0)) || 0;\n }\n else {\n position = view.getConnection().start;\n angle = 0;\n }\n let matrix = Dom.createSVGMatrix()\n .translate(position.x, position.y)\n .rotate(angle);\n if (typeof offset === 'object') {\n matrix = matrix.translate(offset.x || 0, offset.y || 0);\n }\n else {\n matrix = matrix.translate(0, offset);\n }\n if (!rotate) {\n matrix = matrix.rotate(-angle);\n }\n return matrix;\n }\n onMouseDown(e) {\n if (this.guard(e)) {\n return;\n }\n e.stopPropagation();\n e.preventDefault();\n const onClick = this.options.onClick;\n if (typeof onClick === 'function') {\n FunctionExt.call(onClick, this.cellView, {\n e,\n view: this.cellView,\n cell: this.cellView.cell,\n btn: this,\n });\n }\n }\n}\n(function (Button) {\n Button.config({\n name: 'button',\n events: {\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n },\n });\n})(Button || (Button = {}));\n(function (Button) {\n Button.Remove = Button.define({\n name: 'button-remove',\n markup: [\n {\n tagName: 'circle',\n selector: 'button',\n attrs: {\n r: 7,\n fill: '#FF1D00',\n cursor: 'pointer',\n },\n },\n {\n tagName: 'path',\n selector: 'icon',\n attrs: {\n d: 'M -3 -3 3 3 M -3 3 3 -3',\n fill: 'none',\n stroke: '#FFFFFF',\n 'stroke-width': 2,\n 'pointer-events': 'none',\n },\n },\n ],\n distance: 60,\n offset: 0,\n onClick({ view, btn }) {\n btn.parent.remove();\n view.cell.remove({ ui: true, toolId: btn.cid });\n },\n });\n})(Button || (Button = {}));\n//# sourceMappingURL=button.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { NumberExt, Dom } from '../../util';\nimport { ToolsView } from '../../view/tool';\nimport * as Util from './util';\nexport class Boundary extends ToolsView.ToolItem {\n onRender() {\n Dom.addClass(this.container, this.prefixClassName('cell-tool-boundary'));\n if (this.options.attrs) {\n const _a = this.options.attrs, { class: className } = _a, attrs = __rest(_a, [\"class\"]);\n Dom.attr(this.container, Dom.kebablizeAttrs(attrs));\n if (className) {\n Dom.addClass(this.container, className);\n }\n }\n this.update();\n }\n update() {\n const view = this.cellView;\n const options = this.options;\n const { useCellGeometry, rotate } = options;\n const padding = NumberExt.normalizeSides(options.padding);\n let bbox = Util.getViewBBox(view, useCellGeometry).moveAndExpand({\n x: -padding.left,\n y: -padding.top,\n width: padding.left + padding.right,\n height: padding.top + padding.bottom,\n });\n const cell = view.cell;\n if (cell.isNode()) {\n const angle = cell.getAngle();\n if (angle) {\n if (rotate) {\n const origin = cell.getBBox().getCenter();\n Dom.rotate(this.container, angle, origin.x, origin.y, {\n absolute: true,\n });\n }\n else {\n bbox = bbox.bbox(angle);\n }\n }\n }\n Dom.attr(this.container, bbox.toJSON());\n return this;\n }\n}\n(function (Boundary) {\n Boundary.config({\n name: 'boundary',\n tagName: 'rect',\n padding: 10,\n attrs: {\n fill: 'none',\n stroke: '#333',\n 'stroke-width': 0.5,\n 'stroke-dasharray': '5, 5',\n 'pointer-events': 'none',\n },\n });\n})(Boundary || (Boundary = {}));\n//# sourceMappingURL=boundary.js.map","import { Util } from '../../global/util';\nimport { Point } from '../../geometry';\nimport { View } from '../../view/view';\nimport { ToolsView } from '../../view/tool';\nexport class Vertices extends ToolsView.ToolItem {\n constructor() {\n super(...arguments);\n this.handles = [];\n }\n get vertices() {\n return this.cellView.cell.getVertices();\n }\n onRender() {\n this.addClass(this.prefixClassName('edge-tool-vertices'));\n if (this.options.addable) {\n this.updatePath();\n }\n this.resetHandles();\n this.renderHandles();\n return this;\n }\n update() {\n const vertices = this.vertices;\n if (vertices.length === this.handles.length) {\n this.updateHandles();\n }\n else {\n this.resetHandles();\n this.renderHandles();\n }\n if (this.options.addable) {\n this.updatePath();\n }\n return this;\n }\n resetHandles() {\n const handles = this.handles;\n this.handles = [];\n if (handles) {\n handles.forEach((handle) => {\n this.stopHandleListening(handle);\n handle.remove();\n });\n }\n }\n renderHandles() {\n const vertices = this.vertices;\n for (let i = 0, l = vertices.length; i < l; i += 1) {\n const vertex = vertices[i];\n const createHandle = this.options.createHandle;\n const processHandle = this.options.processHandle;\n const handle = createHandle({\n index: i,\n graph: this.graph,\n guard: (evt) => this.guard(evt),\n attrs: this.options.attrs || {},\n });\n if (processHandle) {\n processHandle(handle);\n }\n this.graph.hook.onToolItemCreated({\n name: 'vertices',\n cell: this.cell,\n view: this.cellView,\n tool: handle,\n });\n handle.updatePosition(vertex.x, vertex.y);\n this.stamp(handle.container);\n this.container.appendChild(handle.container);\n this.handles.push(handle);\n this.startHandleListening(handle);\n }\n }\n updateHandles() {\n const vertices = this.vertices;\n for (let i = 0, l = vertices.length; i < l; i += 1) {\n const vertex = vertices[i];\n const handle = this.handles[i];\n if (handle) {\n handle.updatePosition(vertex.x, vertex.y);\n }\n }\n }\n updatePath() {\n const connection = this.childNodes.connection;\n if (connection) {\n connection.setAttribute('d', this.cellView.getConnectionPathData());\n }\n }\n startHandleListening(handle) {\n const edgeView = this.cellView;\n if (edgeView.can('vertexMovable')) {\n handle.on('change', this.onHandleChange, this);\n handle.on('changing', this.onHandleChanging, this);\n handle.on('changed', this.onHandleChanged, this);\n }\n if (edgeView.can('vertexDeletable')) {\n handle.on('remove', this.onHandleRemove, this);\n }\n }\n stopHandleListening(handle) {\n const edgeView = this.cellView;\n if (edgeView.can('vertexMovable')) {\n handle.off('change', this.onHandleChange, this);\n handle.off('changing', this.onHandleChanging, this);\n handle.off('changed', this.onHandleChanged, this);\n }\n if (edgeView.can('vertexDeletable')) {\n handle.off('remove', this.onHandleRemove, this);\n }\n }\n getNeighborPoints(index) {\n const edgeView = this.cellView;\n const vertices = this.vertices;\n const prev = index > 0 ? vertices[index - 1] : edgeView.sourceAnchor;\n const next = index < vertices.length - 1 ? vertices[index + 1] : edgeView.targetAnchor;\n return {\n prev: Point.create(prev),\n next: Point.create(next),\n };\n }\n getMouseEventArgs(evt) {\n const e = this.normalizeEvent(evt);\n const { x, y } = this.graph.snapToGrid(e.clientX, e.clientY);\n return { e, x, y };\n }\n onHandleChange({ e }) {\n this.focus();\n const edgeView = this.cellView;\n edgeView.cell.startBatch('move-vertex', { ui: true, toolId: this.cid });\n if (!this.options.stopPropagation) {\n const { e: evt, x, y } = this.getMouseEventArgs(e);\n edgeView.notifyMouseDown(evt, x, y);\n }\n }\n onHandleChanging({ handle, e, }) {\n const edgeView = this.cellView;\n const index = handle.options.index;\n const { e: evt, x, y } = this.getMouseEventArgs(e);\n const vertex = { x, y };\n this.snapVertex(vertex, index);\n edgeView.cell.setVertexAt(index, vertex, { ui: true, toolId: this.cid });\n handle.updatePosition(vertex.x, vertex.y);\n if (!this.options.stopPropagation) {\n edgeView.notifyMouseMove(evt, x, y);\n }\n }\n onHandleChanged({ e }) {\n const options = this.options;\n const edgeView = this.cellView;\n if (options.addable) {\n this.updatePath();\n }\n if (!options.removeRedundancies) {\n return;\n }\n const verticesRemoved = edgeView.removeRedundantLinearVertices({\n ui: true,\n toolId: this.cid,\n });\n if (verticesRemoved) {\n this.render();\n }\n this.blur();\n edgeView.cell.stopBatch('move-vertex', { ui: true, toolId: this.cid });\n if (this.eventData(e).vertexAdded) {\n edgeView.cell.stopBatch('add-vertex', { ui: true, toolId: this.cid });\n }\n const { e: evt, x, y } = this.getMouseEventArgs(e);\n if (!this.options.stopPropagation) {\n edgeView.notifyMouseUp(evt, x, y);\n }\n edgeView.checkMouseleave(evt);\n options.onChanged && options.onChanged({ edge: edgeView.cell, edgeView });\n }\n snapVertex(vertex, index) {\n const snapRadius = this.options.snapRadius || 0;\n if (snapRadius > 0) {\n const neighbors = this.getNeighborPoints(index);\n const prev = neighbors.prev;\n const next = neighbors.next;\n if (Math.abs(vertex.x - prev.x) < snapRadius) {\n vertex.x = prev.x;\n }\n else if (Math.abs(vertex.x - next.x) < snapRadius) {\n vertex.x = next.x;\n }\n if (Math.abs(vertex.y - prev.y) < snapRadius) {\n vertex.y = neighbors.prev.y;\n }\n else if (Math.abs(vertex.y - next.y) < snapRadius) {\n vertex.y = next.y;\n }\n }\n }\n onHandleRemove({ handle, e }) {\n if (this.options.removable) {\n const index = handle.options.index;\n const edgeView = this.cellView;\n edgeView.cell.removeVertexAt(index, { ui: true });\n if (this.options.addable) {\n this.updatePath();\n }\n edgeView.checkMouseleave(this.normalizeEvent(e));\n }\n }\n onPathMouseDown(evt) {\n const edgeView = this.cellView;\n if (this.guard(evt) ||\n !this.options.addable ||\n !edgeView.can('vertexAddable')) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n const e = this.normalizeEvent(evt);\n const vertex = this.graph.snapToGrid(e.clientX, e.clientY).toJSON();\n edgeView.cell.startBatch('add-vertex', { ui: true, toolId: this.cid });\n const index = edgeView.getVertexIndex(vertex.x, vertex.y);\n this.snapVertex(vertex, index);\n edgeView.cell.insertVertex(vertex, index, {\n ui: true,\n toolId: this.cid,\n });\n this.render();\n const handle = this.handles[index];\n this.eventData(e, { vertexAdded: true });\n handle.onMouseDown(e);\n }\n onRemove() {\n this.resetHandles();\n }\n}\n(function (Vertices) {\n class Handle extends View {\n constructor(options) {\n super();\n this.options = options;\n this.render();\n this.delegateEvents({\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n dblclick: 'onDoubleClick',\n });\n }\n get graph() {\n return this.options.graph;\n }\n render() {\n this.container = View.createElement('circle', true);\n const attrs = this.options.attrs;\n if (typeof attrs === 'function') {\n const defaults = Vertices.getDefaults();\n this.setAttrs(Object.assign(Object.assign({}, defaults.attrs), attrs(this)));\n }\n else {\n this.setAttrs(attrs);\n }\n this.addClass(this.prefixClassName('edge-tool-vertex'));\n }\n updatePosition(x, y) {\n this.setAttrs({ cx: x, cy: y });\n }\n onMouseDown(evt) {\n if (this.options.guard(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n this.graph.view.undelegateEvents();\n this.delegateDocumentEvents({\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n }, evt.data);\n this.emit('change', { e: evt, handle: this });\n }\n onMouseMove(evt) {\n this.emit('changing', { e: evt, handle: this });\n }\n onMouseUp(evt) {\n this.emit('changed', { e: evt, handle: this });\n this.undelegateDocumentEvents();\n this.graph.view.delegateEvents();\n }\n onDoubleClick(evt) {\n this.emit('remove', { e: evt, handle: this });\n }\n }\n Vertices.Handle = Handle;\n})(Vertices || (Vertices = {}));\n(function (Vertices) {\n const pathClassName = Util.prefix('edge-tool-vertex-path');\n Vertices.config({\n name: 'vertices',\n snapRadius: 20,\n addable: true,\n removable: true,\n removeRedundancies: true,\n stopPropagation: true,\n attrs: {\n r: 6,\n fill: '#333',\n stroke: '#fff',\n cursor: 'move',\n 'stroke-width': 2,\n },\n createHandle: (options) => new Vertices.Handle(options),\n markup: [\n {\n tagName: 'path',\n selector: 'connection',\n className: pathClassName,\n attrs: {\n fill: 'none',\n stroke: 'transparent',\n 'stroke-width': 10,\n cursor: 'pointer',\n },\n },\n ],\n events: {\n [`mousedown .${pathClassName}`]: 'onPathMouseDown',\n [`touchstart .${pathClassName}`]: 'onPathMouseDown',\n },\n });\n})(Vertices || (Vertices = {}));\n//# sourceMappingURL=vertices.js.map","import { Dom, ObjectExt, FunctionExt } from '../../util';\nimport { Point, Line } from '../../geometry';\nimport { View } from '../../view/view';\nimport { ToolsView } from '../../view/tool';\nimport * as Util from './util';\nexport class Segments extends ToolsView.ToolItem {\n constructor() {\n super(...arguments);\n this.handles = [];\n }\n get vertices() {\n return this.cellView.cell.getVertices();\n }\n update() {\n this.render();\n return this;\n }\n onRender() {\n Dom.addClass(this.container, this.prefixClassName('edge-tool-segments'));\n this.resetHandles();\n const edgeView = this.cellView;\n const vertices = [...this.vertices];\n vertices.unshift(edgeView.sourcePoint);\n vertices.push(edgeView.targetPoint);\n for (let i = 0, l = vertices.length; i < l - 1; i += 1) {\n const vertex = vertices[i];\n const nextVertex = vertices[i + 1];\n const handle = this.renderHandle(vertex, nextVertex, i);\n this.stamp(handle.container);\n this.handles.push(handle);\n }\n return this;\n }\n renderHandle(vertex, nextVertex, index) {\n const handle = this.options.createHandle({\n index,\n graph: this.graph,\n guard: (evt) => this.guard(evt),\n attrs: this.options.attrs || {},\n });\n if (this.options.processHandle) {\n this.options.processHandle(handle);\n }\n this.graph.hook.onToolItemCreated({\n name: 'segments',\n cell: this.cell,\n view: this.cellView,\n tool: handle,\n });\n this.updateHandle(handle, vertex, nextVertex);\n this.container.appendChild(handle.container);\n this.startHandleListening(handle);\n return handle;\n }\n startHandleListening(handle) {\n handle.on('change', this.onHandleChange, this);\n handle.on('changing', this.onHandleChanging, this);\n handle.on('changed', this.onHandleChanged, this);\n }\n stopHandleListening(handle) {\n handle.off('change', this.onHandleChange, this);\n handle.off('changing', this.onHandleChanging, this);\n handle.off('changed', this.onHandleChanged, this);\n }\n resetHandles() {\n const handles = this.handles;\n this.handles = [];\n if (handles) {\n handles.forEach((handle) => {\n this.stopHandleListening(handle);\n handle.remove();\n });\n }\n }\n shiftHandleIndexes(delta) {\n const handles = this.handles;\n for (let i = 0, n = handles.length; i < n; i += 1) {\n handles[i].options.index += delta;\n }\n }\n resetAnchor(type, anchor) {\n const edge = this.cellView.cell;\n const options = {\n ui: true,\n toolId: this.cid,\n };\n if (anchor) {\n edge.prop([type, 'anchor'], anchor, options);\n }\n else {\n edge.removeProp([type, 'anchor'], options);\n }\n }\n snapHandle(handle, position, data) {\n const axis = handle.options.axis;\n const index = handle.options.index;\n const edgeView = this.cellView;\n const edge = edgeView.cell;\n const vertices = edge.getVertices();\n const prev = vertices[index - 2] || data.sourceAnchor;\n const next = vertices[index + 1] || data.targetAnchor;\n const snapRadius = this.options.snapRadius;\n if (Math.abs(position[axis] - prev[axis]) < snapRadius) {\n position[axis] = prev[axis];\n }\n else if (Math.abs(position[axis] - next[axis]) < snapRadius) {\n position[axis] = next[axis];\n }\n return position;\n }\n onHandleChanging({ handle, e, }) {\n const graph = this.graph;\n const options = this.options;\n const edgeView = this.cellView;\n const anchorFn = options.anchor;\n const axis = handle.options.axis;\n const index = handle.options.index - 1;\n const data = this.getEventData(e);\n const evt = this.normalizeEvent(e);\n const coords = graph.snapToGrid(evt.clientX, evt.clientY);\n const position = this.snapHandle(handle, coords.clone(), data);\n const vertices = ObjectExt.cloneDeep(this.vertices);\n let vertex = vertices[index];\n let nextVertex = vertices[index + 1];\n // First Segment\n const sourceView = edgeView.sourceView;\n const sourceBBox = edgeView.sourceBBox;\n let changeSourceAnchor = false;\n let deleteSourceAnchor = false;\n if (!vertex) {\n vertex = edgeView.sourceAnchor.toJSON();\n vertex[axis] = position[axis];\n if (sourceBBox.containsPoint(vertex)) {\n changeSourceAnchor = true;\n }\n else {\n vertices.unshift(vertex);\n this.shiftHandleIndexes(1);\n deleteSourceAnchor = true;\n }\n }\n else if (index === 0) {\n if (sourceBBox.containsPoint(vertex)) {\n vertices.shift();\n this.shiftHandleIndexes(-1);\n changeSourceAnchor = true;\n }\n else {\n vertex[axis] = position[axis];\n deleteSourceAnchor = true;\n }\n }\n else {\n vertex[axis] = position[axis];\n }\n if (typeof anchorFn === 'function' && sourceView) {\n if (changeSourceAnchor) {\n const sourceAnchorPosition = data.sourceAnchor.clone();\n sourceAnchorPosition[axis] = position[axis];\n const sourceAnchor = FunctionExt.call(anchorFn, edgeView, sourceAnchorPosition, sourceView, edgeView.sourceMagnet || sourceView.container, 'source', edgeView, this);\n this.resetAnchor('source', sourceAnchor);\n }\n if (deleteSourceAnchor) {\n this.resetAnchor('source', data.sourceAnchorDef);\n }\n }\n // Last segment\n const targetView = edgeView.targetView;\n const targetBBox = edgeView.targetBBox;\n let changeTargetAnchor = false;\n let deleteTargetAnchor = false;\n if (!nextVertex) {\n nextVertex = edgeView.targetAnchor.toJSON();\n nextVertex[axis] = position[axis];\n if (targetBBox.containsPoint(nextVertex)) {\n changeTargetAnchor = true;\n }\n else {\n vertices.push(nextVertex);\n deleteTargetAnchor = true;\n }\n }\n else if (index === vertices.length - 2) {\n if (targetBBox.containsPoint(nextVertex)) {\n vertices.pop();\n changeTargetAnchor = true;\n }\n else {\n nextVertex[axis] = position[axis];\n deleteTargetAnchor = true;\n }\n }\n else {\n nextVertex[axis] = position[axis];\n }\n if (typeof anchorFn === 'function' && targetView) {\n if (changeTargetAnchor) {\n const targetAnchorPosition = data.targetAnchor.clone();\n targetAnchorPosition[axis] = position[axis];\n const targetAnchor = FunctionExt.call(anchorFn, edgeView, targetAnchorPosition, targetView, edgeView.targetMagnet || targetView.container, 'target', edgeView, this);\n this.resetAnchor('target', targetAnchor);\n }\n if (deleteTargetAnchor) {\n this.resetAnchor('target', data.targetAnchorDef);\n }\n }\n if (!Point.equalPoints(vertices, this.vertices)) {\n this.cellView.cell.setVertices(vertices, { ui: true, toolId: this.cid });\n }\n this.updateHandle(handle, vertex, nextVertex, 0);\n if (!options.stopPropagation) {\n edgeView.notifyMouseMove(evt, coords.x, coords.y);\n }\n }\n onHandleChange({ handle, e }) {\n const options = this.options;\n const handles = this.handles;\n const edgeView = this.cellView;\n const index = handle.options.index;\n if (!Array.isArray(handles)) {\n return;\n }\n for (let i = 0, n = handles.length; i < n; i += 1) {\n if (i !== index) {\n handles[i].hide();\n }\n }\n this.focus();\n this.setEventData(e, {\n sourceAnchor: edgeView.sourceAnchor.clone(),\n targetAnchor: edgeView.targetAnchor.clone(),\n sourceAnchorDef: ObjectExt.cloneDeep(this.cell.prop(['source', 'anchor'])),\n targetAnchorDef: ObjectExt.cloneDeep(this.cell.prop(['target', 'anchor'])),\n });\n this.cell.startBatch('move-segment', { ui: true, toolId: this.cid });\n if (!options.stopPropagation) {\n const normalizedEvent = this.normalizeEvent(e);\n const coords = this.graph.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY);\n edgeView.notifyMouseDown(normalizedEvent, coords.x, coords.y);\n }\n }\n onHandleChanged({ e }) {\n const options = this.options;\n const edgeView = this.cellView;\n if (options.removeRedundancies) {\n edgeView.removeRedundantLinearVertices({ ui: true, toolId: this.cid });\n }\n const normalizedEvent = this.normalizeEvent(e);\n const coords = this.graph.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY);\n this.render();\n this.blur();\n this.cell.stopBatch('move-segment', { ui: true, toolId: this.cid });\n if (!options.stopPropagation) {\n edgeView.notifyMouseUp(normalizedEvent, coords.x, coords.y);\n }\n edgeView.checkMouseleave(normalizedEvent);\n options.onChanged && options.onChanged({ edge: edgeView.cell, edgeView });\n }\n updateHandle(handle, vertex, nextVertex, offset = 0) {\n const precision = this.options.precision || 0;\n const vertical = Math.abs(vertex.x - nextVertex.x) < precision;\n const horizontal = Math.abs(vertex.y - nextVertex.y) < precision;\n if (vertical || horizontal) {\n const segmentLine = new Line(vertex, nextVertex);\n const length = segmentLine.length();\n if (length < this.options.threshold) {\n handle.hide();\n }\n else {\n const position = segmentLine.getCenter();\n const axis = vertical ? 'x' : 'y';\n position[axis] += offset || 0;\n const angle = segmentLine.vector().vectorAngle(new Point(1, 0));\n handle.updatePosition(position.x, position.y, angle, this.cellView);\n handle.show();\n handle.options.axis = axis;\n }\n }\n else {\n handle.hide();\n }\n }\n onRemove() {\n this.resetHandles();\n }\n}\n(function (Segments) {\n class Handle extends View {\n constructor(options) {\n super();\n this.options = options;\n this.render();\n this.delegateEvents({\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n });\n }\n render() {\n this.container = View.createElement('rect', true);\n const attrs = this.options.attrs;\n if (typeof attrs === 'function') {\n const defaults = Segments.getDefaults();\n this.setAttrs(Object.assign(Object.assign({}, defaults.attrs), attrs(this)));\n }\n else {\n this.setAttrs(attrs);\n }\n this.addClass(this.prefixClassName('edge-tool-segment'));\n }\n updatePosition(x, y, angle, view) {\n const p = view.getClosestPoint(new Point(x, y)) || new Point(x, y);\n let matrix = Dom.createSVGMatrix().translate(p.x, p.y);\n if (!p.equals({ x, y })) {\n const line = new Line(x, y, p.x, p.y);\n let deg = line.vector().vectorAngle(new Point(1, 0));\n if (deg !== 0) {\n deg += 90;\n }\n matrix = matrix.rotate(deg);\n }\n else {\n matrix = matrix.rotate(angle);\n }\n this.setAttrs({\n transform: Dom.matrixToTransformString(matrix),\n cursor: angle % 180 === 0 ? 'row-resize' : 'col-resize',\n });\n }\n onMouseDown(evt) {\n if (this.options.guard(evt)) {\n return;\n }\n this.trigger('change', { e: evt, handle: this });\n evt.stopPropagation();\n evt.preventDefault();\n this.options.graph.view.undelegateEvents();\n this.delegateDocumentEvents({\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n }, evt.data);\n }\n onMouseMove(evt) {\n this.emit('changing', { e: evt, handle: this });\n }\n onMouseUp(evt) {\n this.emit('changed', { e: evt, handle: this });\n this.undelegateDocumentEvents();\n this.options.graph.view.delegateEvents();\n }\n show() {\n this.container.style.display = '';\n }\n hide() {\n this.container.style.display = 'none';\n }\n }\n Segments.Handle = Handle;\n})(Segments || (Segments = {}));\n(function (Segments) {\n Segments.config({\n name: 'segments',\n precision: 0.5,\n threshold: 40,\n snapRadius: 10,\n stopPropagation: true,\n removeRedundancies: true,\n attrs: {\n width: 20,\n height: 8,\n x: -10,\n y: -4,\n rx: 4,\n ry: 4,\n fill: '#333',\n stroke: '#fff',\n 'stroke-width': 2,\n },\n createHandle: (options) => new Segments.Handle(options),\n anchor: Util.getAnchor,\n });\n})(Segments || (Segments = {}));\n//# sourceMappingURL=segments.js.map","import { Dom, FunctionExt } from '../../util';\nimport { Point } from '../../geometry';\nimport { ToolsView } from '../../view/tool';\nimport * as Util from './util';\nclass Anchor extends ToolsView.ToolItem {\n get type() {\n return this.options.type;\n }\n onRender() {\n Dom.addClass(this.container, this.prefixClassName(`edge-tool-${this.type}-anchor`));\n this.toggleArea(false);\n this.update();\n }\n update() {\n const type = this.type;\n const edgeView = this.cellView;\n const terminalView = edgeView.getTerminalView(type);\n if (terminalView) {\n this.updateAnchor();\n this.updateArea();\n this.container.style.display = '';\n }\n else {\n this.container.style.display = 'none';\n }\n return this;\n }\n updateAnchor() {\n const childNodes = this.childNodes;\n if (!childNodes) {\n return;\n }\n const anchorNode = childNodes.anchor;\n if (!anchorNode) {\n return;\n }\n const type = this.type;\n const edgeView = this.cellView;\n const options = this.options;\n const position = edgeView.getTerminalAnchor(type);\n const customAnchor = edgeView.cell.prop([type, 'anchor']);\n anchorNode.setAttribute('transform', `translate(${position.x}, ${position.y})`);\n const anchorAttrs = customAnchor\n ? options.customAnchorAttrs\n : options.defaultAnchorAttrs;\n if (anchorAttrs) {\n Object.keys(anchorAttrs).forEach((attrName) => {\n anchorNode.setAttribute(attrName, anchorAttrs[attrName]);\n });\n }\n }\n updateArea() {\n const childNodes = this.childNodes;\n if (!childNodes) {\n return;\n }\n const areaNode = childNodes.area;\n if (!areaNode) {\n return;\n }\n const type = this.type;\n const edgeView = this.cellView;\n const terminalView = edgeView.getTerminalView(type);\n if (terminalView) {\n const terminalCell = terminalView.cell;\n const magnet = edgeView.getTerminalMagnet(type);\n let padding = this.options.areaPadding || 0;\n if (!Number.isFinite(padding)) {\n padding = 0;\n }\n let bbox;\n let angle;\n let center;\n if (terminalView.isEdgeElement(magnet)) {\n bbox = terminalView.getBBox();\n angle = 0;\n center = bbox.getCenter();\n }\n else {\n bbox = terminalView.getUnrotatedBBoxOfElement(magnet);\n angle = terminalCell.getAngle();\n center = bbox.getCenter();\n if (angle) {\n center.rotate(-angle, terminalCell.getBBox().getCenter());\n }\n }\n bbox.inflate(padding);\n Dom.attr(areaNode, {\n x: -bbox.width / 2,\n y: -bbox.height / 2,\n width: bbox.width,\n height: bbox.height,\n transform: `translate(${center.x}, ${center.y}) rotate(${angle})`,\n });\n }\n }\n toggleArea(visible) {\n if (this.childNodes) {\n const elem = this.childNodes.area;\n if (elem) {\n elem.style.display = visible ? '' : 'none';\n }\n }\n }\n onMouseDown(evt) {\n if (this.guard(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n this.graph.view.undelegateEvents();\n if (this.options.documentEvents) {\n this.delegateDocumentEvents(this.options.documentEvents);\n }\n this.focus();\n this.toggleArea(this.options.restrictArea);\n this.cell.startBatch('move-anchor', {\n ui: true,\n toolId: this.cid,\n });\n }\n resetAnchor(anchor) {\n const type = this.type;\n const cell = this.cell;\n if (anchor) {\n cell.prop([type, 'anchor'], anchor, {\n rewrite: true,\n ui: true,\n toolId: this.cid,\n });\n }\n else {\n cell.removeProp([type, 'anchor'], {\n ui: true,\n toolId: this.cid,\n });\n }\n }\n onMouseMove(evt) {\n const terminalType = this.type;\n const edgeView = this.cellView;\n const terminalView = edgeView.getTerminalView(terminalType);\n if (terminalView == null) {\n return;\n }\n const e = this.normalizeEvent(evt);\n const terminalCell = terminalView.cell;\n const terminalMagnet = edgeView.getTerminalMagnet(terminalType);\n let coords = this.graph.clientToLocal(e.clientX, e.clientY);\n const snapFn = this.options.snap;\n if (typeof snapFn === 'function') {\n const tmp = FunctionExt.call(snapFn, edgeView, coords, terminalView, terminalMagnet, terminalType, edgeView, this);\n coords = Point.create(tmp);\n }\n if (this.options.restrictArea) {\n if (terminalView.isEdgeElement(terminalMagnet)) {\n const pointAtConnection = terminalView.getClosestPoint(coords);\n if (pointAtConnection) {\n coords = pointAtConnection;\n }\n }\n else {\n const bbox = terminalView.getUnrotatedBBoxOfElement(terminalMagnet);\n const angle = terminalCell.getAngle();\n const origin = terminalCell.getBBox().getCenter();\n const rotatedCoords = coords.clone().rotate(angle, origin);\n if (!bbox.containsPoint(rotatedCoords)) {\n coords = bbox\n .getNearestPointToPoint(rotatedCoords)\n .rotate(-angle, origin);\n }\n }\n }\n let anchor;\n const anchorFn = this.options.anchor;\n if (typeof anchorFn === 'function') {\n anchor = FunctionExt.call(anchorFn, edgeView, coords, terminalView, terminalMagnet, terminalType, edgeView, this);\n }\n this.resetAnchor(anchor);\n this.update();\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onMouseUp(evt) {\n this.graph.view.delegateEvents();\n this.undelegateDocumentEvents();\n this.blur();\n this.toggleArea(false);\n const edgeView = this.cellView;\n if (this.options.removeRedundancies) {\n edgeView.removeRedundantLinearVertices({ ui: true, toolId: this.cid });\n }\n this.cell.stopBatch('move-anchor', { ui: true, toolId: this.cid });\n }\n onDblClick() {\n const anchor = this.options.resetAnchor;\n if (anchor) {\n this.resetAnchor(anchor === true ? undefined : anchor);\n }\n this.update();\n }\n}\n(function (Anchor) {\n Anchor.config({\n tagName: 'g',\n markup: [\n {\n tagName: 'circle',\n selector: 'anchor',\n attrs: {\n cursor: 'pointer',\n },\n },\n {\n tagName: 'rect',\n selector: 'area',\n attrs: {\n 'pointer-events': 'none',\n fill: 'none',\n stroke: '#33334F',\n 'stroke-dasharray': '2,4',\n rx: 5,\n ry: 5,\n },\n },\n ],\n events: {\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n dblclick: 'onDblClick',\n },\n documentEvents: {\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n },\n customAnchorAttrs: {\n 'stroke-width': 4,\n stroke: '#33334F',\n fill: '#FFFFFF',\n r: 5,\n },\n defaultAnchorAttrs: {\n 'stroke-width': 2,\n stroke: '#FFFFFF',\n fill: '#33334F',\n r: 6,\n },\n areaPadding: 6,\n snapRadius: 10,\n resetAnchor: true,\n restrictArea: true,\n removeRedundancies: true,\n anchor: Util.getAnchor,\n snap(pos, terminalView, terminalMagnet, terminalType, edgeView, toolView) {\n const snapRadius = toolView.options.snapRadius || 0;\n const isSource = terminalType === 'source';\n const refIndex = isSource ? 0 : -1;\n const ref = this.cell.getVertexAt(refIndex) ||\n this.getTerminalAnchor(isSource ? 'target' : 'source');\n if (ref) {\n if (Math.abs(ref.x - pos.x) < snapRadius)\n pos.x = ref.x;\n if (Math.abs(ref.y - pos.y) < snapRadius)\n pos.y = ref.y;\n }\n return pos;\n },\n });\n})(Anchor || (Anchor = {}));\nexport const SourceAnchor = Anchor.define({\n name: 'source-anchor',\n type: 'source',\n});\nexport const TargetAnchor = Anchor.define({\n name: 'target-anchor',\n type: 'target',\n});\n//# sourceMappingURL=anchor.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Dom } from '../../util';\nimport { Point } from '../../geometry';\nimport { ToolsView } from '../../view/tool';\nclass Arrowhead extends ToolsView.ToolItem {\n get type() {\n return this.options.type;\n }\n get ratio() {\n return this.options.ratio;\n }\n init() {\n if (this.options.attrs) {\n const _a = this.options.attrs, { class: className } = _a, attrs = __rest(_a, [\"class\"]);\n this.setAttrs(attrs, this.container);\n if (className) {\n Dom.addClass(this.container, className);\n }\n }\n }\n onRender() {\n Dom.addClass(this.container, this.prefixClassName(`edge-tool-${this.type}-arrowhead`));\n this.update();\n }\n update() {\n const ratio = this.ratio;\n const edgeView = this.cellView;\n const tangent = edgeView.getTangentAtRatio(ratio);\n const position = tangent ? tangent.start : edgeView.getPointAtRatio(ratio);\n const angle = (tangent && tangent.vector().vectorAngle(new Point(1, 0))) || 0;\n if (!position) {\n return this;\n }\n const matrix = Dom.createSVGMatrix()\n .translate(position.x, position.y)\n .rotate(angle);\n Dom.transform(this.container, matrix, { absolute: true });\n return this;\n }\n onMouseDown(evt) {\n if (this.guard(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n const edgeView = this.cellView;\n if (edgeView.can('arrowheadMovable')) {\n edgeView.cell.startBatch('move-arrowhead', {\n ui: true,\n toolId: this.cid,\n });\n const coords = this.graph.snapToGrid(evt.clientX, evt.clientY);\n const data = edgeView.prepareArrowheadDragging(this.type, {\n x: coords.x,\n y: coords.y,\n options: {\n toolId: this.cid,\n },\n });\n this.cellView.setEventData(evt, data);\n this.delegateDocumentEvents(this.options.documentEvents, evt.data);\n edgeView.graph.view.undelegateEvents();\n this.container.style.pointerEvents = 'none';\n }\n this.focus();\n }\n onMouseMove(evt) {\n const e = this.normalizeEvent(evt);\n const coords = this.graph.snapToGrid(e.clientX, e.clientY);\n this.cellView.onMouseMove(e, coords.x, coords.y);\n this.update();\n }\n onMouseUp(evt) {\n this.undelegateDocumentEvents();\n const e = this.normalizeEvent(evt);\n const edgeView = this.cellView;\n const coords = this.graph.snapToGrid(e.clientX, e.clientY);\n edgeView.onMouseUp(e, coords.x, coords.y);\n this.graph.view.delegateEvents();\n this.blur();\n this.container.style.pointerEvents = '';\n edgeView.cell.stopBatch('move-arrowhead', {\n ui: true,\n toolId: this.cid,\n });\n }\n}\n(function (Arrowhead) {\n Arrowhead.config({\n tagName: 'path',\n isSVGElement: true,\n events: {\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n },\n documentEvents: {\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n },\n });\n})(Arrowhead || (Arrowhead = {}));\nexport const SourceArrowhead = Arrowhead.define({\n name: 'source-arrowhead',\n type: 'source',\n ratio: 0,\n attrs: {\n d: 'M 10 -8 -10 0 10 8 Z',\n fill: '#333',\n stroke: '#fff',\n 'stroke-width': 2,\n cursor: 'move',\n },\n});\nexport const TargetArrowhead = Arrowhead.define({\n name: 'target-arrowhead',\n type: 'target',\n ratio: 1,\n attrs: {\n d: 'M -10 -8 10 0 -10 8 Z',\n fill: '#333',\n stroke: '#fff',\n 'stroke-width': 2,\n cursor: 'move',\n },\n});\n//# sourceMappingURL=arrowhead.js.map","import { ToolsView } from '../../view/tool';\nimport { Point } from '../../geometry';\nimport { Dom, FunctionExt } from '../../util';\nexport class CellEditor extends ToolsView.ToolItem {\n constructor() {\n super(...arguments);\n this.labelIndex = -1;\n this.distance = 0.5;\n }\n render() {\n this.createElement();\n this.update();\n this.autoFocus();\n this.delegateDocumentEvents(this.options.documentEvents);\n return this;\n }\n createElement() {\n const { cell } = this;\n const classNames = [\n this.prefixClassName(`${cell.isEdge() ? 'edge' : 'node'}-tool-editor`),\n this.prefixClassName('cell-tool-editor'),\n ];\n this.editor = ToolsView.createElement('div', false);\n this.addClass(classNames, this.editor);\n this.editor.contentEditable = 'true';\n this.container.appendChild(this.editor);\n }\n update() {\n const { graph, cell, editor } = this;\n const style = editor.style;\n // set tool position\n let pos = new Point();\n let minWidth = 20;\n if (cell.isNode()) {\n pos = cell.getBBox().center;\n minWidth = cell.size().width - 4;\n }\n else if (cell.isEdge()) {\n const e = this.options.event;\n const target = e.target;\n const parent = target.parentElement;\n const isEdgeLabel = parent && Dom.hasClass(parent, this.prefixClassName('edge-label'));\n if (isEdgeLabel) {\n const index = parent.getAttribute('data-index') || '0';\n this.labelIndex = parseInt(index, 10);\n const matrix = parent.getAttribute('transform');\n const { translation } = Dom.parseTransformString(matrix);\n pos = new Point(translation.tx, translation.ty);\n minWidth = Dom.getBBox(target).width;\n }\n else {\n pos = graph.clientToLocal(Point.create(e.clientX, e.clientY));\n const view = this.cellView;\n const d = view.path.closestPointLength(pos);\n this.distance = d;\n }\n }\n pos = graph.localToGraph(pos);\n style.left = `${pos.x}px`;\n style.top = `${pos.y}px`;\n style.minWidth = `${minWidth}px`;\n // set tool transform\n const scale = graph.scale();\n style.transform = `scale(${scale.sx}, ${scale.sy}) translate(-50%, -50%)`;\n // set font style\n const attrs = this.options.attrs;\n style.fontSize = `${attrs.fontSize}px`;\n style.fontFamily = attrs.fontFamily;\n style.color = attrs.color;\n style.backgroundColor = attrs.backgroundColor;\n // set init value\n const getText = this.options.getText;\n let text;\n if (typeof getText === 'function') {\n text = FunctionExt.call(getText, this.cellView, {\n cell: this.cell,\n index: this.labelIndex,\n });\n }\n editor.innerText = text || '';\n return this;\n }\n onDocumentMouseDown(e) {\n if (e.target !== this.editor) {\n const cell = this.cell;\n const value = this.editor.innerText.replace(/\\n$/, '') || '';\n // set value\n const setText = this.options.setText;\n if (value !== '' && typeof setText === 'function') {\n FunctionExt.call(setText, this.cellView, {\n cell: this.cell,\n value,\n index: this.labelIndex,\n distance: this.distance,\n });\n }\n // remove tool\n cell.removeTool(cell.isEdge() ? 'edge-editor' : 'node-editor');\n this.undelegateDocumentEvents();\n }\n }\n onDblClick(e) {\n e.stopPropagation();\n }\n onMouseDown(e) {\n e.stopPropagation();\n }\n autoFocus() {\n setTimeout(() => {\n this.editor.focus();\n this.selectText();\n });\n }\n selectText() {\n if (window.getSelection) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(this.editor);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n}\n(function (CellEditor) {\n CellEditor.config({\n tagName: 'div',\n isSVGElement: false,\n events: {\n dblclick: 'onDblClick',\n mousedown: 'onMouseDown',\n },\n documentEvents: {\n mousedown: 'onDocumentMouseDown',\n },\n });\n})(CellEditor || (CellEditor = {}));\n(function (CellEditor) {\n CellEditor.NodeEditor = CellEditor.define({\n attrs: {\n fontSize: 14,\n fontFamily: 'Arial, helvetica, sans-serif',\n color: '#000',\n backgroundColor: '#fff',\n },\n getText({ cell }) {\n return cell.attr('text/text');\n },\n setText({ cell, value }) {\n cell.attr('text/text', value);\n },\n });\n CellEditor.EdgeEditor = CellEditor.define({\n attrs: {\n fontSize: 14,\n fontFamily: 'Arial, helvetica, sans-serif',\n color: '#000',\n backgroundColor: '#fff',\n },\n getText({ cell, index }) {\n if (index === -1) {\n return '';\n }\n return cell.prop(`labels/${index}/attrs/label/text`);\n },\n setText({ cell, value, index, distance }) {\n const edge = cell;\n if (index === -1) {\n edge.appendLabel({\n position: {\n distance: distance,\n },\n attrs: {\n label: {\n text: value,\n },\n },\n });\n }\n else {\n edge.prop(`labels/${index}/attrs/label/text`, value);\n }\n },\n });\n})(CellEditor || (CellEditor = {}));\n//# sourceMappingURL=editor.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ToolsView } from '../../view/tool';\nimport { Registry } from '../registry';\nimport { Button } from './button';\nimport { Boundary } from './boundary';\nimport { Vertices } from './vertices';\nimport { Segments } from './segments';\nimport { SourceAnchor, TargetAnchor } from './anchor';\nimport { SourceArrowhead, TargetArrowhead } from './arrowhead';\nimport { CellEditor } from './editor';\nexport var NodeTool;\n(function (NodeTool) {\n NodeTool.presets = {\n boundary: Boundary,\n button: Button,\n 'button-remove': Button.Remove,\n 'node-editor': CellEditor.NodeEditor,\n };\n NodeTool.registry = Registry.create({\n type: 'node tool',\n process(name, options) {\n if (typeof options === 'function') {\n return options;\n }\n let parent = ToolsView.ToolItem;\n const { inherit } = options, others = __rest(options, [\"inherit\"]);\n if (inherit) {\n const base = this.get(inherit);\n if (base == null) {\n this.onNotFound(inherit, 'inherited');\n }\n else {\n parent = base;\n }\n }\n if (others.name == null) {\n others.name = name;\n }\n return parent.define.call(parent, others);\n },\n });\n NodeTool.registry.register(NodeTool.presets, true);\n})(NodeTool || (NodeTool = {}));\nexport var EdgeTool;\n(function (EdgeTool) {\n EdgeTool.presets = {\n boundary: Boundary,\n vertices: Vertices,\n segments: Segments,\n button: Button,\n 'button-remove': Button.Remove,\n 'source-anchor': SourceAnchor,\n 'target-anchor': TargetAnchor,\n 'source-arrowhead': SourceArrowhead,\n 'target-arrowhead': TargetArrowhead,\n 'edge-editor': CellEditor.EdgeEditor,\n };\n EdgeTool.registry = Registry.create({\n type: 'edge tool',\n process(name, options) {\n if (typeof options === 'function') {\n return options;\n }\n let parent = ToolsView.ToolItem;\n const { inherit } = options, others = __rest(options, [\"inherit\"]);\n if (inherit) {\n const base = this.get(inherit);\n if (base == null) {\n this.onNotFound(inherit, 'inherited');\n }\n else {\n parent = base;\n }\n }\n if (others.name == null) {\n others.name = name;\n }\n return parent.define.call(parent, others);\n },\n });\n EdgeTool.registry.register(EdgeTool.presets, true);\n})(EdgeTool || (EdgeTool = {}));\n//# sourceMappingURL=index.js.map","import { NumberExt } from '../../util';\nexport const center = createBBoxAnchor('center');\nexport const top = createBBoxAnchor('topCenter');\nexport const bottom = createBBoxAnchor('bottomCenter');\nexport const left = createBBoxAnchor('leftMiddle');\nexport const right = createBBoxAnchor('rightMiddle');\nexport const topLeft = createBBoxAnchor('topLeft');\nexport const topRight = createBBoxAnchor('topRight');\nexport const bottomLeft = createBBoxAnchor('bottomLeft');\nexport const bottomRight = createBBoxAnchor('bottomRight');\nfunction createBBoxAnchor(method) {\n return function (view, magnet, ref, options = {}) {\n const bbox = options.rotate\n ? view.getUnrotatedBBoxOfElement(magnet)\n : view.getBBoxOfElement(magnet);\n const result = bbox[method];\n result.x += NumberExt.normalizePercentage(options.dx, bbox.width);\n result.y += NumberExt.normalizePercentage(options.dy, bbox.height);\n const cell = view.cell;\n return options.rotate\n ? result.rotate(-cell.getAngle(), cell.getBBox().getCenter())\n : result;\n };\n}\n//# sourceMappingURL=bbox.js.map","import { NumberExt } from '../../util';\nimport { Point } from '../../geometry';\n// eslint-disable-next-line\nexport function resolve(fn) {\n return function (view, magnet, ref, options) {\n if (ref instanceof Element) {\n const refView = this.graph.renderer.findViewByElem(ref);\n let refPoint;\n if (refView) {\n if (refView.isEdgeElement(ref)) {\n const distance = options.fixedAt != null ? options.fixedAt : '50%';\n refPoint = getPointAtEdge(refView, distance);\n }\n else {\n refPoint = refView.getBBoxOfElement(ref).getCenter();\n }\n }\n else {\n refPoint = new Point();\n }\n return fn.call(this, view, magnet, refPoint, options);\n }\n return fn.apply(this, arguments); // eslint-disable-line\n };\n}\nexport function getPointAtEdge(edgeView, value) {\n const isPercentage = NumberExt.isPercentage(value);\n const num = typeof value === 'string' ? parseFloat(value) : value;\n if (isPercentage) {\n return edgeView.getPointAtRatio(num / 100);\n }\n return edgeView.getPointAtLength(num);\n}\n//# sourceMappingURL=util.js.map","import { Angle } from '../../geometry';\nimport { resolve } from './util';\nconst orthogonal = function (view, magnet, refPoint, options) {\n const angle = view.cell.getAngle();\n const bbox = view.getBBoxOfElement(magnet);\n const result = bbox.getCenter();\n const topLeft = bbox.getTopLeft();\n const bottomRight = bbox.getBottomRight();\n let padding = options.padding;\n if (!Number.isFinite(padding)) {\n padding = 0;\n }\n if (topLeft.y + padding <= refPoint.y &&\n refPoint.y <= bottomRight.y - padding) {\n const dy = refPoint.y - result.y;\n result.x +=\n angle === 0 || angle === 180\n ? 0\n : (dy * 1) / Math.tan(Angle.toRad(angle));\n result.y += dy;\n }\n else if (topLeft.x + padding <= refPoint.x &&\n refPoint.x <= bottomRight.x - padding) {\n const dx = refPoint.x - result.x;\n result.y +=\n angle === 90 || angle === 270 ? 0 : dx * Math.tan(Angle.toRad(angle));\n result.x += dx;\n }\n return result;\n};\n/**\n * Tries to place the anchor of the edge inside the view bbox so that the\n * edge is made orthogonal. The anchor is placed along two line segments\n * inside the view bbox (between the centers of the top and bottom side and\n * between the centers of the left and right sides). If it is not possible\n * to place the anchor so that the edge would be orthogonal, the anchor is\n * placed at the center of the view bbox instead.\n */\nexport const orth = resolve(orthogonal);\n//# sourceMappingURL=orth.js.map","/**\n * Places the anchor of the edge at center of the node bbox.\n */\nexport const nodeCenter = function (view, magnet, ref, options, endType) {\n const result = view.cell.getConnectionPoint(this.cell, endType);\n if (options.dx || options.dy) {\n result.translate(options.dx || 0, options.dy || 0);\n }\n return result;\n};\n//# sourceMappingURL=node-center.js.map","import { resolve } from './util';\nconst middleSide = function (view, magnet, refPoint, options) {\n let bbox;\n let angle = 0;\n let center;\n const node = view.cell;\n if (options.rotate) {\n bbox = view.getUnrotatedBBoxOfElement(magnet);\n center = node.getBBox().getCenter();\n angle = node.getAngle();\n }\n else {\n bbox = view.getBBoxOfElement(magnet);\n }\n const padding = options.padding;\n if (padding != null && Number.isFinite(padding)) {\n bbox.inflate(padding);\n }\n if (options.rotate) {\n refPoint.rotate(angle, center);\n }\n const side = bbox.getNearestSideToPoint(refPoint);\n let result;\n switch (side) {\n case 'left':\n result = bbox.getLeftMiddle();\n break;\n case 'right':\n result = bbox.getRightMiddle();\n break;\n case 'top':\n result = bbox.getTopCenter();\n break;\n case 'bottom':\n result = bbox.getBottomCenter();\n break;\n default:\n break;\n }\n const direction = options.direction;\n if (direction === 'H') {\n if (side === 'top' || side === 'bottom') {\n if (refPoint.x <= bbox.x + bbox.width) {\n result = bbox.getLeftMiddle();\n }\n else {\n result = bbox.getRightMiddle();\n }\n }\n }\n else if (direction === 'V') {\n if (refPoint.y <= bbox.y + bbox.height) {\n result = bbox.getTopCenter();\n }\n else {\n result = bbox.getBottomCenter();\n }\n }\n return options.rotate ? result.rotate(-angle, center) : result;\n};\n/**\n * Places the anchor of the edge in the middle of the side of view bbox\n * closest to the other endpoint.\n */\nexport const midSide = resolve(middleSide);\n//# sourceMappingURL=middle-side.js.map","import { Registry } from '../registry';\nimport * as anchors from './main';\nexport var NodeAnchor;\n(function (NodeAnchor) {\n NodeAnchor.presets = anchors;\n NodeAnchor.registry = Registry.create({\n type: 'node endpoint',\n });\n NodeAnchor.registry.register(NodeAnchor.presets, true);\n})(NodeAnchor || (NodeAnchor = {}));\n//# sourceMappingURL=index.js.map","export const ratio = function (view, magnet, ref, options) {\n let ratio = options.ratio != null ? options.ratio : 0.5;\n if (ratio > 1) {\n ratio /= 100;\n }\n return view.getPointAtRatio(ratio);\n};\n//# sourceMappingURL=ratio.js.map","export const length = function (view, magnet, ref, options) {\n const length = options.length != null ? options.length : 20;\n return view.getPointAtLength(length);\n};\n//# sourceMappingURL=length.js.map","import { Point } from '../../geometry';\nimport { resolve } from '../node-anchor/util';\nexport const getClosestPoint = function (view, magnet, refPoint, options) {\n const closestPoint = view.getClosestPoint(refPoint);\n return closestPoint != null ? closestPoint : new Point();\n};\nexport const closest = resolve(getClosestPoint);\n//# sourceMappingURL=closest.js.map","import { Line } from '../../geometry';\nimport { resolve, getPointAtEdge } from '../node-anchor/util';\nimport { getClosestPoint } from './closest';\nimport { FunctionExt } from '../../util';\nconst orthogonal = function (view, magnet, refPoint, options) {\n const OFFSET = 1e6;\n const path = view.getConnection();\n const segmentSubdivisions = view.getConnectionSubdivisions();\n const vLine = new Line(refPoint.clone().translate(0, OFFSET), refPoint.clone().translate(0, -OFFSET));\n const hLine = new Line(refPoint.clone().translate(OFFSET, 0), refPoint.clone().translate(-OFFSET, 0));\n const vIntersections = vLine.intersect(path, {\n segmentSubdivisions,\n });\n const hIntersections = hLine.intersect(path, {\n segmentSubdivisions,\n });\n const intersections = [];\n if (vIntersections) {\n intersections.push(...vIntersections);\n }\n if (hIntersections) {\n intersections.push(...hIntersections);\n }\n if (intersections.length > 0) {\n return refPoint.closest(intersections);\n }\n if (options.fallbackAt != null) {\n return getPointAtEdge(view, options.fallbackAt);\n }\n return FunctionExt.call(getClosestPoint, this, view, magnet, refPoint, options);\n};\nexport const orth = resolve(orthogonal);\n//# sourceMappingURL=orth.js.map","import { Registry } from '../registry';\nimport * as anchors from './main';\nexport var EdgeAnchor;\n(function (EdgeAnchor) {\n EdgeAnchor.presets = anchors;\n EdgeAnchor.registry = Registry.create({\n type: 'edge endpoint',\n });\n EdgeAnchor.registry.register(EdgeAnchor.presets, true);\n})(EdgeAnchor || (EdgeAnchor = {}));\n//# sourceMappingURL=index.js.map","import { Line } from '../../geometry';\nexport function offset(p1, p2, offset) {\n let tx;\n if (typeof offset === 'object') {\n if (Number.isFinite(offset.y)) {\n const line = new Line(p2, p1);\n const { start, end } = line.parallel(offset.y);\n p2 = start; // eslint-disable-line\n p1 = end; // eslint-disable-line\n }\n tx = offset.x;\n }\n else {\n tx = offset;\n }\n if (tx == null || !Number.isFinite(tx)) {\n return p1;\n }\n const length = p1.distance(p2);\n if (tx === 0 && length > 0) {\n return p1;\n }\n return p1.move(p2, -Math.min(tx, length - 1));\n}\nexport function getStrokeWidth(magnet) {\n const stroke = magnet.getAttribute('stroke-width');\n if (stroke === null) {\n return 0;\n }\n return parseFloat(stroke) || 0;\n}\nexport function findShapeNode(magnet) {\n if (magnet == null) {\n return null;\n }\n let node = magnet;\n do {\n let tagName = node.tagName;\n if (typeof tagName !== 'string')\n return null;\n tagName = tagName.toUpperCase();\n if (tagName === 'G') {\n node = node.firstElementChild;\n }\n else if (tagName === 'TITLE') {\n node = node.nextElementSibling;\n }\n else\n break;\n } while (node);\n return node;\n}\n//# sourceMappingURL=util.js.map","import { offset, getStrokeWidth } from './util';\n/**\n * Places the connection point at the intersection between the edge\n * path end segment and the target node bbox.\n */\nexport const bbox = function (line, view, magnet, options) {\n const bbox = view.getBBoxOfElement(magnet);\n if (options.stroked) {\n bbox.inflate(getStrokeWidth(magnet) / 2);\n }\n const intersections = line.intersect(bbox);\n const p = intersections && intersections.length\n ? line.start.closest(intersections)\n : line.end;\n return offset(p, line.start, options.offset);\n};\n//# sourceMappingURL=bbox.js.map","import { bbox } from './bbox';\nimport { offset, getStrokeWidth } from './util';\nimport { FunctionExt } from '../../util';\n/**\n * Places the connection point at the intersection between the\n * link path end segment and the element's unrotated bbox.\n */\nexport const rect = function (line, view, magnet, options, type) {\n const cell = view.cell;\n const angle = cell.isNode() ? cell.getAngle() : 0;\n if (angle === 0) {\n return FunctionExt.call(bbox, this, line, view, magnet, options, type);\n }\n const bboxRaw = view.getUnrotatedBBoxOfElement(magnet);\n if (options.stroked) {\n bboxRaw.inflate(getStrokeWidth(magnet) / 2);\n }\n const center = bboxRaw.getCenter();\n const lineRaw = line.clone().rotate(angle, center);\n const intersections = lineRaw.setLength(1e6).intersect(bboxRaw);\n const p = intersections && intersections.length\n ? lineRaw.start.closest(intersections).rotate(-angle, center)\n : line.end;\n return offset(p, line.start, options.offset);\n};\n//# sourceMappingURL=rect.js.map","import { ObjectExt, Dom } from '../../util';\nimport { Path, Rectangle, Ellipse } from '../../geometry';\nimport { offset, getStrokeWidth, findShapeNode } from './util';\n/**\n * Places the connection point at the intersection between the\n * edge path end segment and the actual shape of the target magnet.\n */\nexport const boundary = function (line, view, magnet, options) {\n let node;\n let intersection;\n const anchor = line.end;\n const selector = options.selector;\n if (typeof selector === 'string') {\n node = view.findOne(selector);\n }\n else if (Array.isArray(selector)) {\n node = ObjectExt.getByPath(magnet, selector);\n }\n else {\n node = findShapeNode(magnet);\n }\n if (!Dom.isSVGGraphicsElement(node)) {\n if (node === magnet || !Dom.isSVGGraphicsElement(magnet)) {\n return anchor;\n }\n node = magnet;\n }\n const localShape = view.getShapeOfElement(node);\n const magnetMatrix = view.getMatrixOfElement(node);\n const translateMatrix = view.getRootTranslatedMatrix();\n const rotateMatrix = view.getRootRotatedMatrix();\n const targetMatrix = translateMatrix\n .multiply(rotateMatrix)\n .multiply(magnetMatrix);\n const localMatrix = targetMatrix.inverse();\n const localLine = Dom.transformLine(line, localMatrix);\n const localRef = localLine.start.clone();\n const data = view.getDataOfElement(node);\n if (options.insideout === false) {\n if (data.shapeBBox == null) {\n data.shapeBBox = localShape.bbox();\n }\n const localBBox = data.shapeBBox;\n if (localBBox != null && localBBox.containsPoint(localRef)) {\n return anchor;\n }\n }\n if (options.extrapolate === true) {\n localLine.setLength(1e6);\n }\n // Caching segment subdivisions for paths\n let pathOptions;\n if (Path.isPath(localShape)) {\n const precision = options.precision || 2;\n if (data.segmentSubdivisions == null) {\n data.segmentSubdivisions = localShape.getSegmentSubdivisions({\n precision,\n });\n }\n pathOptions = {\n precision,\n segmentSubdivisions: data.segmentSubdivisions,\n };\n intersection = localLine.intersect(localShape, pathOptions);\n }\n else {\n intersection = localLine.intersect(localShape);\n }\n if (intersection) {\n if (Array.isArray(intersection)) {\n intersection = localRef.closest(intersection);\n }\n }\n else if (options.sticky === true) {\n // No intersection, find the closest point instead\n if (Rectangle.isRectangle(localShape)) {\n intersection = localShape.getNearestPointToPoint(localRef);\n }\n else if (Ellipse.isEllipse(localShape)) {\n intersection = localShape.intersectsWithLineFromCenterToPoint(localRef);\n }\n else {\n intersection = localShape.closestPoint(localRef, pathOptions);\n }\n }\n const cp = intersection\n ? Dom.transformPoint(intersection, targetMatrix)\n : anchor;\n let cpOffset = options.offset || 0;\n if (options.stroked !== false) {\n if (typeof cpOffset === 'object') {\n cpOffset = Object.assign({}, cpOffset);\n if (cpOffset.x == null) {\n cpOffset.x = 0;\n }\n cpOffset.x += getStrokeWidth(node) / 2;\n }\n else {\n cpOffset += getStrokeWidth(node) / 2;\n }\n }\n return offset(cp, line.start, cpOffset);\n};\n//# sourceMappingURL=boundary.js.map","import { offset } from './util';\nfunction alignLine(line, type, offset = 0) {\n const { start, end } = line;\n let a;\n let b;\n let direction;\n let coordinate;\n switch (type) {\n case 'left':\n coordinate = 'x';\n a = end;\n b = start;\n direction = -1;\n break;\n case 'right':\n coordinate = 'x';\n a = start;\n b = end;\n direction = 1;\n break;\n case 'top':\n coordinate = 'y';\n a = end;\n b = start;\n direction = -1;\n break;\n case 'bottom':\n coordinate = 'y';\n a = start;\n b = end;\n direction = 1;\n break;\n default:\n return;\n }\n if (start[coordinate] < end[coordinate]) {\n a[coordinate] = b[coordinate];\n }\n else {\n b[coordinate] = a[coordinate];\n }\n if (Number.isFinite(offset)) {\n a[coordinate] += direction * offset;\n b[coordinate] += direction * offset;\n }\n}\n/**\n * Places the connection point at the edge's endpoint.\n */\nexport const anchor = function (line, view, magnet, options) {\n const { alignOffset, align } = options;\n if (align) {\n alignLine(line, align, alignOffset);\n }\n return offset(line.end, line.start, options.offset);\n};\n//# sourceMappingURL=anchor.js.map","import { Registry } from '../registry';\nimport * as connectionPoints from './main';\nexport var ConnectionPoint;\n(function (ConnectionPoint) {\n ConnectionPoint.presets = connectionPoints;\n ConnectionPoint.registry = Registry.create({\n type: 'connection point',\n });\n ConnectionPoint.registry.register(ConnectionPoint.presets, true);\n})(ConnectionPoint || (ConnectionPoint = {}));\n//# sourceMappingURL=index.js.map","export const normal = function (vertices) {\n return [...vertices];\n};\n//# sourceMappingURL=normal.js.map","import { NumberExt } from '../../util';\n/**\n * Routes the edge always to/from a certain side\n */\nexport const oneSide = function (vertices, options, edgeView) {\n const side = options.side || 'bottom';\n const padding = NumberExt.normalizeSides(options.padding || 40);\n const sourceBBox = edgeView.sourceBBox;\n const targetBBox = edgeView.targetBBox;\n const sourcePoint = sourceBBox.getCenter();\n const targetPoint = targetBBox.getCenter();\n let coord;\n let dim;\n let factor;\n switch (side) {\n case 'top':\n factor = -1;\n coord = 'y';\n dim = 'height';\n break;\n case 'left':\n factor = -1;\n coord = 'x';\n dim = 'width';\n break;\n case 'right':\n factor = 1;\n coord = 'x';\n dim = 'width';\n break;\n case 'bottom':\n default:\n factor = 1;\n coord = 'y';\n dim = 'height';\n break;\n }\n // Move the points from the center of the element to outside of it.\n sourcePoint[coord] += factor * (sourceBBox[dim] / 2 + padding[side]);\n targetPoint[coord] += factor * (targetBBox[dim] / 2 + padding[side]);\n // Make edge orthogonal (at least the first and last vertex).\n if (factor * (sourcePoint[coord] - targetPoint[coord]) > 0) {\n targetPoint[coord] = sourcePoint[coord];\n }\n else {\n sourcePoint[coord] = targetPoint[coord];\n }\n return [sourcePoint.toJSON(), ...vertices, targetPoint.toJSON()];\n};\n//# sourceMappingURL=oneside.js.map","import { NumberExt } from '../../util';\nimport { Rectangle } from '../../geometry';\nexport function getPointBBox(p) {\n return new Rectangle(p.x, p.y, 0, 0);\n}\nexport function getPaddingBox(options = {}) {\n const sides = NumberExt.normalizeSides(options.padding || 20);\n return {\n x: -sides.left,\n y: -sides.top,\n width: sides.left + sides.right,\n height: sides.top + sides.bottom,\n };\n}\nexport function getSourceBBox(view, options = {}) {\n return view.sourceBBox.clone().moveAndExpand(getPaddingBox(options));\n}\nexport function getTargetBBox(view, options = {}) {\n return view.targetBBox.clone().moveAndExpand(getPaddingBox(options));\n}\nexport function getSourceAnchor(view, options = {}) {\n if (view.sourceAnchor) {\n return view.sourceAnchor;\n }\n const bbox = getSourceBBox(view, options);\n return bbox.getCenter();\n}\nexport function getTargetAnchor(view, options = {}) {\n if (view.targetAnchor) {\n return view.targetAnchor;\n }\n const bbox = getTargetBBox(view, options);\n return bbox.getCenter();\n}\n//# sourceMappingURL=util.js.map","import { ArrayExt } from '../../util';\nimport { Point, Line, Angle } from '../../geometry';\nimport * as Util from './util';\n/**\n * Returns a route with orthogonal line segments.\n */\nexport const orth = function (vertices, options, edgeView) {\n let sourceBBox = Util.getSourceBBox(edgeView, options);\n let targetBBox = Util.getTargetBBox(edgeView, options);\n const sourceAnchor = Util.getSourceAnchor(edgeView, options);\n const targetAnchor = Util.getTargetAnchor(edgeView, options);\n // If anchor lies outside of bbox, the bbox expands to include it\n sourceBBox = sourceBBox.union(Util.getPointBBox(sourceAnchor));\n targetBBox = targetBBox.union(Util.getPointBBox(targetAnchor));\n const points = vertices.map((p) => Point.create(p));\n points.unshift(sourceAnchor);\n points.push(targetAnchor);\n // bearing of previous route segment\n let bearing = null;\n const result = [];\n for (let i = 0, len = points.length - 1; i < len; i += 1) {\n let route = null;\n const from = points[i];\n const to = points[i + 1];\n const isOrthogonal = Private.getBearing(from, to) != null;\n if (i === 0) {\n // source\n if (i + 1 === len) {\n // source -> target\n // Expand one of the nodes by 1px to detect situations when the two\n // nodes are positioned next to each other with no gap in between.\n if (sourceBBox.intersectsWithRect(targetBBox.clone().inflate(1))) {\n route = Private.insideNode(from, to, sourceBBox, targetBBox);\n }\n else if (!isOrthogonal) {\n route = Private.nodeToNode(from, to, sourceBBox, targetBBox);\n }\n }\n else {\n // source -> vertex\n if (sourceBBox.containsPoint(to)) {\n route = Private.insideNode(from, to, sourceBBox, Util.getPointBBox(to).moveAndExpand(Util.getPaddingBox(options)));\n }\n else if (!isOrthogonal) {\n route = Private.nodeToVertex(from, to, sourceBBox);\n }\n }\n }\n else if (i + 1 === len) {\n // vertex -> target\n // prevent overlaps with previous line segment\n const isOrthogonalLoop = isOrthogonal && Private.getBearing(to, from) === bearing;\n if (targetBBox.containsPoint(from) || isOrthogonalLoop) {\n route = Private.insideNode(from, to, Util.getPointBBox(from).moveAndExpand(Util.getPaddingBox(options)), targetBBox, bearing);\n }\n else if (!isOrthogonal) {\n route = Private.vertexToNode(from, to, targetBBox, bearing);\n }\n }\n else if (!isOrthogonal) {\n // vertex -> vertex\n route = Private.vertexToVertex(from, to, bearing);\n }\n // set bearing for next iteration\n if (route) {\n result.push(...route.points);\n bearing = route.direction;\n }\n else {\n // orthogonal route and not looped\n bearing = Private.getBearing(from, to);\n }\n // push `to` point to identified orthogonal vertices array\n if (i + 1 < len) {\n result.push(to);\n }\n }\n return result;\n};\nvar Private;\n(function (Private) {\n /**\n * Bearing to opposite bearing map\n */\n const opposites = {\n N: 'S',\n S: 'N',\n E: 'W',\n W: 'E',\n };\n /**\n * Bearing to radians map\n */\n const radians = {\n N: (-Math.PI / 2) * 3,\n S: -Math.PI / 2,\n E: 0,\n W: Math.PI,\n };\n /**\n * Returns a point `p` where lines p,p1 and p,p2 are perpendicular\n * and p is not contained in the given box\n */\n function freeJoin(p1, p2, bbox) {\n let p = new Point(p1.x, p2.y);\n if (bbox.containsPoint(p)) {\n p = new Point(p2.x, p1.y);\n }\n // kept for reference\n // if (bbox.containsPoint(p)) {\n // return null\n // }\n return p;\n }\n /**\n * Returns either width or height of a bbox based on the given bearing.\n */\n function getBBoxSize(bbox, bearing) {\n return bbox[bearing === 'W' || bearing === 'E' ? 'width' : 'height'];\n }\n Private.getBBoxSize = getBBoxSize;\n function getBearing(from, to) {\n if (from.x === to.x) {\n return from.y > to.y ? 'N' : 'S';\n }\n if (from.y === to.y) {\n return from.x > to.x ? 'W' : 'E';\n }\n return null;\n }\n Private.getBearing = getBearing;\n function vertexToVertex(from, to, bearing) {\n const p1 = new Point(from.x, to.y);\n const p2 = new Point(to.x, from.y);\n const d1 = getBearing(from, p1);\n const d2 = getBearing(from, p2);\n const opposite = bearing ? opposites[bearing] : null;\n const p = d1 === bearing || (d1 !== opposite && (d2 === opposite || d2 !== bearing))\n ? p1\n : p2;\n return { points: [p], direction: getBearing(p, to) };\n }\n Private.vertexToVertex = vertexToVertex;\n function nodeToVertex(from, to, fromBBox) {\n const p = freeJoin(from, to, fromBBox);\n return { points: [p], direction: getBearing(p, to) };\n }\n Private.nodeToVertex = nodeToVertex;\n function vertexToNode(from, to, toBBox, bearing) {\n const points = [new Point(from.x, to.y), new Point(to.x, from.y)];\n const freePoints = points.filter((p) => !toBBox.containsPoint(p));\n const freeBearingPoints = freePoints.filter((p) => getBearing(p, from) !== bearing);\n let p;\n if (freeBearingPoints.length > 0) {\n // Try to pick a point which bears the same direction as the previous segment.\n p = freeBearingPoints.filter((p) => getBearing(from, p) === bearing).pop();\n p = p || freeBearingPoints[0];\n return {\n points: [p],\n direction: getBearing(p, to),\n };\n }\n {\n // Here we found only points which are either contained in the element or they would create\n // a link segment going in opposite direction from the previous one.\n // We take the point inside element and move it outside the element in the direction the\n // route is going. Now we can join this point with the current end (using freeJoin).\n p = ArrayExt.difference(points, freePoints)[0];\n const p2 = Point.create(to).move(p, -getBBoxSize(toBBox, bearing) / 2);\n const p1 = freeJoin(p2, from, toBBox);\n return {\n points: [p1, p2],\n direction: getBearing(p2, to),\n };\n }\n }\n Private.vertexToNode = vertexToNode;\n function nodeToNode(from, to, fromBBox, toBBox) {\n let route = nodeToVertex(to, from, toBBox);\n const p1 = route.points[0];\n if (fromBBox.containsPoint(p1)) {\n route = nodeToVertex(from, to, fromBBox);\n const p2 = route.points[0];\n if (toBBox.containsPoint(p2)) {\n const fromBorder = Point.create(from).move(p2, -getBBoxSize(fromBBox, getBearing(from, p2)) / 2);\n const toBorder = Point.create(to).move(p1, -getBBoxSize(toBBox, getBearing(to, p1)) / 2);\n const mid = new Line(fromBorder, toBorder).getCenter();\n const startRoute = nodeToVertex(from, mid, fromBBox);\n const endRoute = vertexToVertex(mid, to, startRoute.direction);\n route.points = [startRoute.points[0], endRoute.points[0]];\n route.direction = endRoute.direction;\n }\n }\n return route;\n }\n Private.nodeToNode = nodeToNode;\n // Finds route for situations where one node is inside the other.\n // Typically the route is directed outside the outer node first and\n // then back towards the inner node.\n function insideNode(from, to, fromBBox, toBBox, bearing) {\n const boundary = fromBBox.union(toBBox).inflate(1);\n // start from the point which is closer to the boundary\n const center = boundary.getCenter();\n const reversed = center.distance(to) > center.distance(from);\n const start = reversed ? to : from;\n const end = reversed ? from : to;\n let p1;\n let p2;\n let p3;\n if (bearing) {\n // Points on circle with radius equals 'W + H` are always outside the rectangle\n // with width W and height H if the center of that circle is the center of that rectangle.\n p1 = Point.fromPolar(boundary.width + boundary.height, radians[bearing], start);\n p1 = boundary.getNearestPointToPoint(p1).move(p1, -1);\n }\n else {\n p1 = boundary.getNearestPointToPoint(start).move(start, 1);\n }\n p2 = freeJoin(p1, end, boundary);\n let points;\n if (p1.round().equals(p2.round())) {\n p2 = Point.fromPolar(boundary.width + boundary.height, Angle.toRad(p1.theta(start)) + Math.PI / 2, end);\n p2 = boundary.getNearestPointToPoint(p2).move(end, 1).round();\n p3 = freeJoin(p1, p2, boundary);\n points = reversed ? [p2, p3, p1] : [p1, p3, p2];\n }\n else {\n points = reversed ? [p2, p1] : [p1, p2];\n }\n const direction = reversed ? getBearing(p1, to) : getBearing(p2, to);\n return {\n points,\n direction,\n };\n }\n Private.insideNode = insideNode;\n})(Private || (Private = {}));\n//# sourceMappingURL=orth.js.map","import { NumberExt } from '../../../util';\nimport { Point, Angle } from '../../../geometry';\nimport { orth } from '../orth';\nexport const defaults = {\n step: 10,\n maxLoopCount: 2000,\n precision: 1,\n maxDirectionChange: 90,\n perpendicular: true,\n excludeTerminals: [],\n excludeShapes: [],\n excludeHiddenNodes: false,\n startDirections: ['top', 'right', 'bottom', 'left'],\n endDirections: ['top', 'right', 'bottom', 'left'],\n directionMap: {\n top: { x: 0, y: -1 },\n right: { x: 1, y: 0 },\n bottom: { x: 0, y: 1 },\n left: { x: -1, y: 0 },\n },\n cost() {\n const step = resolve(this.step, this);\n return step;\n },\n directions() {\n const step = resolve(this.step, this);\n const cost = resolve(this.cost, this);\n return [\n { cost, offsetX: step, offsetY: 0 },\n { cost, offsetX: -step, offsetY: 0 },\n { cost, offsetX: 0, offsetY: step },\n { cost, offsetX: 0, offsetY: -step },\n ];\n },\n penalties() {\n const step = resolve(this.step, this);\n return {\n 0: 0,\n 45: step / 2,\n 90: step / 2,\n };\n },\n paddingBox() {\n const step = resolve(this.step, this);\n return {\n x: -step,\n y: -step,\n width: 2 * step,\n height: 2 * step,\n };\n },\n fallbackRouter: orth,\n draggingRouter: null,\n};\nexport function resolve(input, options) {\n if (typeof input === 'function') {\n return input.call(options);\n }\n return input;\n}\nexport function resolveOptions(options) {\n const result = Object.keys(options).reduce((memo, key) => {\n const ret = memo;\n if (key === 'fallbackRouter' ||\n key === 'draggingRouter' ||\n key === 'fallbackRoute') {\n ret[key] = options[key];\n }\n else {\n ret[key] = resolve(options[key], options);\n }\n return memo;\n }, {});\n if (result.padding) {\n const sides = NumberExt.normalizeSides(result.padding);\n options.paddingBox = {\n x: -sides.left,\n y: -sides.top,\n width: sides.left + sides.right,\n height: sides.top + sides.bottom,\n };\n }\n result.directions.forEach((direction) => {\n const point1 = new Point(0, 0);\n const point2 = new Point(direction.offsetX, direction.offsetY);\n direction.angle = Angle.normalize(point1.theta(point2));\n });\n return result;\n}\n//# sourceMappingURL=options.js.map","import { ArrayExt } from '../../../util';\nconst OPEN = 1;\nconst CLOSE = 2;\nexport class SortedSet {\n constructor() {\n this.items = [];\n this.hash = {};\n this.values = {};\n }\n add(item, value) {\n if (this.hash[item]) {\n // item removal\n this.items.splice(this.items.indexOf(item), 1);\n }\n else {\n this.hash[item] = OPEN;\n }\n this.values[item] = value;\n const index = ArrayExt.sortedIndexBy(this.items, item, (key) => this.values[key]);\n this.items.splice(index, 0, item);\n }\n pop() {\n const item = this.items.shift();\n if (item) {\n this.hash[item] = CLOSE;\n }\n return item;\n }\n isOpen(item) {\n return this.hash[item] === OPEN;\n }\n isClose(item) {\n return this.hash[item] === CLOSE;\n }\n isEmpty() {\n return this.items.length === 0;\n }\n}\n//# sourceMappingURL=sorted-set.js.map","import { ArrayExt } from '../../../util';\nimport { Point } from '../../../geometry';\n/**\n * Helper structure to identify whether a point lies inside an obstacle.\n */\nexport class ObstacleMap {\n constructor(options) {\n this.options = options;\n this.mapGridSize = 100;\n this.map = {};\n }\n /**\n * Builds a map of all nodes for quicker obstacle queries i.e. is a point\n * contained in any obstacle?\n *\n * A simplified grid search.\n */\n build(model, edge) {\n const options = this.options;\n // source or target node could be excluded from set of obstacles\n const excludedTerminals = options.excludeTerminals.reduce((memo, type) => {\n const terminal = edge[type];\n if (terminal) {\n const cell = model.getCell(terminal.cell);\n if (cell) {\n memo.push(cell);\n }\n }\n return memo;\n }, []);\n let excludedAncestors = [];\n const source = model.getCell(edge.getSourceCellId());\n if (source) {\n excludedAncestors = ArrayExt.union(excludedAncestors, source.getAncestors().map((cell) => cell.id));\n }\n const target = model.getCell(edge.getTargetCellId());\n if (target) {\n excludedAncestors = ArrayExt.union(excludedAncestors, target.getAncestors().map((cell) => cell.id));\n }\n // The graph is divided into smaller cells, where each holds information\n // about which node belong to it. When we query whether a point lies\n // inside an obstacle we don't need to go through all obstacles, we check\n // only those in a particular cell.\n const mapGridSize = this.mapGridSize;\n model.getNodes().reduce((map, node) => {\n const shape = node.shape;\n const excludeShapes = options.excludeShapes;\n const excType = shape ? excludeShapes.includes(shape) : false;\n const excTerminal = excludedTerminals.some((cell) => cell.id === node.id);\n const excAncestor = excludedAncestors.includes(node.id);\n const excHidden = options.excludeHiddenNodes && !node.isVisible();\n const excluded = excType || excTerminal || excAncestor || excHidden;\n if (!excluded) {\n const bbox = node.getBBox().moveAndExpand(options.paddingBox);\n const origin = bbox.getOrigin().snapToGrid(mapGridSize);\n const corner = bbox.getCorner().snapToGrid(mapGridSize);\n for (let x = origin.x; x <= corner.x; x += mapGridSize) {\n for (let y = origin.y; y <= corner.y; y += mapGridSize) {\n const key = new Point(x, y).toString();\n if (map[key] == null) {\n map[key] = [];\n }\n map[key].push(bbox);\n }\n }\n }\n return map;\n }, this.map);\n return this;\n }\n isAccessible(point) {\n const key = point.clone().snapToGrid(this.mapGridSize).toString();\n const rects = this.map[key];\n return rects ? rects.every((rect) => !rect.containsPoint(point)) : true;\n }\n}\n//# sourceMappingURL=obstacle-map.js.map","import { Util } from '../../../global/util';\nimport { Point, Line, Angle } from '../../../geometry';\nexport function getSourceBBox(view, options) {\n const bbox = view.sourceBBox.clone();\n if (options && options.paddingBox) {\n return bbox.moveAndExpand(options.paddingBox);\n }\n return bbox;\n}\nexport function getTargetBBox(view, options) {\n const bbox = view.targetBBox.clone();\n if (options && options.paddingBox) {\n return bbox.moveAndExpand(options.paddingBox);\n }\n return bbox;\n}\nexport function getSourceEndpoint(view, options) {\n if (view.sourceAnchor) {\n return view.sourceAnchor;\n }\n const sourceBBox = getSourceBBox(view, options);\n return sourceBBox.getCenter();\n}\nexport function getTargetEndpoint(view, options) {\n if (view.targetAnchor) {\n return view.targetAnchor;\n }\n const targetBBox = getTargetBBox(view, options);\n return targetBBox.getCenter();\n}\n// returns a direction index from start point to end point\n// corrects for grid deformation between start and end\nexport function getDirectionAngle(start, end, directionCount, grid, options) {\n const quadrant = 360 / directionCount;\n const angleTheta = start.theta(fixAngleEnd(start, end, grid, options));\n const normalizedAngle = Angle.normalize(angleTheta + quadrant / 2);\n return quadrant * Math.floor(normalizedAngle / quadrant);\n}\nfunction fixAngleEnd(start, end, grid, options) {\n const step = options.step;\n const diffX = end.x - start.x;\n const diffY = end.y - start.y;\n const gridStepsX = diffX / grid.x;\n const gridStepsY = diffY / grid.y;\n const distanceX = gridStepsX * step;\n const distanceY = gridStepsY * step;\n return new Point(start.x + distanceX, start.y + distanceY);\n}\n/**\n * Returns the change in direction between two direction angles.\n */\nexport function getDirectionChange(angle1, angle2) {\n const change = Math.abs(angle1 - angle2);\n return change > 180 ? 360 - change : change;\n}\n// fix direction offsets according to current grid\nexport function getGridOffsets(grid, options) {\n const step = options.step;\n options.directions.forEach((direction) => {\n direction.gridOffsetX = (direction.offsetX / step) * grid.x;\n direction.gridOffsetY = (direction.offsetY / step) * grid.y;\n });\n return options.directions;\n}\n// get grid size in x and y dimensions, adapted to source and target positions\nexport function getGrid(step, source, target) {\n return {\n source: source.clone(),\n x: getGridDimension(target.x - source.x, step),\n y: getGridDimension(target.y - source.y, step),\n };\n}\nfunction getGridDimension(diff, step) {\n // return step if diff = 0\n if (!diff) {\n return step;\n }\n const abs = Math.abs(diff);\n const count = Math.round(abs / step);\n // return `abs` if less than one step apart\n if (!count) {\n return abs;\n }\n // otherwise, return corrected step\n const roundedDiff = count * step;\n const remainder = abs - roundedDiff;\n const correction = remainder / count;\n return step + correction;\n}\nfunction snapGrid(point, grid) {\n const source = grid.source;\n const x = Util.snapToGrid(point.x - source.x, grid.x) + source.x;\n const y = Util.snapToGrid(point.y - source.y, grid.y) + source.y;\n return new Point(x, y);\n}\nexport function round(point, precision) {\n return point.round(precision);\n}\nexport function align(point, grid, precision) {\n return round(snapGrid(point.clone(), grid), precision);\n}\nexport function getKey(point) {\n return point.toString();\n}\nexport function normalizePoint(point) {\n return new Point(point.x === 0 ? 0 : Math.abs(point.x) / point.x, point.y === 0 ? 0 : Math.abs(point.y) / point.y);\n}\nexport function getCost(from, anchors) {\n let min = Infinity;\n for (let i = 0, len = anchors.length; i < len; i += 1) {\n const dist = from.manhattanDistance(anchors[i]);\n if (dist < min) {\n min = dist;\n }\n }\n return min;\n}\n// Find points around the bbox taking given directions into account\n// lines are drawn from anchor in given directions, intersections recorded\n// if anchor is outside bbox, only those directions that intersect get a rect point\n// the anchor itself is returned as rect point (representing some directions)\n// (since those directions are unobstructed by the bbox)\nexport function getRectPoints(anchor, bbox, directionList, grid, options) {\n const precision = options.precision;\n const directionMap = options.directionMap;\n const centerVector = anchor.diff(bbox.getCenter());\n const rectPoints = Object.keys(directionMap).reduce((res, key) => {\n if (directionList.includes(key)) {\n const direction = directionMap[key];\n // Create a line that is guaranteed to intersect the bbox if bbox\n // is in the direction even if anchor lies outside of bbox.\n const ending = new Point(anchor.x + direction.x * (Math.abs(centerVector.x) + bbox.width), anchor.y + direction.y * (Math.abs(centerVector.y) + bbox.height));\n const intersectionLine = new Line(anchor, ending);\n // Get the farther intersection, in case there are two\n // (that happens if anchor lies next to bbox)\n const intersections = intersectionLine.intersect(bbox) || [];\n let farthestIntersectionDistance;\n let farthestIntersection = null;\n for (let i = 0; i < intersections.length; i += 1) {\n const intersection = intersections[i];\n const distance = anchor.squaredDistance(intersection);\n if (farthestIntersectionDistance == null ||\n distance > farthestIntersectionDistance) {\n farthestIntersectionDistance = distance;\n farthestIntersection = intersection;\n }\n }\n // If an intersection was found in this direction, it is our rectPoint\n if (farthestIntersection) {\n let target = align(farthestIntersection, grid, precision);\n // If the rectPoint lies inside the bbox, offset it by one more step\n if (bbox.containsPoint(target)) {\n target = align(target.translate(direction.x * grid.x, direction.y * grid.y), grid, precision);\n }\n res.push(target);\n }\n }\n return res;\n }, []);\n // if anchor lies outside of bbox, add it to the array of points\n if (!bbox.containsPoint(anchor)) {\n rectPoints.push(align(anchor, grid, precision));\n }\n return rectPoints;\n}\n// reconstructs a route by concatenating points with their parents\nexport function reconstructRoute(parents, points, tailPoint, from, to) {\n const route = [];\n let prevDiff = normalizePoint(to.diff(tailPoint));\n // tailPoint is assumed to be aligned already\n let currentKey = getKey(tailPoint);\n let parent = parents[currentKey];\n let point;\n while (parent) {\n // point is assumed to be aligned already\n point = points[currentKey];\n const diff = normalizePoint(point.diff(parent));\n if (!diff.equals(prevDiff)) {\n route.unshift(point);\n prevDiff = diff;\n }\n // parent is assumed to be aligned already\n currentKey = getKey(parent);\n parent = parents[currentKey];\n }\n // leadPoint is assumed to be aligned already\n const leadPoint = points[currentKey];\n const fromDiff = normalizePoint(leadPoint.diff(from));\n if (!fromDiff.equals(prevDiff)) {\n route.unshift(leadPoint);\n }\n return route;\n}\n//# sourceMappingURL=util.js.map","import { FunctionExt } from '../../../util';\nimport { Point, Rectangle } from '../../../geometry';\nimport { SortedSet } from './sorted-set';\nimport { ObstacleMap } from './obstacle-map';\nimport * as util from './util';\nimport { resolveOptions, } from './options';\n/**\n * Finds the route between two points (`from`, `to`).\n */\nfunction findRoute(edgeView, from, to, map, options) {\n const precision = options.precision;\n let sourceEndpoint;\n let targetEndpoint;\n if (Rectangle.isRectangle(from)) {\n sourceEndpoint = util.round(util.getSourceEndpoint(edgeView, options).clone(), precision);\n }\n else {\n sourceEndpoint = util.round(from.clone(), precision);\n }\n if (Rectangle.isRectangle(to)) {\n targetEndpoint = util.round(util.getTargetEndpoint(edgeView, options).clone(), precision);\n }\n else {\n targetEndpoint = util.round(to.clone(), precision);\n }\n // Get grid for this route.\n const grid = util.getGrid(options.step, sourceEndpoint, targetEndpoint);\n // Get pathfinding points.\n // -----------------------\n const startPoint = sourceEndpoint;\n const endPoint = targetEndpoint;\n let startPoints;\n let endPoints;\n if (Rectangle.isRectangle(from)) {\n startPoints = util.getRectPoints(startPoint, from, options.startDirections, grid, options);\n }\n else {\n startPoints = [startPoint];\n }\n if (Rectangle.isRectangle(to)) {\n endPoints = util.getRectPoints(targetEndpoint, to, options.endDirections, grid, options);\n }\n else {\n endPoints = [endPoint];\n }\n // take into account only accessible rect points (those not under obstacles)\n startPoints = startPoints.filter((p) => map.isAccessible(p));\n endPoints = endPoints.filter((p) => map.isAccessible(p));\n // There is an accessible route point on both sides.\n if (startPoints.length > 0 && endPoints.length > 0) {\n const openSet = new SortedSet();\n // Keeps the actual points for given nodes of the open set.\n const points = {};\n // Keeps the point that is immediate predecessor of given element.\n const parents = {};\n // Cost from start to a point along best known path.\n const costs = {};\n for (let i = 0, n = startPoints.length; i < n; i += 1) {\n // startPoint is assumed to be aligned already\n const startPoint = startPoints[i];\n const key = util.getKey(startPoint);\n openSet.add(key, util.getCost(startPoint, endPoints));\n points[key] = startPoint;\n costs[key] = 0;\n }\n const previousRouteDirectionAngle = options.previousDirectionAngle;\n // undefined for first route\n const isPathBeginning = previousRouteDirectionAngle === undefined;\n // directions\n let direction;\n let directionChange;\n const directions = util.getGridOffsets(grid, options);\n const numDirections = directions.length;\n const endPointsKeys = endPoints.reduce((res, endPoint) => {\n const key = util.getKey(endPoint);\n res.push(key);\n return res;\n }, []);\n // main route finding loop\n const sameStartEndPoints = Point.equalPoints(startPoints, endPoints);\n let loopsRemaining = options.maxLoopCount;\n while (!openSet.isEmpty() && loopsRemaining > 0) {\n // Get the closest item and mark it CLOSED\n const currentKey = openSet.pop();\n const currentPoint = points[currentKey];\n const currentParent = parents[currentKey];\n const currentCost = costs[currentKey];\n const isStartPoint = currentPoint.equals(startPoint);\n const isRouteBeginning = currentParent == null;\n let previousDirectionAngle;\n if (!isRouteBeginning) {\n previousDirectionAngle = util.getDirectionAngle(currentParent, currentPoint, numDirections, grid, options);\n }\n else if (!isPathBeginning) {\n // a vertex on the route\n previousDirectionAngle = previousRouteDirectionAngle;\n }\n else if (!isStartPoint) {\n // beginning of route on the path\n previousDirectionAngle = util.getDirectionAngle(startPoint, currentPoint, numDirections, grid, options);\n }\n else {\n previousDirectionAngle = null;\n }\n // Check if we reached any endpoint\n const skipEndCheck = isRouteBeginning && sameStartEndPoints;\n if (!skipEndCheck && endPointsKeys.indexOf(currentKey) >= 0) {\n options.previousDirectionAngle = previousDirectionAngle;\n return util.reconstructRoute(parents, points, currentPoint, startPoint, endPoint);\n }\n // Go over all possible directions and find neighbors\n for (let i = 0; i < numDirections; i += 1) {\n direction = directions[i];\n const directionAngle = direction.angle;\n directionChange = util.getDirectionChange(previousDirectionAngle, directionAngle);\n // Don't use the point changed rapidly.\n if (!(isPathBeginning && isStartPoint) &&\n directionChange > options.maxDirectionChange) {\n continue;\n }\n const neighborPoint = util.align(currentPoint\n .clone()\n .translate(direction.gridOffsetX || 0, direction.gridOffsetY || 0), grid, precision);\n const neighborKey = util.getKey(neighborPoint);\n // Closed points were already evaluated.\n if (openSet.isClose(neighborKey) || !map.isAccessible(neighborPoint)) {\n continue;\n }\n // Neighbor is an end point.\n if (endPointsKeys.indexOf(neighborKey) >= 0) {\n const isEndPoint = neighborPoint.equals(endPoint);\n if (!isEndPoint) {\n const endDirectionAngle = util.getDirectionAngle(neighborPoint, endPoint, numDirections, grid, options);\n const endDirectionChange = util.getDirectionChange(directionAngle, endDirectionAngle);\n if (endDirectionChange > options.maxDirectionChange) {\n continue;\n }\n }\n }\n // The current direction is ok.\n // ----------------------------\n const neighborCost = direction.cost;\n const neighborPenalty = isStartPoint\n ? 0\n : options.penalties[directionChange];\n const costFromStart = currentCost + neighborCost + neighborPenalty;\n // Neighbor point has not been processed yet or the cost of\n // the path from start is lower than previously calculated.\n if (!openSet.isOpen(neighborKey) ||\n costFromStart < costs[neighborKey]) {\n points[neighborKey] = neighborPoint;\n parents[neighborKey] = currentPoint;\n costs[neighborKey] = costFromStart;\n openSet.add(neighborKey, costFromStart + util.getCost(neighborPoint, endPoints));\n }\n }\n loopsRemaining -= 1;\n }\n }\n if (options.fallbackRoute) {\n return FunctionExt.call(options.fallbackRoute, this, startPoint, endPoint, options);\n }\n return null;\n}\nexport const router = function (vertices, optionsRaw, edgeView) {\n const options = resolveOptions(optionsRaw);\n const sourceBBox = util.getSourceBBox(edgeView, options);\n const targetBBox = util.getTargetBBox(edgeView, options);\n const sourceEndpoint = util.getSourceEndpoint(edgeView, options);\n // pathfinding\n const map = new ObstacleMap(options).build(edgeView.graph.model, edgeView.cell);\n const oldVertices = vertices.map((p) => Point.create(p));\n const newVertices = [];\n // The origin of first route's grid, does not need snapping\n let tailPoint = sourceEndpoint;\n let from;\n let to;\n for (let i = 0, len = oldVertices.length; i <= len; i += 1) {\n let partialRoute = null;\n from = to || sourceBBox;\n to = oldVertices[i];\n // This is the last iteration\n if (to == null) {\n to = targetBBox;\n // If the target is a point, we should use dragging route\n // instead of main routing method if it has been provided.\n const edge = edgeView.cell;\n const isEndingAtPoint = edge.getSourceCellId() == null || edge.getTargetCellId() == null;\n if (isEndingAtPoint && typeof options.draggingRouter === 'function') {\n const dragFrom = from === sourceBBox ? sourceEndpoint : from;\n const dragTo = to.getOrigin();\n partialRoute = FunctionExt.call(options.draggingRouter, edgeView, dragFrom, dragTo, options);\n }\n }\n // Find the partial route\n if (partialRoute == null) {\n partialRoute = findRoute(edgeView, from, to, map, options);\n }\n // Cannot found the partial route.\n if (partialRoute === null) {\n return FunctionExt.call(options.fallbackRouter, this, vertices, options, edgeView);\n }\n // Remove the first point if the previous partial route has\n // the same point as last.\n const leadPoint = partialRoute[0];\n if (leadPoint && leadPoint.equals(tailPoint)) {\n partialRoute.shift();\n }\n // Save tailPoint for next iteration\n tailPoint = partialRoute[partialRoute.length - 1] || tailPoint;\n newVertices.push(...partialRoute);\n }\n return newVertices;\n};\n//# sourceMappingURL=router.js.map","import { FunctionExt } from '../../../util';\nimport { router } from './router';\nimport { defaults } from './options';\nexport const manhattan = function (vertices, options, edgeView) {\n return FunctionExt.call(router, this, vertices, Object.assign(Object.assign({}, defaults), options), edgeView);\n};\n//# sourceMappingURL=index.js.map","import { FunctionExt } from '../../util';\nimport { Point, Line, Angle } from '../../geometry';\nimport { resolve } from './manhattan/options';\nimport { manhattan } from './manhattan/index';\nconst defaults = {\n maxDirectionChange: 45,\n // an array of directions to find next points on the route\n // different from start/end directions\n directions() {\n const step = resolve(this.step, this);\n const cost = resolve(this.cost, this);\n const diagonalCost = Math.ceil(Math.sqrt((step * step) << 1)); // eslint-disable-line no-bitwise\n return [\n { cost, offsetX: step, offsetY: 0 },\n { cost: diagonalCost, offsetX: step, offsetY: step },\n { cost, offsetX: 0, offsetY: step },\n { cost: diagonalCost, offsetX: -step, offsetY: step },\n { cost, offsetX: -step, offsetY: 0 },\n { cost: diagonalCost, offsetX: -step, offsetY: -step },\n { cost, offsetX: 0, offsetY: -step },\n { cost: diagonalCost, offsetX: step, offsetY: -step },\n ];\n },\n // a simple route used in situations when main routing method fails\n // (exceed max number of loop iterations, inaccessible)\n fallbackRoute(from, to, options) {\n // Find a route which breaks by 45 degrees ignoring all obstacles.\n const theta = from.theta(to);\n const route = [];\n let a = { x: to.x, y: from.y };\n let b = { x: from.x, y: to.y };\n if (theta % 180 > 90) {\n const t = a;\n a = b;\n b = t;\n }\n const p1 = theta % 90 < 45 ? a : b;\n const l1 = new Line(from, p1);\n const alpha = 90 * Math.ceil(theta / 90);\n const p2 = Point.fromPolar(l1.squaredLength(), Angle.toRad(alpha + 135), p1);\n const l2 = new Line(to, p2);\n const intersectionPoint = l1.intersectsWithLine(l2);\n const point = intersectionPoint || to;\n const directionFrom = intersectionPoint ? point : from;\n const quadrant = 360 / options.directions.length;\n const angleTheta = directionFrom.theta(to);\n const normalizedAngle = Angle.normalize(angleTheta + quadrant / 2);\n const directionAngle = quadrant * Math.floor(normalizedAngle / quadrant);\n options.previousDirectionAngle = directionAngle;\n if (point)\n route.push(point.round());\n route.push(to);\n return route;\n },\n};\nexport const metro = function (vertices, options, linkView) {\n return FunctionExt.call(manhattan, this, vertices, Object.assign(Object.assign({}, defaults), options), linkView);\n};\n//# sourceMappingURL=metro.js.map","export const er = function (vertices, options, edgeView) {\n const offsetRaw = options.offset || 32;\n const min = options.min == null ? 16 : options.min;\n let offset = 0;\n let direction = options.direction;\n const sourceBBox = edgeView.sourceBBox;\n const targetBBox = edgeView.targetBBox;\n const sourcePoint = sourceBBox.getCenter();\n const targetPoint = targetBBox.getCenter();\n if (typeof offsetRaw === 'number') {\n offset = offsetRaw;\n }\n if (direction == null) {\n let dx = targetBBox.left - sourceBBox.right;\n let dy = targetBBox.top - sourceBBox.bottom;\n if (dx >= 0 && dy >= 0) {\n direction = dx >= dy ? 'L' : 'T';\n }\n else if (dx <= 0 && dy >= 0) {\n dx = sourceBBox.left - targetBBox.right;\n if (dx >= 0) {\n direction = dx >= dy ? 'R' : 'T';\n }\n else {\n direction = 'T';\n }\n }\n else if (dx >= 0 && dy <= 0) {\n dy = sourceBBox.top - targetBBox.bottom;\n if (dy >= 0) {\n direction = dx >= dy ? 'L' : 'B';\n }\n else {\n direction = 'L';\n }\n }\n else {\n dx = sourceBBox.left - targetBBox.right;\n dy = sourceBBox.top - targetBBox.bottom;\n if (dx >= 0 && dy >= 0) {\n direction = dx >= dy ? 'R' : 'B';\n }\n else if (dx <= 0 && dy >= 0) {\n direction = 'B';\n }\n else if (dx >= 0 && dy <= 0) {\n direction = 'R';\n }\n else {\n direction = Math.abs(dx) > Math.abs(dy) ? 'R' : 'B';\n }\n }\n }\n if (direction === 'H') {\n direction = targetPoint.x - sourcePoint.x >= 0 ? 'L' : 'R';\n }\n else if (direction === 'V') {\n direction = targetPoint.y - sourcePoint.y >= 0 ? 'T' : 'B';\n }\n if (offsetRaw === 'center') {\n if (direction === 'L') {\n offset = (targetBBox.left - sourceBBox.right) / 2;\n }\n else if (direction === 'R') {\n offset = (sourceBBox.left - targetBBox.right) / 2;\n }\n else if (direction === 'T') {\n offset = (targetBBox.top - sourceBBox.bottom) / 2;\n }\n else if (direction === 'B') {\n offset = (sourceBBox.top - targetBBox.bottom) / 2;\n }\n }\n let coord;\n let dim;\n let factor;\n const horizontal = direction === 'L' || direction === 'R';\n if (horizontal) {\n if (targetPoint.y === sourcePoint.y) {\n return [...vertices];\n }\n factor = direction === 'L' ? 1 : -1;\n coord = 'x';\n dim = 'width';\n }\n else {\n if (targetPoint.x === sourcePoint.x) {\n return [...vertices];\n }\n factor = direction === 'T' ? 1 : -1;\n coord = 'y';\n dim = 'height';\n }\n const source = sourcePoint.clone();\n const target = targetPoint.clone();\n source[coord] += factor * (sourceBBox[dim] / 2 + offset);\n target[coord] -= factor * (targetBBox[dim] / 2 + offset);\n if (horizontal) {\n const sourceX = source.x;\n const targetX = target.x;\n const sourceDelta = sourceBBox.width / 2 + min;\n const targetDelta = targetBBox.width / 2 + min;\n if (targetPoint.x > sourcePoint.x) {\n if (targetX <= sourceX) {\n source.x = Math.max(targetX, sourcePoint.x + sourceDelta);\n target.x = Math.min(sourceX, targetPoint.x - targetDelta);\n }\n }\n else if (targetX >= sourceX) {\n source.x = Math.min(targetX, sourcePoint.x - sourceDelta);\n target.x = Math.max(sourceX, targetPoint.x + targetDelta);\n }\n }\n else {\n const sourceY = source.y;\n const targetY = target.y;\n const sourceDelta = sourceBBox.height / 2 + min;\n const targetDelta = targetBBox.height / 2 + min;\n if (targetPoint.y > sourcePoint.y) {\n if (targetY <= sourceY) {\n source.y = Math.max(targetY, sourcePoint.y + sourceDelta);\n target.y = Math.min(sourceY, targetPoint.y - targetDelta);\n }\n }\n else if (targetY >= sourceY) {\n source.y = Math.min(targetY, sourcePoint.y - sourceDelta);\n target.y = Math.max(sourceY, targetPoint.y + targetDelta);\n }\n }\n return [source.toJSON(), ...vertices, target.toJSON()];\n};\n//# sourceMappingURL=er.js.map","import { Angle, Point, Line } from '../../geometry';\nfunction rollup(points, merge) {\n if (merge != null && merge !== false) {\n const amount = typeof merge === 'boolean' ? 0 : merge;\n if (amount > 0) {\n const center1 = Point.create(points[1]).move(points[2], amount);\n const center2 = Point.create(points[1]).move(points[0], amount);\n return [center1.toJSON(), ...points, center2.toJSON()];\n }\n {\n const center = points[1];\n return [Object.assign({}, center), ...points, Object.assign({}, center)];\n }\n }\n return points;\n}\nexport const loop = function (vertices, options, edgeView) {\n const width = options.width || 50;\n const height = options.height || 80;\n const halfHeight = height / 2;\n const angle = options.angle || 'auto';\n const sourceAnchor = edgeView.sourceAnchor;\n const targetAnchor = edgeView.targetAnchor;\n const sourceBBox = edgeView.sourceBBox;\n const targetBBox = edgeView.targetBBox;\n if (sourceAnchor.equals(targetAnchor)) {\n const getVertices = (angle) => {\n const rad = Angle.toRad(angle);\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const center = new Point(sourceAnchor.x + cos * width, sourceAnchor.y + sin * width);\n const ref = new Point(center.x - cos * halfHeight, center.y - sin * halfHeight);\n const p1 = ref.clone().rotate(-90, center);\n const p2 = ref.clone().rotate(90, center);\n return [p1.toJSON(), center.toJSON(), p2.toJSON()];\n };\n const validate = (end) => {\n const start = sourceAnchor.clone().move(end, -1);\n const line = new Line(start, end);\n return (!sourceBBox.containsPoint(end) && !sourceBBox.intersectsWithLine(line));\n };\n const angles = [0, 90, 180, 270, 45, 135, 225, 315];\n if (typeof angle === 'number') {\n return rollup(getVertices(angle), options.merge);\n }\n const center = sourceBBox.getCenter();\n if (center.equals(sourceAnchor)) {\n return rollup(getVertices(0), options.merge);\n }\n const deg = center.angleBetween(sourceAnchor, center.clone().translate(1, 0));\n let ret = getVertices(deg);\n if (validate(ret[1])) {\n return rollup(ret, options.merge);\n }\n // return the best vertices\n for (let i = 1, l = angles.length; i < l; i += 1) {\n ret = getVertices(deg + angles[i]);\n if (validate(ret[1])) {\n return rollup(ret, options.merge);\n }\n }\n return rollup(ret, options.merge);\n }\n {\n const line = new Line(sourceAnchor, targetAnchor);\n let parallel = line.parallel(-width);\n let center = parallel.getCenter();\n let p1 = parallel.start.clone().move(parallel.end, halfHeight);\n let p2 = parallel.end.clone().move(parallel.start, halfHeight);\n const ref = line.parallel(-1);\n const line1 = new Line(ref.start, center);\n const line2 = new Line(ref.end, center);\n if (sourceBBox.containsPoint(center) ||\n targetBBox.containsPoint(center) ||\n sourceBBox.intersectsWithLine(line1) ||\n sourceBBox.intersectsWithLine(line2) ||\n targetBBox.intersectsWithLine(line1) ||\n targetBBox.intersectsWithLine(line2)) {\n parallel = line.parallel(width);\n center = parallel.getCenter();\n p1 = parallel.start.clone().move(parallel.end, halfHeight);\n p2 = parallel.end.clone().move(parallel.start, halfHeight);\n }\n if (options.merge) {\n const line = new Line(sourceAnchor, targetAnchor);\n const normal = new Line(center, line.center).setLength(Number.MAX_SAFE_INTEGER);\n const intersects1 = sourceBBox.intersectsWithLine(normal);\n const intersects2 = targetBBox.intersectsWithLine(normal);\n const intersects = intersects1\n ? Array.isArray(intersects1)\n ? intersects1\n : [intersects1]\n : [];\n if (intersects2) {\n if (Array.isArray(intersects2)) {\n intersects.push(...intersects2);\n }\n else {\n intersects.push(intersects2);\n }\n }\n const anchor = line.center.closest(intersects);\n if (anchor) {\n edgeView.sourceAnchor = anchor.clone();\n edgeView.targetAnchor = anchor.clone();\n }\n else {\n edgeView.sourceAnchor = line.center.clone();\n edgeView.targetAnchor = line.center.clone();\n }\n }\n return rollup([p1.toJSON(), center.toJSON(), p2.toJSON()], options.merge);\n }\n};\n//# sourceMappingURL=loop.js.map","import { Registry } from '../registry';\nimport * as routers from './main';\nexport var Router;\n(function (Router) {\n Router.presets = routers;\n Router.registry = Registry.create({\n type: 'router',\n });\n Router.registry.register(Router.presets, true);\n})(Router || (Router = {}));\n//# sourceMappingURL=index.js.map","import { Polyline, Path } from '../../geometry';\nexport const normal = function (sourcePoint, targetPoint, routePoints, options = {}) {\n const points = [sourcePoint, ...routePoints, targetPoint];\n const polyline = new Polyline(points);\n const path = new Path(polyline);\n return options.raw ? path : path.serialize();\n};\n//# sourceMappingURL=normal.js.map","import { Path, Point } from '../../geometry';\nexport const loop = function (sourcePoint, targetPoint, routePoints, options = {}) {\n const fix = routePoints.length === 3 ? 0 : 1;\n const p1 = Point.create(routePoints[0 + fix]);\n const p2 = Point.create(routePoints[2 + fix]);\n const center = Point.create(routePoints[1 + fix]);\n if (!Point.equals(sourcePoint, targetPoint)) {\n const middle = new Point((sourcePoint.x + targetPoint.x) / 2, (sourcePoint.y + targetPoint.y) / 2);\n const angle = middle.angleBetween(Point.create(sourcePoint).rotate(90, middle), center);\n if (angle > 1) {\n p1.rotate(180 - angle, middle);\n p2.rotate(180 - angle, middle);\n center.rotate(180 - angle, middle);\n }\n }\n const pathData = `\n M ${sourcePoint.x} ${sourcePoint.y}\n Q ${p1.x} ${p1.y} ${center.x} ${center.y}\n Q ${p2.x} ${p2.y} ${targetPoint.x} ${targetPoint.y}\n `;\n return options.raw ? Path.parse(pathData) : pathData;\n};\n//# sourceMappingURL=loop.js.map","import { Point, Path } from '../../geometry';\nexport const rounded = function (sourcePoint, targetPoint, routePoints, options = {}) {\n const path = new Path();\n path.appendSegment(Path.createSegment('M', sourcePoint));\n const f13 = 1 / 3;\n const f23 = 2 / 3;\n const radius = options.radius || 10;\n let prevDistance;\n let nextDistance;\n for (let i = 0, ii = routePoints.length; i < ii; i += 1) {\n const curr = Point.create(routePoints[i]);\n const prev = routePoints[i - 1] || sourcePoint;\n const next = routePoints[i + 1] || targetPoint;\n prevDistance = nextDistance || curr.distance(prev) / 2;\n nextDistance = curr.distance(next) / 2;\n const startMove = -Math.min(radius, prevDistance);\n const endMove = -Math.min(radius, nextDistance);\n const roundedStart = curr.clone().move(prev, startMove).round();\n const roundedEnd = curr.clone().move(next, endMove).round();\n const control1 = new Point(f13 * roundedStart.x + f23 * curr.x, f23 * curr.y + f13 * roundedStart.y);\n const control2 = new Point(f13 * roundedEnd.x + f23 * curr.x, f23 * curr.y + f13 * roundedEnd.y);\n path.appendSegment(Path.createSegment('L', roundedStart));\n path.appendSegment(Path.createSegment('C', control1, control2, roundedEnd));\n }\n path.appendSegment(Path.createSegment('L', targetPoint));\n return options.raw ? path : path.serialize();\n};\n//# sourceMappingURL=rounded.js.map","import { Curve, Path } from '../../geometry';\nexport const smooth = function (sourcePoint, targetPoint, routePoints, options = {}) {\n let path;\n let direction = options.direction;\n if (routePoints && routePoints.length !== 0) {\n const points = [sourcePoint, ...routePoints, targetPoint];\n const curves = Curve.throughPoints(points);\n path = new Path(curves);\n }\n else {\n // If we have no route, use a default cubic bezier curve, cubic bezier\n // requires two control points, the control points have `x` midway\n // between source and target. This produces an S-like curve.\n path = new Path();\n path.appendSegment(Path.createSegment('M', sourcePoint));\n if (!direction) {\n direction =\n Math.abs(sourcePoint.x - targetPoint.x) >=\n Math.abs(sourcePoint.y - targetPoint.y)\n ? 'H'\n : 'V';\n }\n if (direction === 'H') {\n const controlPointX = (sourcePoint.x + targetPoint.x) / 2;\n path.appendSegment(Path.createSegment('C', controlPointX, sourcePoint.y, controlPointX, targetPoint.y, targetPoint.x, targetPoint.y));\n }\n else {\n const controlPointY = (sourcePoint.y + targetPoint.y) / 2;\n path.appendSegment(Path.createSegment('C', sourcePoint.x, controlPointY, targetPoint.x, controlPointY, targetPoint.x, targetPoint.y));\n }\n }\n return options.raw ? path : path.serialize();\n};\n//# sourceMappingURL=smooth.js.map","/* eslint-disable no-underscore-dangle */\nimport { Point, Line, Path } from '../../geometry';\n// takes care of math. error for case when jump is too close to end of line\nconst CLOSE_PROXIMITY_PADDING = 1;\nconst F13 = 1 / 3;\nconst F23 = 2 / 3;\nfunction setupUpdating(view) {\n let updateList = view.graph._jumpOverUpdateList;\n // first time setup for this paper\n if (updateList == null) {\n updateList = view.graph._jumpOverUpdateList = [];\n /**\n * Handler for a batch:stop event to force\n * update of all registered links with jump over connector\n */\n view.graph.on('cell:mouseup', () => {\n const list = view.graph._jumpOverUpdateList;\n for (let i = 0; i < list.length; i += 1) {\n list[i].update();\n }\n });\n view.graph.on('model:reseted', () => {\n updateList = view.graph._jumpOverUpdateList = [];\n });\n }\n // add this link to a list so it can be updated when some other link is updated\n if (updateList.indexOf(view) < 0) {\n updateList.push(view);\n // watch for change of connector type or removal of link itself\n // to remove the link from a list of jump over connectors\n const clean = () => updateList.splice(updateList.indexOf(view), 1);\n view.cell.once('change:connector', clean);\n view.cell.once('removed', clean);\n }\n}\nfunction createLines(sourcePoint, targetPoint, route = []) {\n const points = [sourcePoint, ...route, targetPoint];\n const lines = [];\n points.forEach((point, idx) => {\n const next = points[idx + 1];\n if (next != null) {\n lines.push(new Line(point, next));\n }\n });\n return lines;\n}\nfunction findLineIntersections(line, crossCheckLines) {\n const intersections = [];\n crossCheckLines.forEach((crossCheckLine) => {\n const intersection = line.intersectsWithLine(crossCheckLine);\n if (intersection) {\n intersections.push(intersection);\n }\n });\n return intersections;\n}\nfunction getDistence(p1, p2) {\n return new Line(p1, p2).squaredLength();\n}\n/**\n * Split input line into multiple based on intersection points.\n */\nfunction createJumps(line, intersections, jumpSize) {\n return intersections.reduce((memo, point, idx) => {\n // skipping points that were merged with the previous line\n // to make bigger arc over multiple lines that are close to each other\n if (skippedPoints.includes(point)) {\n return memo;\n }\n // always grab the last line from buffer and modify it\n const lastLine = memo.pop() || line;\n // calculate start and end of jump by moving by a given size of jump\n const jumpStart = Point.create(point).move(lastLine.start, -jumpSize);\n let jumpEnd = Point.create(point).move(lastLine.start, +jumpSize);\n // now try to look at the next intersection point\n const nextPoint = intersections[idx + 1];\n if (nextPoint != null) {\n const distance = jumpEnd.distance(nextPoint);\n if (distance <= jumpSize) {\n // next point is close enough, move the jump end by this\n // difference and mark the next point to be skipped\n jumpEnd = nextPoint.move(lastLine.start, distance);\n skippedPoints.push(nextPoint);\n }\n }\n else {\n // this block is inside of `else` as an optimization so the distance is\n // not calculated when we know there are no other intersection points\n const endDistance = jumpStart.distance(lastLine.end);\n // if the end is too close to possible jump, draw remaining line instead of a jump\n if (endDistance < jumpSize * 2 + CLOSE_PROXIMITY_PADDING) {\n memo.push(lastLine);\n return memo;\n }\n }\n const startDistance = jumpEnd.distance(lastLine.start);\n if (startDistance < jumpSize * 2 + CLOSE_PROXIMITY_PADDING) {\n // if the start of line is too close to jump, draw that line instead of a jump\n memo.push(lastLine);\n return memo;\n }\n // finally create a jump line\n const jumpLine = new Line(jumpStart, jumpEnd);\n // it's just simple line but with a `isJump` property\n jumppedLines.push(jumpLine);\n memo.push(new Line(lastLine.start, jumpStart), jumpLine, new Line(jumpEnd, lastLine.end));\n return memo;\n }, []);\n}\nfunction buildPath(lines, jumpSize, jumpType, radius) {\n const path = new Path();\n let segment;\n // first move to the start of a first line\n segment = Path.createSegment('M', lines[0].start);\n path.appendSegment(segment);\n lines.forEach((line, index) => {\n if (jumppedLines.includes(line)) {\n let angle;\n let diff;\n let control1;\n let control2;\n if (jumpType === 'arc') {\n // approximates semicircle with 2 curves\n angle = -90;\n // determine rotation of arc based on difference between points\n diff = line.start.diff(line.end);\n // make sure the arc always points up (or right)\n const xAxisRotate = diff.x < 0 || (diff.x === 0 && diff.y < 0);\n if (xAxisRotate) {\n angle += 180;\n }\n const center = line.getCenter();\n const centerLine = new Line(center, line.end).rotate(angle, center);\n let halfLine;\n // first half\n halfLine = new Line(line.start, center);\n control1 = halfLine.pointAt(2 / 3).rotate(angle, line.start);\n control2 = centerLine.pointAt(1 / 3).rotate(-angle, centerLine.end);\n segment = Path.createSegment('C', control1, control2, centerLine.end);\n path.appendSegment(segment);\n // second half\n halfLine = new Line(center, line.end);\n control1 = centerLine.pointAt(1 / 3).rotate(angle, centerLine.end);\n control2 = halfLine.pointAt(1 / 3).rotate(-angle, line.end);\n segment = Path.createSegment('C', control1, control2, line.end);\n path.appendSegment(segment);\n }\n else if (jumpType === 'gap') {\n segment = Path.createSegment('M', line.end);\n path.appendSegment(segment);\n }\n else if (jumpType === 'cubic') {\n // approximates semicircle with 1 curve\n angle = line.start.theta(line.end);\n const xOffset = jumpSize * 0.6;\n let yOffset = jumpSize * 1.35;\n // determine rotation of arc based on difference between points\n diff = line.start.diff(line.end);\n // make sure the arc always points up (or right)\n const xAxisRotate = diff.x < 0 || (diff.x === 0 && diff.y < 0);\n if (xAxisRotate) {\n yOffset *= -1;\n }\n control1 = new Point(line.start.x + xOffset, line.start.y + yOffset).rotate(angle, line.start);\n control2 = new Point(line.end.x - xOffset, line.end.y + yOffset).rotate(angle, line.end);\n segment = Path.createSegment('C', control1, control2, line.end);\n path.appendSegment(segment);\n }\n }\n else {\n const nextLine = lines[index + 1];\n if (radius === 0 || !nextLine || jumppedLines.includes(nextLine)) {\n segment = Path.createSegment('L', line.end);\n path.appendSegment(segment);\n }\n else {\n buildRoundedSegment(radius, path, line.end, line.start, nextLine.end);\n }\n }\n });\n return path;\n}\nfunction buildRoundedSegment(offset, path, curr, prev, next) {\n const prevDistance = curr.distance(prev) / 2;\n const nextDistance = curr.distance(next) / 2;\n const startMove = -Math.min(offset, prevDistance);\n const endMove = -Math.min(offset, nextDistance);\n const roundedStart = curr.clone().move(prev, startMove).round();\n const roundedEnd = curr.clone().move(next, endMove).round();\n const control1 = new Point(F13 * roundedStart.x + F23 * curr.x, F23 * curr.y + F13 * roundedStart.y);\n const control2 = new Point(F13 * roundedEnd.x + F23 * curr.x, F23 * curr.y + F13 * roundedEnd.y);\n let segment;\n segment = Path.createSegment('L', roundedStart);\n path.appendSegment(segment);\n segment = Path.createSegment('C', control1, control2, roundedEnd);\n path.appendSegment(segment);\n}\nlet jumppedLines;\nlet skippedPoints;\nexport const jumpover = function (sourcePoint, targetPoint, routePoints, options = {}) {\n jumppedLines = [];\n skippedPoints = [];\n setupUpdating(this);\n const jumpSize = options.size || 5;\n const jumpType = options.type || 'arc';\n const radius = options.radius || 0;\n // list of connector types not to jump over.\n const ignoreConnectors = options.ignoreConnectors || ['smooth'];\n const graph = this.graph;\n const model = graph.model;\n const allLinks = model.getEdges();\n // there is just one link, draw it directly\n if (allLinks.length === 1) {\n return buildPath(createLines(sourcePoint, targetPoint, routePoints), jumpSize, jumpType, radius);\n }\n const edge = this.cell;\n const thisIndex = allLinks.indexOf(edge);\n const defaultConnector = graph.options.connecting.connector || {};\n // not all links are meant to be jumped over.\n const edges = allLinks.filter((link, idx) => {\n const connector = link.getConnector() || defaultConnector;\n // avoid jumping over links with connector type listed in `ignored connectors`.\n if (ignoreConnectors.includes(connector.name)) {\n return false;\n }\n // filter out links that are above this one and have the same connector type\n // otherwise there would double hoops for each intersection\n if (idx > thisIndex) {\n return connector.name !== 'jumpover';\n }\n return true;\n });\n // find views for all links\n const linkViews = edges.map((edge) => {\n return graph.renderer.findViewByCell(edge);\n });\n // create lines for this link\n const thisLines = createLines(sourcePoint, targetPoint, routePoints);\n // create lines for all other links\n const linkLines = linkViews.map((linkView) => {\n if (linkView == null) {\n return [];\n }\n if (linkView === this) {\n return thisLines;\n }\n return createLines(linkView.sourcePoint, linkView.targetPoint, linkView.routePoints);\n });\n // transform lines for this link by splitting with jump lines at\n // points of intersection with other links\n const jumpingLines = [];\n thisLines.forEach((line) => {\n // iterate all links and grab the intersections with this line\n // these are then sorted by distance so the line can be split more easily\n const intersections = edges\n .reduce((memo, link, i) => {\n // don't intersection with itself\n if (link !== edge) {\n const lineIntersections = findLineIntersections(line, linkLines[i]);\n memo.push(...lineIntersections);\n }\n return memo;\n }, [])\n .sort((a, b) => getDistence(line.start, a) - getDistence(line.start, b));\n if (intersections.length > 0) {\n // split the line based on found intersection points\n jumpingLines.push(...createJumps(line, intersections, jumpSize));\n }\n else {\n // without any intersection the line goes uninterrupted\n jumpingLines.push(line);\n }\n });\n const path = buildPath(jumpingLines, jumpSize, jumpType, radius);\n jumppedLines = [];\n skippedPoints = [];\n return options.raw ? path : path.serialize();\n};\n//# sourceMappingURL=jumpover.js.map","import { Registry } from '../registry';\nimport * as connectors from './main';\nexport var Connector;\n(function (Connector) {\n Connector.presets = connectors;\n Connector.registry = Registry.create({\n type: 'connector',\n });\n Connector.registry.register(Connector.presets, true);\n})(Connector || (Connector = {}));\n//# sourceMappingURL=index.js.map","import { Registry } from './registry';\nexport * from './attr';\nexport * from './grid';\nexport * from './filter';\nexport * from './background';\nexport * from './highlighter';\nexport * from './port-layout';\nexport * from './port-label-layout';\nexport * from './tool';\n// connection\nexport * from './marker';\nexport * from './node-anchor';\nexport * from './edge-anchor';\nexport * from './connection-point';\nexport * from './router';\nexport * from './connector';\nexport * from './connection-strategy';\n//\nexport * from './registry';\nexport const create = Registry.create;\n//# sourceMappingURL=index.js.map","import { ObjectExt, Dom } from '../util';\nimport { Timing, Interp } from '../common';\nexport class Animation {\n constructor(cell) {\n this.cell = cell;\n this.ids = {};\n this.cache = {};\n }\n get() {\n return Object.keys(this.ids);\n }\n start(path, targetValue, options = {}, delim = '/') {\n const startValue = this.cell.getPropByPath(path);\n const localOptions = ObjectExt.defaults(options, Animation.defaultOptions);\n const timing = this.getTiming(localOptions.timing);\n const interpolate = this.getInterp(localOptions.interp, startValue, targetValue);\n let startTime = 0;\n const key = Array.isArray(path) ? path.join(delim) : path;\n const paths = Array.isArray(path) ? path : path.split(delim);\n const iterate = () => {\n const now = new Date().getTime();\n if (startTime === 0) {\n startTime = now;\n }\n const elaspe = now - startTime;\n let progress = elaspe / localOptions.duration;\n if (progress < 1) {\n this.ids[key] = Dom.requestAnimationFrame(iterate);\n }\n else {\n progress = 1;\n }\n const currentValue = interpolate(timing(progress));\n this.cell.setPropByPath(paths, currentValue);\n if (options.progress) {\n options.progress(Object.assign({ progress, currentValue }, this.getArgs(key)));\n }\n if (progress === 1) {\n // TODO: remove in the next major version\n this.cell.notify('transition:end', this.getArgs(key));\n this.cell.notify('transition:complete', this.getArgs(key));\n options.complete && options.complete(this.getArgs(key));\n this.cell.notify('transition:finish', this.getArgs(key));\n options.finish && options.finish(this.getArgs(key));\n this.clean(key);\n }\n };\n setTimeout(() => {\n this.stop(path, undefined, delim);\n this.cache[key] = { startValue, targetValue, options: localOptions };\n this.ids[key] = Dom.requestAnimationFrame(iterate);\n // TODO: remove in the next major version\n this.cell.notify('transition:begin', this.getArgs(key));\n this.cell.notify('transition:start', this.getArgs(key));\n options.start && options.start(this.getArgs(key));\n }, options.delay);\n return this.stop.bind(this, path, delim, options);\n }\n stop(path, options = {}, delim = '/') {\n const paths = Array.isArray(path) ? path : path.split(delim);\n Object.keys(this.ids)\n .filter((key) => ObjectExt.isEqual(paths, key.split(delim).slice(0, paths.length)))\n .forEach((key) => {\n Dom.cancelAnimationFrame(this.ids[key]);\n const data = this.cache[key];\n const commonArgs = this.getArgs(key);\n const localOptions = Object.assign(Object.assign({}, data.options), options);\n const jumpedToEnd = localOptions.jumpedToEnd;\n if (jumpedToEnd && data.targetValue != null) {\n this.cell.setPropByPath(key, data.targetValue);\n this.cell.notify('transition:end', Object.assign({}, commonArgs));\n this.cell.notify('transition:complete', Object.assign({}, commonArgs));\n localOptions.complete && localOptions.complete(Object.assign({}, commonArgs));\n }\n const stopArgs = Object.assign({ jumpedToEnd }, commonArgs);\n this.cell.notify('transition:stop', Object.assign({}, stopArgs));\n localOptions.stop && localOptions.stop(Object.assign({}, stopArgs));\n this.cell.notify('transition:finish', Object.assign({}, commonArgs));\n localOptions.finish && localOptions.finish(Object.assign({}, commonArgs));\n this.clean(key);\n });\n return this;\n }\n clean(key) {\n delete this.ids[key];\n delete this.cache[key];\n }\n getTiming(timing) {\n return typeof timing === 'string' ? Timing[timing] : timing;\n }\n getInterp(interp, startValue, targetValue) {\n if (interp) {\n return interp(startValue, targetValue);\n }\n if (typeof targetValue === 'number') {\n return Interp.number(startValue, targetValue);\n }\n if (typeof targetValue === 'string') {\n if (targetValue[0] === '#') {\n return Interp.color(startValue, targetValue);\n }\n return Interp.unit(startValue, targetValue);\n }\n return Interp.object(startValue, targetValue);\n }\n getArgs(key) {\n const data = this.cache[key];\n return {\n path: key,\n startValue: data.startValue,\n targetValue: data.targetValue,\n cell: this.cell,\n };\n }\n}\n(function (Animation) {\n Animation.defaultOptions = {\n delay: 10,\n duration: 100,\n timing: 'linear',\n };\n})(Animation || (Animation = {}));\n//# sourceMappingURL=animation.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Basecoat } from '../common';\nimport { ObjectExt } from '../util';\nexport class Store extends Basecoat {\n constructor(data = {}) {\n super();\n this.pending = false;\n this.changing = false;\n this.data = {};\n this.mutate(ObjectExt.cloneDeep(data));\n this.changed = {};\n }\n mutate(data, options = {}) {\n const unset = options.unset === true;\n const silent = options.silent === true;\n const changes = [];\n const changing = this.changing;\n this.changing = true;\n if (!changing) {\n this.previous = ObjectExt.cloneDeep(this.data);\n this.changed = {};\n }\n const current = this.data;\n const previous = this.previous;\n const changed = this.changed;\n Object.keys(data).forEach((k) => {\n const key = k;\n const newValue = data[key];\n if (!ObjectExt.isEqual(current[key], newValue)) {\n changes.push(key);\n }\n if (!ObjectExt.isEqual(previous[key], newValue)) {\n changed[key] = newValue;\n }\n else {\n delete changed[key];\n }\n if (unset) {\n delete current[key];\n }\n else {\n current[key] = newValue;\n }\n });\n if (!silent && changes.length > 0) {\n this.pending = true;\n this.pendingOptions = options;\n changes.forEach((key) => {\n this.emit('change:*', {\n key,\n options,\n store: this,\n current: current[key],\n previous: previous[key],\n });\n });\n }\n if (changing) {\n return this;\n }\n if (!silent) {\n // Changes can be recursively nested within `\"change\"` events.\n while (this.pending) {\n this.pending = false;\n this.emit('changed', {\n current,\n previous,\n store: this,\n options: this.pendingOptions,\n });\n }\n }\n this.pending = false;\n this.changing = false;\n this.pendingOptions = null;\n return this;\n }\n get(key, defaultValue) {\n if (key == null) {\n return this.data;\n }\n const ret = this.data[key];\n return ret == null ? defaultValue : ret;\n }\n getPrevious(key) {\n if (this.previous) {\n const ret = this.previous[key];\n return ret == null ? undefined : ret;\n }\n return undefined;\n }\n set(key, value, options) {\n if (key != null) {\n if (typeof key === 'object') {\n this.mutate(key, value);\n }\n else {\n this.mutate({ [key]: value }, options);\n }\n }\n return this;\n }\n remove(key, options) {\n const empty = undefined;\n const subset = {};\n let opts;\n if (typeof key === 'string') {\n subset[key] = empty;\n opts = options;\n }\n else if (Array.isArray(key)) {\n key.forEach((k) => (subset[k] = empty));\n opts = options;\n }\n else {\n // eslint-disable-next-line\n for (const key in this.data) {\n subset[key] = empty;\n }\n opts = key;\n }\n this.mutate(subset, Object.assign(Object.assign({}, opts), { unset: true }));\n return this;\n }\n getByPath(path) {\n return ObjectExt.getByPath(this.data, path, '/');\n }\n setByPath(path, value, options = {}) {\n const delim = '/';\n const pathArray = Array.isArray(path) ? [...path] : path.split(delim);\n const pathString = Array.isArray(path) ? path.join(delim) : path;\n const property = pathArray[0];\n const pathArrayLength = pathArray.length;\n options.propertyPath = pathString;\n options.propertyValue = value;\n options.propertyPathArray = pathArray;\n if (pathArrayLength === 1) {\n this.set(property, value, options);\n }\n else {\n const update = {};\n let diver = update;\n let nextKey = property;\n // Initialize the nested object. Subobjects are either arrays or objects.\n // An empty array is created if the sub-key is an integer. Otherwise, an\n // empty object is created.\n for (let i = 1; i < pathArrayLength; i += 1) {\n const key = pathArray[i];\n const isArrayIndex = Number.isFinite(Number(key));\n diver = diver[nextKey] = isArrayIndex ? [] : {};\n nextKey = key;\n }\n // Fills update with the `value` on `path`.\n ObjectExt.setByPath(update, pathArray, value, delim);\n const data = ObjectExt.cloneDeep(this.data);\n // If rewrite mode enabled, we replace value referenced by path with the\n // new one (we don't merge).\n if (options.rewrite) {\n ObjectExt.unsetByPath(data, path, delim);\n }\n const merged = ObjectExt.merge(data, update);\n this.set(property, merged[property], options);\n }\n return this;\n }\n removeByPath(path, options) {\n const keys = Array.isArray(path) ? path : path.split('/');\n const key = keys[0];\n if (keys.length === 1) {\n this.remove(key, options);\n }\n else {\n const paths = keys.slice(1);\n const prop = ObjectExt.cloneDeep(this.get(key));\n if (prop) {\n ObjectExt.unsetByPath(prop, paths);\n }\n this.set(key, prop, options);\n }\n return this;\n }\n hasChanged(key) {\n if (key == null) {\n return Object.keys(this.changed).length > 0;\n }\n return key in this.changed;\n }\n /**\n * Returns an object containing all the data that have changed,\n * or `null` if there are no changes. Useful for determining what\n * parts of a view need to be updated.\n */\n getChanges(diff) {\n if (diff == null) {\n return this.hasChanged() ? ObjectExt.cloneDeep(this.changed) : null;\n }\n const old = this.changing ? this.previous : this.data;\n const changed = {};\n let hasChanged;\n // eslint-disable-next-line\n for (const key in diff) {\n const val = diff[key];\n if (!ObjectExt.isEqual(old[key], val)) {\n changed[key] = val;\n hasChanged = true;\n }\n }\n return hasChanged ? ObjectExt.cloneDeep(changed) : null;\n }\n /**\n * Returns a copy of the store's `data` object.\n */\n toJSON() {\n return ObjectExt.cloneDeep(this.data);\n }\n clone() {\n const constructor = this.constructor;\n return new constructor(this.data);\n }\n dispose() {\n this.off();\n this.data = {};\n this.previous = {};\n this.changed = {};\n this.pending = false;\n this.changing = false;\n this.pendingOptions = null;\n this.trigger('disposed', { store: this });\n }\n}\n__decorate([\n Basecoat.dispose()\n], Store.prototype, \"dispose\", null);\n//# sourceMappingURL=store.js.map","/* eslint-disable no-underscore-dangle */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ArrayExt, StringExt, ObjectExt, FunctionExt } from '../util';\nimport { Rectangle, Point } from '../geometry';\nimport { Basecoat } from '../common';\nimport { Attr } from '../registry';\nimport { Animation } from './animation';\nimport { Store } from './store';\nexport class Cell extends Basecoat {\n constructor(metadata = {}) {\n super();\n const ctor = this.constructor;\n const defaults = ctor.getDefaults(true);\n const props = ObjectExt.merge({}, this.preprocess(defaults), this.preprocess(metadata));\n this.id = props.id || StringExt.uuid();\n this.store = new Store(props);\n this.animation = new Animation(this);\n this.setup();\n this.init();\n this.postprocess(metadata);\n }\n static config(presets) {\n const { markup, propHooks, attrHooks } = presets, others = __rest(presets, [\"markup\", \"propHooks\", \"attrHooks\"]);\n if (markup != null) {\n this.markup = markup;\n }\n if (propHooks) {\n this.propHooks = this.propHooks.slice();\n if (Array.isArray(propHooks)) {\n this.propHooks.push(...propHooks);\n }\n else if (typeof propHooks === 'function') {\n this.propHooks.push(propHooks);\n }\n else {\n Object.keys(propHooks).forEach((name) => {\n const hook = propHooks[name];\n if (typeof hook === 'function') {\n this.propHooks.push(hook);\n }\n });\n }\n }\n if (attrHooks) {\n this.attrHooks = Object.assign(Object.assign({}, this.attrHooks), attrHooks);\n }\n this.defaults = ObjectExt.merge({}, this.defaults, others);\n }\n static getMarkup() {\n return this.markup;\n }\n static getDefaults(raw) {\n return (raw ? this.defaults : ObjectExt.cloneDeep(this.defaults));\n }\n static getAttrHooks() {\n return this.attrHooks;\n }\n static applyPropHooks(cell, metadata) {\n return this.propHooks.reduce((memo, hook) => {\n return hook ? FunctionExt.call(hook, cell, memo) : memo;\n }, metadata);\n }\n // #endregion\n get [Symbol.toStringTag]() {\n return Cell.toStringTag;\n }\n init() { }\n // #region model\n get model() {\n return this._model;\n }\n set model(model) {\n if (this._model !== model) {\n this._model = model;\n }\n }\n // #endregion\n preprocess(metadata, ignoreIdCheck) {\n const id = metadata.id;\n const ctor = this.constructor;\n const props = ctor.applyPropHooks(this, metadata);\n if (id == null && ignoreIdCheck !== true) {\n props.id = StringExt.uuid();\n }\n return props;\n }\n postprocess(metadata) { } // eslint-disable-line\n setup() {\n this.store.on('change:*', (metadata) => {\n const { key, current, previous, options } = metadata;\n this.notify('change:*', {\n key,\n options,\n current,\n previous,\n cell: this,\n });\n this.notify(`change:${key}`, {\n options,\n current,\n previous,\n cell: this,\n });\n const type = key;\n if (type === 'source' || type === 'target') {\n this.notify(`change:terminal`, {\n type,\n current,\n previous,\n options,\n cell: this,\n });\n }\n });\n this.store.on('changed', ({ options }) => this.notify('changed', { options, cell: this }));\n }\n notify(name, args) {\n this.trigger(name, args);\n const model = this.model;\n if (model) {\n model.notify(`cell:${name}`, args);\n if (this.isNode()) {\n model.notify(`node:${name}`, Object.assign(Object.assign({}, args), { node: this }));\n }\n else if (this.isEdge()) {\n model.notify(`edge:${name}`, Object.assign(Object.assign({}, args), { edge: this }));\n }\n }\n return this;\n }\n isNode() {\n return false;\n }\n isEdge() {\n return false;\n }\n isSameStore(cell) {\n return this.store === cell.store;\n }\n get view() {\n return this.store.get('view');\n }\n get shape() {\n return this.store.get('shape', '');\n }\n getProp(key, defaultValue) {\n if (key == null) {\n return this.store.get();\n }\n return this.store.get(key, defaultValue);\n }\n setProp(key, value, options) {\n if (typeof key === 'string') {\n this.store.set(key, value, options);\n }\n else {\n const props = this.preprocess(key, true);\n this.store.set(ObjectExt.merge({}, this.getProp(), props), value);\n this.postprocess(key);\n }\n return this;\n }\n removeProp(key, options) {\n if (typeof key === 'string' || Array.isArray(key)) {\n this.store.removeByPath(key, options);\n }\n else {\n this.store.remove(options);\n }\n return this;\n }\n hasChanged(key) {\n return key == null ? this.store.hasChanged() : this.store.hasChanged(key);\n }\n getPropByPath(path) {\n return this.store.getByPath(path);\n }\n setPropByPath(path, value, options = {}) {\n if (this.model) {\n // update inner reference\n if (path === 'children') {\n this._children = value\n ? value\n .map((id) => this.model.getCell(id))\n .filter((child) => child != null)\n : null;\n }\n else if (path === 'parent') {\n this._parent = value ? this.model.getCell(value) : null;\n }\n }\n this.store.setByPath(path, value, options);\n return this;\n }\n removePropByPath(path, options = {}) {\n const paths = Array.isArray(path) ? path : path.split('/');\n // Once a property is removed from the `attrs` the CellView will\n // recognize a `dirty` flag and re-render itself in order to remove\n // the attribute from SVGElement.\n if (paths[0] === 'attrs') {\n options.dirty = true;\n }\n this.store.removeByPath(paths, options);\n return this;\n }\n prop(key, value, options) {\n if (key == null) {\n return this.getProp();\n }\n if (typeof key === 'string' || Array.isArray(key)) {\n if (arguments.length === 1) {\n return this.getPropByPath(key);\n }\n if (value == null) {\n return this.removePropByPath(key, options || {});\n }\n return this.setPropByPath(key, value, options || {});\n }\n return this.setProp(key, value || {});\n }\n previous(name) {\n return this.store.getPrevious(name);\n }\n // #endregion\n // #region zIndex\n get zIndex() {\n return this.getZIndex();\n }\n set zIndex(z) {\n if (z == null) {\n this.removeZIndex();\n }\n else {\n this.setZIndex(z);\n }\n }\n getZIndex() {\n return this.store.get('zIndex');\n }\n setZIndex(z, options = {}) {\n this.store.set('zIndex', z, options);\n return this;\n }\n removeZIndex(options = {}) {\n this.store.remove('zIndex', options);\n return this;\n }\n toFront(options = {}) {\n const model = this.model;\n if (model) {\n let z = model.getMaxZIndex();\n let cells;\n if (options.deep) {\n cells = this.getDescendants({ deep: true, breadthFirst: true });\n cells.unshift(this);\n }\n else {\n cells = [this];\n }\n z = z - cells.length + 1;\n const count = model.total();\n let changed = model.indexOf(this) !== count - cells.length;\n if (!changed) {\n changed = cells.some((cell, index) => cell.getZIndex() !== z + index);\n }\n if (changed) {\n this.batchUpdate('to-front', () => {\n z += cells.length;\n cells.forEach((cell, index) => {\n cell.setZIndex(z + index, options);\n });\n });\n }\n }\n return this;\n }\n toBack(options = {}) {\n const model = this.model;\n if (model) {\n let z = model.getMinZIndex();\n let cells;\n if (options.deep) {\n cells = this.getDescendants({ deep: true, breadthFirst: true });\n cells.unshift(this);\n }\n else {\n cells = [this];\n }\n let changed = model.indexOf(this) !== 0;\n if (!changed) {\n changed = cells.some((cell, index) => cell.getZIndex() !== z + index);\n }\n if (changed) {\n this.batchUpdate('to-back', () => {\n z -= cells.length;\n cells.forEach((cell, index) => {\n cell.setZIndex(z + index, options);\n });\n });\n }\n }\n return this;\n }\n // #endregion\n // #region markup\n get markup() {\n return this.getMarkup();\n }\n set markup(value) {\n if (value == null) {\n this.removeMarkup();\n }\n else {\n this.setMarkup(value);\n }\n }\n getMarkup() {\n let markup = this.store.get('markup');\n if (markup == null) {\n const ctor = this.constructor;\n markup = ctor.getMarkup();\n }\n return markup;\n }\n setMarkup(markup, options = {}) {\n this.store.set('markup', markup, options);\n return this;\n }\n removeMarkup(options = {}) {\n this.store.remove('markup', options);\n return this;\n }\n // #endregion\n // #region attrs\n get attrs() {\n return this.getAttrs();\n }\n set attrs(value) {\n if (value == null) {\n this.removeAttrs();\n }\n else {\n this.setAttrs(value);\n }\n }\n getAttrs() {\n const result = this.store.get('attrs');\n return result ? Object.assign({}, result) : {};\n }\n setAttrs(attrs, options = {}) {\n if (attrs == null) {\n this.removeAttrs(options);\n }\n else {\n const set = (attrs) => this.store.set('attrs', attrs, options);\n if (options.overwrite === true) {\n set(attrs);\n }\n else {\n const prev = this.getAttrs();\n if (options.deep === false) {\n set(Object.assign(Object.assign({}, prev), attrs));\n }\n else {\n set(ObjectExt.merge({}, prev, attrs));\n }\n }\n }\n return this;\n }\n replaceAttrs(attrs, options = {}) {\n return this.setAttrs(attrs, Object.assign(Object.assign({}, options), { overwrite: true }));\n }\n updateAttrs(attrs, options = {}) {\n return this.setAttrs(attrs, Object.assign(Object.assign({}, options), { deep: false }));\n }\n removeAttrs(options = {}) {\n this.store.remove('attrs', options);\n return this;\n }\n getAttrDefinition(attrName) {\n if (!attrName) {\n return null;\n }\n const ctor = this.constructor;\n const hooks = ctor.getAttrHooks() || {};\n let definition = hooks[attrName] || Attr.registry.get(attrName);\n if (!definition) {\n const name = StringExt.camelCase(attrName);\n definition = hooks[name] || Attr.registry.get(name);\n }\n return definition || null;\n }\n getAttrByPath(path) {\n if (path == null || path === '') {\n return this.getAttrs();\n }\n return this.getPropByPath(this.prefixAttrPath(path));\n }\n setAttrByPath(path, value, options = {}) {\n this.setPropByPath(this.prefixAttrPath(path), value, options);\n return this;\n }\n removeAttrByPath(path, options = {}) {\n this.removePropByPath(this.prefixAttrPath(path), options);\n return this;\n }\n prefixAttrPath(path) {\n return Array.isArray(path) ? ['attrs'].concat(path) : `attrs/${path}`;\n }\n attr(path, value, options) {\n if (path == null) {\n return this.getAttrByPath();\n }\n if (typeof path === 'string' || Array.isArray(path)) {\n if (arguments.length === 1) {\n return this.getAttrByPath(path);\n }\n if (value == null) {\n return this.removeAttrByPath(path, options || {});\n }\n return this.setAttrByPath(path, value, options || {});\n }\n return this.setAttrs(path, (value || {}));\n }\n // #endregion\n // #region visible\n get visible() {\n return this.isVisible();\n }\n set visible(value) {\n this.setVisible(value);\n }\n setVisible(visible, options = {}) {\n this.store.set('visible', visible, options);\n return this;\n }\n isVisible() {\n return this.store.get('visible') !== false;\n }\n show(options = {}) {\n if (!this.isVisible()) {\n this.setVisible(true, options);\n }\n return this;\n }\n hide(options = {}) {\n if (this.isVisible()) {\n this.setVisible(false, options);\n }\n return this;\n }\n toggleVisible(isVisible, options = {}) {\n const visible = typeof isVisible === 'boolean' ? isVisible : !this.isVisible();\n const localOptions = typeof isVisible === 'boolean' ? options : isVisible;\n if (visible) {\n this.show(localOptions);\n }\n else {\n this.hide(localOptions);\n }\n return this;\n }\n // #endregion\n // #region data\n get data() {\n return this.getData();\n }\n set data(val) {\n this.setData(val);\n }\n getData() {\n return this.store.get('data');\n }\n setData(data, options = {}) {\n if (data == null) {\n this.removeData(options);\n }\n else {\n const set = (data) => this.store.set('data', data, options);\n if (options.overwrite === true) {\n set(data);\n }\n else {\n const prev = this.getData();\n if (options.deep === false) {\n set(typeof data === 'object' ? Object.assign(Object.assign({}, prev), data) : data);\n }\n else {\n set(ObjectExt.merge({}, prev, data));\n }\n }\n }\n return this;\n }\n replaceData(data, options = {}) {\n return this.setData(data, Object.assign(Object.assign({}, options), { overwrite: true }));\n }\n updateData(data, options = {}) {\n return this.setData(data, Object.assign(Object.assign({}, options), { deep: false }));\n }\n removeData(options = {}) {\n this.store.remove('data', options);\n return this;\n }\n // #endregion\n // #region parent children\n get parent() {\n return this.getParent();\n }\n get children() {\n return this.getChildren();\n }\n getParentId() {\n return this.store.get('parent');\n }\n getParent() {\n const parentId = this.getParentId();\n if (parentId && this.model) {\n const parent = this.model.getCell(parentId);\n this._parent = parent;\n return parent;\n }\n return null;\n }\n getChildren() {\n const childrenIds = this.store.get('children');\n if (childrenIds && childrenIds.length && this.model) {\n const children = childrenIds\n .map((id) => { var _a; return (_a = this.model) === null || _a === void 0 ? void 0 : _a.getCell(id); })\n .filter((cell) => cell != null);\n this._children = children;\n return [...children];\n }\n return null;\n }\n hasParent() {\n return this.parent != null;\n }\n isParentOf(child) {\n return child != null && child.getParent() === this;\n }\n isChildOf(parent) {\n return parent != null && this.getParent() === parent;\n }\n eachChild(iterator, context) {\n if (this.children) {\n this.children.forEach(iterator, context);\n }\n return this;\n }\n filterChild(filter, context) {\n return this.children ? this.children.filter(filter, context) : [];\n }\n getChildCount() {\n return this.children == null ? 0 : this.children.length;\n }\n getChildIndex(child) {\n return this.children == null ? -1 : this.children.indexOf(child);\n }\n getChildAt(index) {\n return this.children != null && index >= 0 ? this.children[index] : null;\n }\n getAncestors(options = {}) {\n const ancestors = [];\n let parent = this.getParent();\n while (parent) {\n ancestors.push(parent);\n parent = options.deep !== false ? parent.getParent() : null;\n }\n return ancestors;\n }\n getDescendants(options = {}) {\n if (options.deep !== false) {\n // breadth first\n if (options.breadthFirst) {\n const cells = [];\n const queue = this.getChildren() || [];\n while (queue.length > 0) {\n const parent = queue.shift();\n const children = parent.getChildren();\n cells.push(parent);\n if (children) {\n queue.push(...children);\n }\n }\n return cells;\n }\n // depth first\n {\n const cells = this.getChildren() || [];\n cells.forEach((cell) => {\n cells.push(...cell.getDescendants(options));\n });\n return cells;\n }\n }\n return this.getChildren() || [];\n }\n isDescendantOf(ancestor, options = {}) {\n if (ancestor == null) {\n return false;\n }\n if (options.deep !== false) {\n let current = this.getParent();\n while (current) {\n if (current === ancestor) {\n return true;\n }\n current = current.getParent();\n }\n return false;\n }\n return this.isChildOf(ancestor);\n }\n isAncestorOf(descendant, options = {}) {\n if (descendant == null) {\n return false;\n }\n return descendant.isDescendantOf(this, options);\n }\n contains(cell) {\n return this.isAncestorOf(cell);\n }\n getCommonAncestor(...cells) {\n return Cell.getCommonAncestor(this, ...cells);\n }\n setParent(parent, options = {}) {\n this._parent = parent;\n if (parent) {\n this.store.set('parent', parent.id, options);\n }\n else {\n this.store.remove('parent', options);\n }\n return this;\n }\n setChildren(children, options = {}) {\n this._children = children;\n if (children != null) {\n this.store.set('children', children.map((child) => child.id), options);\n }\n else {\n this.store.remove('children', options);\n }\n return this;\n }\n unembed(child, options = {}) {\n const children = this.children;\n if (children != null && child != null) {\n const index = this.getChildIndex(child);\n if (index !== -1) {\n children.splice(index, 1);\n child.setParent(null, options);\n this.setChildren(children, options);\n }\n }\n return this;\n }\n embed(child, options = {}) {\n child.addTo(this, options);\n return this;\n }\n addTo(target, options = {}) {\n if (Cell.isCell(target)) {\n target.addChild(this, options);\n }\n else {\n target.addCell(this, options);\n }\n return this;\n }\n insertTo(parent, index, options = {}) {\n parent.insertChild(this, index, options);\n return this;\n }\n addChild(child, options = {}) {\n return this.insertChild(child, undefined, options);\n }\n insertChild(child, index, options = {}) {\n if (child != null && child !== this) {\n const oldParent = child.getParent();\n const changed = this !== oldParent;\n let pos = index;\n if (pos == null) {\n pos = this.getChildCount();\n if (!changed) {\n pos -= 1;\n }\n }\n // remove from old parent\n if (oldParent) {\n const children = oldParent.getChildren();\n if (children) {\n const index = children.indexOf(child);\n if (index >= 0) {\n child.setParent(null, options);\n children.splice(index, 1);\n oldParent.setChildren(children, options);\n }\n }\n }\n let children = this.children;\n if (children == null) {\n children = [];\n children.push(child);\n }\n else {\n children.splice(pos, 0, child);\n }\n child.setParent(this, options);\n this.setChildren(children, options);\n if (changed && this.model) {\n const incomings = this.model.getIncomingEdges(this);\n const outgoings = this.model.getOutgoingEdges(this);\n if (incomings) {\n incomings.forEach((edge) => edge.updateParent(options));\n }\n if (outgoings) {\n outgoings.forEach((edge) => edge.updateParent(options));\n }\n }\n if (this.model) {\n this.model.addCell(child, options);\n }\n }\n return this;\n }\n removeFromParent(options = {}) {\n const parent = this.getParent();\n if (parent != null) {\n const index = parent.getChildIndex(this);\n parent.removeChildAt(index, options);\n }\n return this;\n }\n removeChild(child, options = {}) {\n const index = this.getChildIndex(child);\n return this.removeChildAt(index, options);\n }\n removeChildAt(index, options = {}) {\n const child = this.getChildAt(index);\n const children = this.children;\n if (children != null && child != null) {\n this.unembed(child, options);\n child.remove(options);\n }\n return child;\n }\n remove(options = {}) {\n this.batchUpdate('remove', () => {\n const parent = this.getParent();\n if (parent) {\n parent.removeChild(this, options);\n }\n if (options.deep !== false) {\n this.eachChild((child) => child.remove(options));\n }\n if (this.model) {\n this.model.removeCell(this, options);\n }\n });\n return this;\n }\n transition(path, target, options = {}, delim = '/') {\n return this.animation.start(path, target, options, delim);\n }\n stopTransition(path, options, delim = '/') {\n this.animation.stop(path, options, delim);\n return this;\n }\n getTransitions() {\n return this.animation.get();\n }\n // #endregion\n // #region transform\n // eslint-disable-next-line\n translate(tx, ty, options) {\n return this;\n }\n scale(sx, // eslint-disable-line\n sy, // eslint-disable-line\n origin, // eslint-disable-line\n options) {\n return this;\n }\n addTools(items, obj, options) {\n const toolItems = Array.isArray(items) ? items : [items];\n const name = typeof obj === 'string' ? obj : null;\n const config = typeof obj === 'object' ? obj : typeof options === 'object' ? options : {};\n if (config.reset) {\n return this.setTools({ name, items: toolItems, local: config.local }, config);\n }\n let tools = ObjectExt.cloneDeep(this.getTools());\n if (tools == null || name == null || tools.name === name) {\n if (tools == null) {\n tools = {};\n }\n if (!tools.items) {\n tools.items = [];\n }\n tools.name = name;\n tools.items = [...tools.items, ...toolItems];\n return this.setTools(Object.assign({}, tools), config);\n }\n }\n setTools(tools, options = {}) {\n if (tools == null) {\n this.removeTools();\n }\n else {\n this.store.set('tools', Cell.normalizeTools(tools), options);\n }\n return this;\n }\n getTools() {\n return this.store.get('tools');\n }\n removeTools(options = {}) {\n this.store.remove('tools', options);\n return this;\n }\n hasTools(name) {\n const tools = this.getTools();\n if (tools == null) {\n return false;\n }\n if (name == null) {\n return true;\n }\n return tools.name === name;\n }\n hasTool(name) {\n const tools = this.getTools();\n if (tools == null) {\n return false;\n }\n return tools.items.some((item) => typeof item === 'string' ? item === name : item.name === name);\n }\n removeTool(nameOrIndex, options = {}) {\n const tools = ObjectExt.cloneDeep(this.getTools());\n if (tools) {\n let updated = false;\n const items = tools.items.slice();\n const remove = (index) => {\n items.splice(index, 1);\n updated = true;\n };\n if (typeof nameOrIndex === 'number') {\n remove(nameOrIndex);\n }\n else {\n for (let i = items.length - 1; i >= 0; i -= 1) {\n const item = items[i];\n const exist = typeof item === 'string'\n ? item === nameOrIndex\n : item.name === nameOrIndex;\n if (exist) {\n remove(i);\n }\n }\n }\n if (updated) {\n tools.items = items;\n this.setTools(tools, options);\n }\n }\n return this;\n }\n // #endregion\n // #region common\n // eslint-disable-next-line\n getBBox(options) {\n return new Rectangle();\n }\n // eslint-disable-next-line\n getConnectionPoint(edge, type) {\n return new Point();\n }\n toJSON(options = {}) {\n const props = Object.assign({}, this.store.get());\n const toString = Object.prototype.toString;\n const cellType = this.isNode() ? 'node' : this.isEdge() ? 'edge' : 'cell';\n if (!props.shape) {\n const ctor = this.constructor;\n throw new Error(`Unable to serialize ${cellType} missing \"shape\" prop, check the ${cellType} \"${ctor.name || toString.call(ctor)}\"`);\n }\n const ctor = this.constructor;\n const diff = options.diff === true;\n const attrs = props.attrs || {};\n const presets = ctor.getDefaults(true);\n // When `options.diff` is `true`, we should process the custom options,\n // such as `width`, `height` etc. to ensure the comparing work correctly.\n const defaults = diff ? this.preprocess(presets, true) : presets;\n const defaultAttrs = defaults.attrs || {};\n const finalAttrs = {};\n Object.keys(props).forEach((key) => {\n const val = props[key];\n if (val != null &&\n !Array.isArray(val) &&\n typeof val === 'object' &&\n !ObjectExt.isPlainObject(val)) {\n throw new Error(`Can only serialize ${cellType} with plain-object props, but got a \"${toString.call(val)}\" type of key \"${key}\" on ${cellType} \"${this.id}\"`);\n }\n if (key !== 'attrs' && key !== 'shape' && diff) {\n const preset = defaults[key];\n if (ObjectExt.isEqual(val, preset)) {\n delete props[key];\n }\n }\n });\n Object.keys(attrs).forEach((key) => {\n const attr = attrs[key];\n const defaultAttr = defaultAttrs[key];\n Object.keys(attr).forEach((name) => {\n const value = attr[name];\n const defaultValue = defaultAttr ? defaultAttr[name] : null;\n if (value != null &&\n typeof value === 'object' &&\n !Array.isArray(value)) {\n Object.keys(value).forEach((subName) => {\n const subValue = value[subName];\n if (defaultAttr == null ||\n defaultValue == null ||\n !ObjectExt.isObject(defaultValue) ||\n !ObjectExt.isEqual(defaultValue[subName], subValue)) {\n if (finalAttrs[key] == null) {\n finalAttrs[key] = {};\n }\n if (finalAttrs[key][name] == null) {\n finalAttrs[key][name] = {};\n }\n const tmp = finalAttrs[key][name];\n tmp[subName] = subValue;\n }\n });\n }\n else if (defaultAttr == null ||\n !ObjectExt.isEqual(defaultValue, value)) {\n // `value` is not an object, default attribute with `key` does not\n // exist or it is different than the attribute value set on the cell.\n if (finalAttrs[key] == null) {\n finalAttrs[key] = {};\n }\n finalAttrs[key][name] = value;\n }\n });\n });\n const finalProps = Object.assign(Object.assign({}, props), { attrs: ObjectExt.isEmpty(finalAttrs) ? undefined : finalAttrs });\n if (finalProps.attrs == null) {\n delete finalProps.attrs;\n }\n const ret = finalProps;\n if (ret.angle === 0) {\n delete ret.angle;\n }\n return ObjectExt.cloneDeep(ret);\n }\n clone(options = {}) {\n if (!options.deep) {\n const data = Object.assign({}, this.store.get());\n if (!options.keepId) {\n delete data.id;\n }\n delete data.parent;\n delete data.children;\n const ctor = this.constructor;\n return new ctor(data); // eslint-disable-line new-cap\n }\n // Deep cloning. Clone the cell itself and all its children.\n const map = Cell.deepClone(this);\n return map[this.id];\n }\n findView(graph) {\n return graph.renderer.findViewByCell(this);\n }\n // #endregion\n // #region batch\n startBatch(name, data = {}, model = this.model) {\n this.notify('batch:start', { name, data, cell: this });\n if (model) {\n model.startBatch(name, Object.assign(Object.assign({}, data), { cell: this }));\n }\n return this;\n }\n stopBatch(name, data = {}, model = this.model) {\n if (model) {\n model.stopBatch(name, Object.assign(Object.assign({}, data), { cell: this }));\n }\n this.notify('batch:stop', { name, data, cell: this });\n return this;\n }\n batchUpdate(name, execute, data) {\n // The model is null after cell was removed(remove batch).\n // So we should temp save model to trigger pairing batch event.\n const model = this.model;\n this.startBatch(name, data, model);\n const result = execute();\n this.stopBatch(name, data, model);\n return result;\n }\n // #endregion\n // #region IDisposable\n dispose() {\n this.removeFromParent();\n this.store.dispose();\n }\n}\nCell.defaults = {};\nCell.attrHooks = {};\nCell.propHooks = [];\n__decorate([\n Basecoat.dispose()\n], Cell.prototype, \"dispose\", null);\n(function (Cell) {\n function normalizeTools(raw) {\n if (typeof raw === 'string') {\n return { items: [raw] };\n }\n if (Array.isArray(raw)) {\n return { items: raw };\n }\n if (raw.items) {\n return raw;\n }\n return {\n items: [raw],\n };\n }\n Cell.normalizeTools = normalizeTools;\n})(Cell || (Cell = {}));\n(function (Cell) {\n Cell.toStringTag = `X6.${Cell.name}`;\n function isCell(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Cell) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const cell = instance;\n if ((tag == null || tag === Cell.toStringTag) &&\n typeof cell.isNode === 'function' &&\n typeof cell.isEdge === 'function' &&\n typeof cell.prop === 'function' &&\n typeof cell.attr === 'function') {\n return true;\n }\n return false;\n }\n Cell.isCell = isCell;\n})(Cell || (Cell = {}));\n(function (Cell) {\n function getCommonAncestor(...cells) {\n const ancestors = cells\n .filter((cell) => cell != null)\n .map((cell) => cell.getAncestors())\n .sort((a, b) => {\n return a.length - b.length;\n });\n const first = ancestors.shift();\n return (first.find((cell) => ancestors.every((item) => item.includes(cell))) ||\n null);\n }\n Cell.getCommonAncestor = getCommonAncestor;\n function getCellsBBox(cells, options = {}) {\n let bbox = null;\n for (let i = 0, ii = cells.length; i < ii; i += 1) {\n const cell = cells[i];\n let rect = cell.getBBox(options);\n if (rect) {\n if (cell.isNode()) {\n const angle = cell.getAngle();\n if (angle != null && angle !== 0) {\n rect = rect.bbox(angle);\n }\n }\n bbox = bbox == null ? rect : bbox.union(rect);\n }\n }\n return bbox;\n }\n Cell.getCellsBBox = getCellsBBox;\n function deepClone(cell) {\n const cells = [cell, ...cell.getDescendants({ deep: true })];\n return Cell.cloneCells(cells);\n }\n Cell.deepClone = deepClone;\n function cloneCells(cells) {\n const inputs = ArrayExt.uniq(cells);\n const cloneMap = inputs.reduce((map, cell) => {\n map[cell.id] = cell.clone();\n return map;\n }, {});\n inputs.forEach((cell) => {\n const clone = cloneMap[cell.id];\n if (clone.isEdge()) {\n const sourceId = clone.getSourceCellId();\n const targetId = clone.getTargetCellId();\n if (sourceId && cloneMap[sourceId]) {\n // Source is a node and the node is among the clones.\n // Then update the source of the cloned edge.\n clone.setSource(Object.assign(Object.assign({}, clone.getSource()), { cell: cloneMap[sourceId].id }));\n }\n if (targetId && cloneMap[targetId]) {\n // Target is a node and the node is among the clones.\n // Then update the target of the cloned edge.\n clone.setTarget(Object.assign(Object.assign({}, clone.getTarget()), { cell: cloneMap[targetId].id }));\n }\n }\n // Find the parent of the original cell\n const parent = cell.getParent();\n if (parent && cloneMap[parent.id]) {\n clone.setParent(cloneMap[parent.id]);\n }\n // Find the children of the original cell\n const children = cell.getChildren();\n if (children && children.length) {\n const embeds = children.reduce((memo, child) => {\n // Embedded cells that are not being cloned can not be carried\n // over with other embedded cells.\n if (cloneMap[child.id]) {\n memo.push(cloneMap[child.id]);\n }\n return memo;\n }, []);\n if (embeds.length > 0) {\n clone.setChildren(embeds);\n }\n }\n });\n return cloneMap;\n }\n Cell.cloneCells = cloneCells;\n})(Cell || (Cell = {}));\n(function (Cell) {\n Cell.config({\n propHooks(_a) {\n var { tools } = _a, metadata = __rest(_a, [\"tools\"]);\n if (tools) {\n metadata.tools = Cell.normalizeTools(tools);\n }\n return metadata;\n },\n });\n})(Cell || (Cell = {}));\n//# sourceMappingURL=cell.js.map","export var ShareRegistry;\n(function (ShareRegistry) {\n let edgeRegistry;\n let nodeRegistry;\n function exist(name, isNode) {\n return isNode\n ? edgeRegistry != null && edgeRegistry.exist(name)\n : nodeRegistry != null && nodeRegistry.exist(name);\n }\n ShareRegistry.exist = exist;\n function setEdgeRegistry(registry) {\n edgeRegistry = registry;\n }\n ShareRegistry.setEdgeRegistry = setEdgeRegistry;\n function setNodeRegistry(registry) {\n nodeRegistry = registry;\n }\n ShareRegistry.setNodeRegistry = setNodeRegistry;\n})(ShareRegistry || (ShareRegistry = {}));\n//# sourceMappingURL=registry.js.map","import { PortLayout, PortLabelLayout } from '../registry';\nimport { ObjectExt } from '../util';\nimport { Point } from '../geometry';\nexport class PortManager {\n constructor(data) {\n this.ports = [];\n this.groups = {};\n this.init(ObjectExt.cloneDeep(data));\n }\n getPorts() {\n return this.ports;\n }\n getGroup(groupName) {\n return groupName != null ? this.groups[groupName] : null;\n }\n getPortsByGroup(groupName) {\n return this.ports.filter((p) => p.group === groupName || (p.group == null && groupName == null));\n }\n getPortsLayoutByGroup(groupName, elemBBox) {\n const ports = this.getPortsByGroup(groupName);\n const group = groupName ? this.getGroup(groupName) : null;\n const groupPosition = group ? group.position : null;\n const groupPositionName = groupPosition ? groupPosition.name : null;\n let layoutFn;\n if (groupPositionName != null) {\n const fn = PortLayout.registry.get(groupPositionName);\n if (fn == null) {\n return PortLayout.registry.onNotFound(groupPositionName);\n }\n layoutFn = fn;\n }\n else {\n layoutFn = PortLayout.presets.left;\n }\n const portsArgs = ports.map((port) => (port && port.position && port.position.args) || {});\n const groupArgs = (groupPosition && groupPosition.args) || {};\n const layouts = layoutFn(portsArgs, elemBBox, groupArgs);\n return layouts.map((portLayout, index) => {\n const port = ports[index];\n return {\n portLayout,\n portId: port.id,\n portSize: port.size,\n portAttrs: port.attrs,\n labelSize: port.label.size,\n labelLayout: this.getPortLabelLayout(port, Point.create(portLayout.position), elemBBox),\n };\n });\n }\n init(data) {\n const { groups, items } = data;\n if (groups != null) {\n Object.keys(groups).forEach((key) => {\n this.groups[key] = this.parseGroup(groups[key]);\n });\n }\n if (Array.isArray(items)) {\n items.forEach((item) => {\n this.ports.push(this.parsePort(item));\n });\n }\n }\n parseGroup(group) {\n return Object.assign(Object.assign({}, group), { label: this.getLabel(group, true), position: this.getPortPosition(group.position, true) });\n }\n parsePort(port) {\n const result = Object.assign({}, port);\n const group = this.getGroup(port.group) || {};\n result.markup = result.markup || group.markup;\n result.attrs = ObjectExt.merge({}, group.attrs, result.attrs);\n result.position = this.createPosition(group, result);\n result.label = ObjectExt.merge({}, group.label, this.getLabel(result));\n result.zIndex = this.getZIndex(group, result);\n result.size = Object.assign(Object.assign({}, group.size), result.size);\n return result;\n }\n getZIndex(group, port) {\n if (typeof port.zIndex === 'number') {\n return port.zIndex;\n }\n if (typeof group.zIndex === 'number' || group.zIndex === 'auto') {\n return group.zIndex;\n }\n return 'auto';\n }\n createPosition(group, port) {\n return ObjectExt.merge({\n name: 'left',\n args: {},\n }, group.position, { args: port.args });\n }\n getPortPosition(position, setDefault = false) {\n if (position == null) {\n if (setDefault) {\n return { name: 'left', args: {} };\n }\n }\n else {\n if (typeof position === 'string') {\n return {\n name: position,\n args: {},\n };\n }\n if (Array.isArray(position)) {\n return {\n name: 'absolute',\n args: { x: position[0], y: position[1] },\n };\n }\n if (typeof position === 'object') {\n return position;\n }\n }\n return { args: {} };\n }\n getPortLabelPosition(position, setDefault = false) {\n if (position == null) {\n if (setDefault) {\n return { name: 'left', args: {} };\n }\n }\n else {\n if (typeof position === 'string') {\n return {\n name: position,\n args: {},\n };\n }\n if (typeof position === 'object') {\n return position;\n }\n }\n return { args: {} };\n }\n getLabel(item, setDefaults = false) {\n const label = item.label || {};\n label.position = this.getPortLabelPosition(label.position, setDefaults);\n return label;\n }\n getPortLabelLayout(port, portPosition, elemBBox) {\n const name = port.label.position.name || 'left';\n const args = port.label.position.args || {};\n const layoutFn = PortLabelLayout.registry.get(name) || PortLabelLayout.presets.left;\n if (layoutFn) {\n return layoutFn(portPosition, elemBBox, args);\n }\n return null;\n }\n}\n//# sourceMappingURL=port.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Registry } from '../registry';\nimport { Point, Rectangle, Angle } from '../geometry';\nimport { StringExt, ObjectExt, NumberExt } from '../util';\nimport { Markup } from '../view/markup';\nimport { Cell } from './cell';\nimport { ShareRegistry } from './registry';\nimport { PortManager } from './port';\nimport { Interp } from '../common';\nexport class Node extends Cell {\n constructor(metadata = {}) {\n super(metadata);\n this.initPorts();\n }\n get [Symbol.toStringTag]() {\n return Node.toStringTag;\n }\n preprocess(metadata, ignoreIdCheck) {\n const { x, y, width, height } = metadata, others = __rest(metadata, [\"x\", \"y\", \"width\", \"height\"]);\n if (x != null || y != null) {\n const position = others.position;\n others.position = Object.assign(Object.assign({}, position), { x: x != null ? x : position ? position.x : 0, y: y != null ? y : position ? position.y : 0 });\n }\n if (width != null || height != null) {\n const size = others.size;\n others.size = Object.assign(Object.assign({}, size), { width: width != null ? width : size ? size.width : 0, height: height != null ? height : size ? size.height : 0 });\n }\n return super.preprocess(others, ignoreIdCheck);\n }\n isNode() {\n return true;\n }\n size(width, height, options) {\n if (width === undefined) {\n return this.getSize();\n }\n if (typeof width === 'number') {\n return this.setSize(width, height, options);\n }\n return this.setSize(width, height);\n }\n getSize() {\n const size = this.store.get('size');\n return size ? Object.assign({}, size) : { width: 1, height: 1 };\n }\n setSize(width, height, options) {\n if (typeof width === 'object') {\n this.resize(width.width, width.height, height);\n }\n else {\n this.resize(width, height, options);\n }\n return this;\n }\n resize(width, height, options = {}) {\n this.startBatch('resize', options);\n const direction = options.direction;\n if (direction) {\n const currentSize = this.getSize();\n switch (direction) {\n case 'left':\n case 'right':\n // Don't change height when resizing horizontally.\n height = currentSize.height; // eslint-disable-line\n break;\n case 'top':\n case 'bottom':\n // Don't change width when resizing vertically.\n width = currentSize.width; // eslint-disable-line\n break;\n default:\n break;\n }\n const map = {\n right: 0,\n 'top-right': 0,\n top: 1,\n 'top-left': 1,\n left: 2,\n 'bottom-left': 2,\n bottom: 3,\n 'bottom-right': 3,\n };\n let quadrant = map[direction];\n const angle = Angle.normalize(this.getAngle() || 0);\n if (options.absolute) {\n // We are taking the node's rotation into account\n quadrant += Math.floor((angle + 45) / 90);\n quadrant %= 4;\n }\n // This is a rectangle in size of the un-rotated node.\n const bbox = this.getBBox();\n // Pick the corner point on the node, which meant to stay on its\n // place before and after the rotation.\n let fixedPoint;\n if (quadrant === 0) {\n fixedPoint = bbox.getBottomLeft();\n }\n else if (quadrant === 1) {\n fixedPoint = bbox.getCorner();\n }\n else if (quadrant === 2) {\n fixedPoint = bbox.getTopRight();\n }\n else {\n fixedPoint = bbox.getOrigin();\n }\n // Find an image of the previous indent point. This is the position,\n // where is the point actually located on the screen.\n const imageFixedPoint = fixedPoint\n .clone()\n .rotate(-angle, bbox.getCenter());\n // Every point on the element rotates around a circle with the centre of\n // rotation in the middle of the element while the whole element is being\n // rotated. That means that the distance from a point in the corner of\n // the element (supposed its always rect) to the center of the element\n // doesn't change during the rotation and therefore it equals to a\n // distance on un-rotated element.\n // We can find the distance as DISTANCE = (ELEMENTWIDTH/2)^2 + (ELEMENTHEIGHT/2)^2)^0.5.\n const radius = Math.sqrt(width * width + height * height) / 2;\n // Now we are looking for an angle between x-axis and the line starting\n // at image of fixed point and ending at the center of the element.\n // We call this angle `alpha`.\n // The image of a fixed point is located in n-th quadrant. For each\n // quadrant passed going anti-clockwise we have to add 90 degrees.\n // Note that the first quadrant has index 0.\n //\n // 3 | 2\n // --c-- Quadrant positions around the element's center `c`\n // 0 | 1\n //\n let alpha = (quadrant * Math.PI) / 2;\n // Add an angle between the beginning of the current quadrant (line\n // parallel with x-axis or y-axis going through the center of the\n // element) and line crossing the indent of the fixed point and the\n // center of the element. This is the angle we need but on the\n // un-rotated element.\n alpha += Math.atan(quadrant % 2 === 0 ? height / width : width / height);\n // Lastly we have to deduct the original angle the element was rotated\n // by and that's it.\n alpha -= Angle.toRad(angle);\n // With this angle and distance we can easily calculate the centre of\n // the un-rotated element.\n // Note that fromPolar constructor accepts an angle in radians.\n const center = Point.fromPolar(radius, alpha, imageFixedPoint);\n // The top left corner on the un-rotated element has to be half a width\n // on the left and half a height to the top from the center. This will\n // be the origin of rectangle we were looking for.\n const origin = center.clone().translate(width / -2, height / -2);\n this.store.set('size', { width, height }, options);\n this.setPosition(origin.x, origin.y, options);\n }\n else {\n this.store.set('size', { width, height }, options);\n }\n this.stopBatch('resize', options);\n return this;\n }\n scale(sx, sy, origin, options = {}) {\n const scaledBBox = this.getBBox().scale(sx, sy, origin == null ? undefined : origin);\n this.startBatch('scale', options);\n this.setPosition(scaledBBox.x, scaledBBox.y, options);\n this.resize(scaledBBox.width, scaledBBox.height, options);\n this.stopBatch('scale');\n return this;\n }\n position(arg0, arg1, arg2) {\n if (typeof arg0 === 'number') {\n return this.setPosition(arg0, arg1, arg2);\n }\n return this.getPosition(arg0);\n }\n getPosition(options = {}) {\n if (options.relative) {\n const parent = this.getParent();\n if (parent != null && parent.isNode()) {\n const currentPosition = this.getPosition();\n const parentPosition = parent.getPosition();\n return {\n x: currentPosition.x - parentPosition.x,\n y: currentPosition.y - parentPosition.y,\n };\n }\n }\n const pos = this.store.get('position');\n return pos ? Object.assign({}, pos) : { x: 0, y: 0 };\n }\n setPosition(arg0, arg1, arg2 = {}) {\n let x;\n let y;\n let options;\n if (typeof arg0 === 'object') {\n x = arg0.x;\n y = arg0.y;\n options = arg1 || {};\n }\n else {\n x = arg0;\n y = arg1;\n options = arg2 || {};\n }\n if (options.relative) {\n const parent = this.getParent();\n if (parent != null && parent.isNode()) {\n const parentPosition = parent.getPosition();\n x += parentPosition.x;\n y += parentPosition.y;\n }\n }\n if (options.deep) {\n const currentPosition = this.getPosition();\n this.translate(x - currentPosition.x, y - currentPosition.y, options);\n }\n else {\n this.store.set('position', { x, y }, options);\n }\n return this;\n }\n translate(tx = 0, ty = 0, options = {}) {\n if (tx === 0 && ty === 0) {\n return this;\n }\n // Pass the initiator of the translation.\n options.translateBy = options.translateBy || this.id;\n const position = this.getPosition();\n if (options.restrict != null && options.translateBy === this.id) {\n // We are restricting the translation for the element itself only. We get\n // the bounding box of the element including all its embeds.\n // All embeds have to be translated the exact same way as the element.\n const bbox = this.getBBox({ deep: true });\n const ra = options.restrict;\n // - - - - - - - - - - - - -> ra.x + ra.width\n // - - - -> position.x |\n // -> bbox.x\n // ▓▓▓▓▓▓▓ |\n // ░░░░░░░▓▓▓▓▓▓▓\n // ░░░░░░░░░ |\n // ▓▓▓▓▓▓▓▓░░░░░░░\n // ▓▓▓▓▓▓▓▓ |\n // <-dx-> | restricted area right border\n // <-width-> | ░ translated element\n // <- - bbox.width - -> ▓ embedded element\n const dx = position.x - bbox.x;\n const dy = position.y - bbox.y;\n // Find the maximal/minimal coordinates that the element can be translated\n // while complies the restrictions.\n const x = Math.max(ra.x + dx, Math.min(ra.x + ra.width + dx - bbox.width, position.x + tx));\n const y = Math.max(ra.y + dy, Math.min(ra.y + ra.height + dy - bbox.height, position.y + ty));\n // recalculate the translation taking the restrictions into account.\n tx = x - position.x; // eslint-disable-line\n ty = y - position.y; // eslint-disable-line\n }\n const translatedPosition = {\n x: position.x + tx,\n y: position.y + ty,\n };\n // To find out by how much an element was translated in event\n // 'change:position' handlers.\n options.tx = tx;\n options.ty = ty;\n if (options.transition) {\n if (typeof options.transition !== 'object') {\n options.transition = {};\n }\n this.transition('position', translatedPosition, Object.assign(Object.assign({}, options.transition), { interp: Interp.object }));\n this.eachChild((child) => {\n var _a;\n const excluded = (_a = options.exclude) === null || _a === void 0 ? void 0 : _a.includes(child);\n if (!excluded) {\n child.translate(tx, ty, options);\n }\n });\n }\n else {\n this.startBatch('translate', options);\n this.store.set('position', translatedPosition, options);\n this.eachChild((child) => {\n var _a;\n const excluded = (_a = options.exclude) === null || _a === void 0 ? void 0 : _a.includes(child);\n if (!excluded) {\n child.translate(tx, ty, options);\n }\n });\n this.stopBatch('translate', options);\n }\n return this;\n }\n angle(val, options) {\n if (val == null) {\n return this.getAngle();\n }\n return this.rotate(val, options);\n }\n getAngle() {\n return this.store.get('angle', 0);\n }\n rotate(angle, options = {}) {\n const currentAngle = this.getAngle();\n if (options.center) {\n const size = this.getSize();\n const position = this.getPosition();\n const center = this.getBBox().getCenter();\n center.rotate(currentAngle - angle, options.center);\n const dx = center.x - size.width / 2 - position.x;\n const dy = center.y - size.height / 2 - position.y;\n this.startBatch('rotate', { angle, options });\n this.setPosition(position.x + dx, position.y + dy, options);\n this.rotate(angle, Object.assign(Object.assign({}, options), { center: null }));\n this.stopBatch('rotate');\n }\n else {\n this.store.set('angle', options.absolute ? angle : (currentAngle + angle) % 360, options);\n }\n return this;\n }\n // #endregion\n // #region common\n getBBox(options = {}) {\n if (options.deep) {\n const cells = this.getDescendants({ deep: true, breadthFirst: true });\n cells.push(this);\n return Cell.getCellsBBox(cells);\n }\n return Rectangle.fromPositionAndSize(this.getPosition(), this.getSize());\n }\n getConnectionPoint(edge, type) {\n const bbox = this.getBBox();\n const center = bbox.getCenter();\n const terminal = edge.getTerminal(type);\n if (terminal == null) {\n return center;\n }\n const portId = terminal.port;\n if (!portId || !this.hasPort(portId)) {\n return center;\n }\n const port = this.getPort(portId);\n if (!port || !port.group) {\n return center;\n }\n const layouts = this.getPortsPosition(port.group);\n const position = layouts[portId].position;\n const portCenter = Point.create(position).translate(bbox.getOrigin());\n const angle = this.getAngle();\n if (angle) {\n portCenter.rotate(-angle, center);\n }\n return portCenter;\n }\n /**\n * Sets cell's size and position based on the children bbox and given padding.\n */\n fit(options = {}) {\n const children = this.getChildren() || [];\n const embeds = children.filter((cell) => cell.isNode());\n if (embeds.length === 0) {\n return this;\n }\n this.startBatch('fit-embeds', options);\n if (options.deep) {\n embeds.forEach((cell) => cell.fit(options));\n }\n let { x, y, width, height } = Cell.getCellsBBox(embeds);\n const padding = NumberExt.normalizeSides(options.padding);\n x -= padding.left;\n y -= padding.top;\n width += padding.left + padding.right;\n height += padding.bottom + padding.top;\n this.store.set({\n position: { x, y },\n size: { width, height },\n }, options);\n this.stopBatch('fit-embeds');\n return this;\n }\n // #endregion\n // #region ports\n get portContainerMarkup() {\n return this.getPortContainerMarkup();\n }\n set portContainerMarkup(markup) {\n this.setPortContainerMarkup(markup);\n }\n getDefaultPortContainerMarkup() {\n return (this.store.get('defaultPortContainerMarkup') ||\n Markup.getPortContainerMarkup());\n }\n getPortContainerMarkup() {\n return (this.store.get('portContainerMarkup') ||\n this.getDefaultPortContainerMarkup());\n }\n setPortContainerMarkup(markup, options = {}) {\n this.store.set('portContainerMarkup', Markup.clone(markup), options);\n return this;\n }\n get portMarkup() {\n return this.getPortMarkup();\n }\n set portMarkup(markup) {\n this.setPortMarkup(markup);\n }\n getDefaultPortMarkup() {\n return this.store.get('defaultPortMarkup') || Markup.getPortMarkup();\n }\n getPortMarkup() {\n return this.store.get('portMarkup') || this.getDefaultPortMarkup();\n }\n setPortMarkup(markup, options = {}) {\n this.store.set('portMarkup', Markup.clone(markup), options);\n return this;\n }\n get portLabelMarkup() {\n return this.getPortLabelMarkup();\n }\n set portLabelMarkup(markup) {\n this.setPortLabelMarkup(markup);\n }\n getDefaultPortLabelMarkup() {\n return (this.store.get('defaultPortLabelMarkup') || Markup.getPortLabelMarkup());\n }\n getPortLabelMarkup() {\n return this.store.get('portLabelMarkup') || this.getDefaultPortLabelMarkup();\n }\n setPortLabelMarkup(markup, options = {}) {\n this.store.set('portLabelMarkup', Markup.clone(markup), options);\n return this;\n }\n get ports() {\n const res = this.store.get('ports', { items: [] });\n if (res.items == null) {\n res.items = [];\n }\n return res;\n }\n getPorts() {\n return ObjectExt.cloneDeep(this.ports.items);\n }\n getPortsByGroup(groupName) {\n return this.getPorts().filter((port) => port.group === groupName);\n }\n getPort(portId) {\n return ObjectExt.cloneDeep(this.ports.items.find((port) => port.id && port.id === portId));\n }\n getPortAt(index) {\n return this.ports.items[index] || null;\n }\n hasPorts() {\n return this.ports.items.length > 0;\n }\n hasPort(portId) {\n return this.getPortIndex(portId) !== -1;\n }\n getPortIndex(port) {\n const portId = typeof port === 'string' ? port : port.id;\n return portId != null\n ? this.ports.items.findIndex((item) => item.id === portId)\n : -1;\n }\n getPortsPosition(groupName) {\n const size = this.getSize();\n const layouts = this.port.getPortsLayoutByGroup(groupName, new Rectangle(0, 0, size.width, size.height));\n return layouts.reduce((memo, item) => {\n const layout = item.portLayout;\n memo[item.portId] = {\n position: Object.assign({}, layout.position),\n angle: layout.angle || 0,\n };\n return memo;\n }, {});\n }\n getPortProp(portId, path) {\n return this.getPropByPath(this.prefixPortPath(portId, path));\n }\n setPortProp(portId, arg1, arg2, arg3) {\n if (typeof arg1 === 'string' || Array.isArray(arg1)) {\n const path = this.prefixPortPath(portId, arg1);\n const value = arg2;\n return this.setPropByPath(path, value, arg3);\n }\n const path = this.prefixPortPath(portId);\n const value = arg1;\n return this.setPropByPath(path, value, arg2);\n }\n removePortProp(portId, path, options) {\n if (typeof path === 'string' || Array.isArray(path)) {\n return this.removePropByPath(this.prefixPortPath(portId, path), options);\n }\n return this.removePropByPath(this.prefixPortPath(portId), path);\n }\n portProp(portId, path, value, options) {\n if (path == null) {\n return this.getPortProp(portId);\n }\n if (typeof path === 'string' || Array.isArray(path)) {\n if (arguments.length === 2) {\n return this.getPortProp(portId, path);\n }\n if (value == null) {\n return this.removePortProp(portId, path, options);\n }\n return this.setPortProp(portId, path, value, options);\n }\n return this.setPortProp(portId, path, value);\n }\n prefixPortPath(portId, path) {\n const index = this.getPortIndex(portId);\n if (index === -1) {\n throw new Error(`Unable to find port with id: \"${portId}\"`);\n }\n if (path == null || path === '') {\n return ['ports', 'items', `${index}`];\n }\n if (Array.isArray(path)) {\n return ['ports', 'items', `${index}`, ...path];\n }\n return `ports/items/${index}/${path}`;\n }\n addPort(port, options) {\n const ports = [...this.ports.items];\n ports.push(port);\n this.setPropByPath('ports/items', ports, options);\n return this;\n }\n addPorts(ports, options) {\n this.setPropByPath('ports/items', [...this.ports.items, ...ports], options);\n return this;\n }\n insertPort(index, port, options) {\n const ports = [...this.ports.items];\n ports.splice(index, 0, port);\n this.setPropByPath('ports/items', ports, options);\n return this;\n }\n removePort(port, options = {}) {\n return this.removePortAt(this.getPortIndex(port), options);\n }\n removePortAt(index, options = {}) {\n if (index >= 0) {\n const ports = [...this.ports.items];\n ports.splice(index, 1);\n options.rewrite = true;\n this.setPropByPath('ports/items', ports, options);\n }\n return this;\n }\n removePorts(portsForRemoval, opt) {\n let options;\n if (Array.isArray(portsForRemoval)) {\n options = opt || {};\n if (portsForRemoval.length) {\n options.rewrite = true;\n const currentPorts = [...this.ports.items];\n const remainingPorts = currentPorts.filter((cp) => !portsForRemoval.some((p) => {\n const id = typeof p === 'string' ? p : p.id;\n return cp.id === id;\n }));\n this.setPropByPath('ports/items', remainingPorts, options);\n }\n }\n else {\n options = portsForRemoval || {};\n options.rewrite = true;\n this.setPropByPath('ports/items', [], options);\n }\n return this;\n }\n getParsedPorts() {\n return this.port.getPorts();\n }\n getParsedGroups() {\n return this.port.groups;\n }\n getPortsLayoutByGroup(groupName, bbox) {\n return this.port.getPortsLayoutByGroup(groupName, bbox);\n }\n initPorts() {\n this.updatePortData();\n this.on('change:ports', () => {\n this.processRemovedPort();\n this.updatePortData();\n });\n }\n processRemovedPort() {\n const current = this.ports;\n const currentItemsMap = {};\n current.items.forEach((item) => {\n if (item.id) {\n currentItemsMap[item.id] = true;\n }\n });\n const removed = {};\n const previous = this.store.getPrevious('ports') || {\n items: [],\n };\n previous.items.forEach((item) => {\n if (item.id && !currentItemsMap[item.id]) {\n removed[item.id] = true;\n }\n });\n const model = this.model;\n if (model && !ObjectExt.isEmpty(removed)) {\n const incomings = model.getConnectedEdges(this, { incoming: true });\n incomings.forEach((edge) => {\n const portId = edge.getTargetPortId();\n if (portId && removed[portId]) {\n edge.remove();\n }\n });\n const outgoings = model.getConnectedEdges(this, { outgoing: true });\n outgoings.forEach((edge) => {\n const portId = edge.getSourcePortId();\n if (portId && removed[portId]) {\n edge.remove();\n }\n });\n }\n }\n validatePorts() {\n const ids = {};\n const errors = [];\n this.ports.items.forEach((p) => {\n if (typeof p !== 'object') {\n errors.push(`Invalid port ${p}.`);\n }\n if (p.id == null) {\n p.id = this.generatePortId();\n }\n if (ids[p.id]) {\n errors.push('Duplicitied port id.');\n }\n ids[p.id] = true;\n });\n return errors;\n }\n generatePortId() {\n return StringExt.uuid();\n }\n updatePortData() {\n const err = this.validatePorts();\n if (err.length > 0) {\n this.store.set('ports', this.store.getPrevious('ports'));\n throw new Error(err.join(' '));\n }\n const prev = this.port ? this.port.getPorts() : null;\n this.port = new PortManager(this.ports);\n const curr = this.port.getPorts();\n const added = prev\n ? curr.filter((item) => {\n if (!prev.find((prevPort) => prevPort.id === item.id)) {\n return item;\n }\n return null;\n })\n : [...curr];\n const removed = prev\n ? prev.filter((item) => {\n if (!curr.find((curPort) => curPort.id === item.id)) {\n return item;\n }\n return null;\n })\n : [];\n if (added.length > 0) {\n this.notify('ports:added', { added, cell: this, node: this });\n }\n if (removed.length > 0) {\n this.notify('ports:removed', { removed, cell: this, node: this });\n }\n }\n}\nNode.defaults = {\n angle: 0,\n position: { x: 0, y: 0 },\n size: { width: 1, height: 1 },\n};\n(function (Node) {\n Node.toStringTag = `X6.${Node.name}`;\n function isNode(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Node) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const node = instance;\n if ((tag == null || tag === Node.toStringTag) &&\n typeof node.isNode === 'function' &&\n typeof node.isEdge === 'function' &&\n typeof node.prop === 'function' &&\n typeof node.attr === 'function' &&\n typeof node.size === 'function' &&\n typeof node.position === 'function') {\n return true;\n }\n return false;\n }\n Node.isNode = isNode;\n})(Node || (Node = {}));\n(function (Node) {\n Node.config({\n propHooks(_a) {\n var { ports } = _a, metadata = __rest(_a, [\"ports\"]);\n if (ports) {\n metadata.ports = Array.isArray(ports) ? { items: ports } : ports;\n }\n return metadata;\n },\n });\n})(Node || (Node = {}));\n(function (Node) {\n Node.registry = Registry.create({\n type: 'node',\n process(shape, options) {\n if (ShareRegistry.exist(shape, true)) {\n throw new Error(`Node with name '${shape}' was registered by anthor Edge`);\n }\n if (typeof options === 'function') {\n options.config({ shape });\n return options;\n }\n let parent = Node;\n const { inherit } = options, config = __rest(options, [\"inherit\"]);\n if (inherit) {\n if (typeof inherit === 'string') {\n const base = this.get(inherit);\n if (base == null) {\n this.onNotFound(inherit, 'inherited');\n }\n else {\n parent = base;\n }\n }\n else {\n parent = inherit;\n }\n }\n if (config.constructorName == null) {\n config.constructorName = shape;\n }\n const ctor = parent.define.call(parent, config);\n ctor.config({ shape });\n return ctor;\n },\n });\n ShareRegistry.setNodeRegistry(Node.registry);\n})(Node || (Node = {}));\n(function (Node) {\n let counter = 0;\n function getClassName(name) {\n if (name) {\n return StringExt.pascalCase(name);\n }\n counter += 1;\n return `CustomNode${counter}`;\n }\n function define(config) {\n const { constructorName, overwrite } = config, others = __rest(config, [\"constructorName\", \"overwrite\"]);\n const ctor = ObjectExt.createClass(getClassName(constructorName || others.shape), this);\n ctor.config(others);\n if (others.shape) {\n Node.registry.register(others.shape, ctor, overwrite);\n }\n return ctor;\n }\n Node.define = define;\n function create(options) {\n const shape = options.shape || 'rect';\n const Ctor = Node.registry.get(shape);\n if (Ctor) {\n return new Ctor(options);\n }\n return Node.registry.onNotFound(shape);\n }\n Node.create = create;\n})(Node || (Node = {}));\n//# sourceMappingURL=node.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Node } from '../model/node';\nimport { ObjectExt } from '../util';\nexport class Base extends Node {\n get label() {\n return this.getLabel();\n }\n set label(val) {\n this.setLabel(val);\n }\n getLabel() {\n return this.getAttrByPath('text/text');\n }\n setLabel(label, options) {\n if (label == null) {\n this.removeLabel();\n }\n else {\n this.setAttrByPath('text/text', label, options);\n }\n return this;\n }\n removeLabel() {\n this.removeAttrByPath('text/text');\n return this;\n }\n}\n(function (Base) {\n Base.bodyAttr = {\n fill: '#ffffff',\n stroke: '#333333',\n strokeWidth: 2,\n };\n Base.labelAttr = {\n fontSize: 14,\n fill: '#000000',\n refX: 0.5,\n refY: 0.5,\n textAnchor: 'middle',\n textVerticalAnchor: 'middle',\n fontFamily: 'Arial, helvetica, sans-serif',\n };\n Base.config({\n attrs: { text: Object.assign({}, Base.labelAttr) },\n propHooks(metadata) {\n const { label } = metadata, others = __rest(metadata, [\"label\"]);\n if (label) {\n ObjectExt.setByPath(others, 'attrs/text/text', label);\n }\n return others;\n },\n });\n})(Base || (Base = {}));\n//# sourceMappingURL=base.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt } from '../../util';\nimport { Base } from '../base';\nexport function getMarkup(tagName, noText = false) {\n return `<g class=\"rotatable\"><g class=\"scalable\"><${tagName}/></g>${noText ? '' : '<text/>'}</g>`;\n}\nexport function getName(name) {\n return `basic.${name}`;\n}\nexport function getImageUrlHook(attrName = 'xlink:href') {\n const hook = (metadata) => {\n const { imageUrl, imageWidth, imageHeight } = metadata, others = __rest(metadata, [\"imageUrl\", \"imageWidth\", \"imageHeight\"]);\n if (imageUrl != null || imageWidth != null || imageHeight != null) {\n const apply = () => {\n if (others.attrs) {\n const image = others.attrs.image;\n if (imageUrl != null) {\n image[attrName] = imageUrl;\n }\n if (imageWidth != null) {\n image.width = imageWidth;\n }\n if (imageHeight != null) {\n image.height = imageHeight;\n }\n others.attrs.image = image;\n }\n };\n if (others.attrs) {\n if (others.attrs.image == null) {\n others.attrs.image = {};\n }\n apply();\n }\n else {\n others.attrs = {\n image: {},\n };\n apply();\n }\n }\n return others;\n };\n return hook;\n}\nexport function createShape(shape, config, options = {}) {\n const name = getName(shape);\n const defaults = {\n constructorName: name,\n attrs: {\n '.': {\n fill: '#ffffff',\n stroke: 'none',\n },\n [shape]: {\n fill: '#ffffff',\n stroke: '#000000',\n },\n },\n };\n if (!options.ignoreMarkup) {\n defaults.markup = getMarkup(shape, options.noText === true);\n }\n const base = options.parent || Base;\n return base.define(ObjectExt.merge(defaults, config, { shape: name }));\n}\n//# sourceMappingURL=util.js.map","import { createShape } from './util';\nexport const Rect = createShape('rect', {\n attrs: {\n rect: {\n width: 100,\n height: 60,\n },\n },\n});\n//# sourceMappingURL=rect.js.map","import { createShape } from './util';\nexport const Circle = createShape('circle', {\n width: 60,\n height: 60,\n attrs: {\n circle: {\n r: 30,\n cx: 30,\n cy: 30,\n },\n },\n});\n//# sourceMappingURL=circle.js.map","import { createShape } from './util';\nexport const Ellipse = createShape('ellipse', {\n width: 60,\n height: 40,\n attrs: {\n ellipse: {\n rx: 30,\n ry: 20,\n cx: 30,\n cy: 20,\n },\n },\n});\n//# sourceMappingURL=ellipse.js.map","import { createShape } from './util';\nexport const Polygon = createShape('polygon', {\n width: 60,\n height: 40,\n attrs: {\n text: {\n refY: null,\n refDy: 16,\n },\n },\n});\n//# sourceMappingURL=polygon.js.map","import { createShape } from './util';\nexport const Polyline = createShape('polyline', {\n width: 60,\n height: 40,\n attrs: {\n text: {\n refY: null,\n refDy: 16,\n },\n },\n});\n//# sourceMappingURL=polyline.js.map","import { createShape, getImageUrlHook } from './util';\nexport const Image = createShape('image', {\n attrs: {\n text: {\n refY: null,\n refDy: 16,\n },\n },\n propHooks: getImageUrlHook(),\n});\n//# sourceMappingURL=image.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt } from '../../util';\nimport { createShape } from './util';\nexport const Path = createShape('path', {\n width: 60,\n height: 60,\n attrs: {\n text: {\n ref: 'path',\n refY: null,\n refDy: 16,\n },\n },\n propHooks(metadata) {\n const { d } = metadata, others = __rest(metadata, [\"d\"]);\n if (d != null) {\n ObjectExt.setByPath(others, 'attrs/path/d', d);\n }\n return others;\n },\n});\n//# sourceMappingURL=path.js.map","import { Path } from './path';\nimport { createShape } from './util';\nexport const Rhombus = createShape('rhombus', {\n d: 'M 30 0 L 60 30 30 60 0 30 z',\n attrs: {\n text: {\n refY: 0.5,\n refDy: null,\n },\n },\n}, {\n parent: Path,\n ignoreMarkup: true,\n});\n//# sourceMappingURL=rhombus.js.map","import { Path } from './path';\nimport { createShape } from './util';\nexport const Cylinder = createShape('cylinder', {\n width: 40,\n height: 40,\n attrs: {\n path: {\n fill: '#FFFFFF',\n stroke: '#cbd2d7',\n strokeWidth: 3,\n d: [\n 'M 0 10 C 10 5, 30 5, 40 10 C 30 15, 10 15, 0 10',\n 'L 0 20',\n 'C 10 25, 30 25, 40 20',\n 'L 40 10',\n ].join(' '),\n },\n text: {\n refY: 0.7,\n refDy: null,\n fill: '#435460',\n },\n },\n}, {\n parent: Path,\n ignoreMarkup: true,\n});\n//# sourceMappingURL=cylinder.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt, StringExt } from '../util';\nimport { Point, Polyline } from '../geometry';\nimport { Registry, } from '../registry';\nimport { Markup } from '../view/markup';\nimport { ShareRegistry } from './registry';\nimport { Cell } from './cell';\nexport class Edge extends Cell {\n constructor(metadata = {}) {\n super(metadata);\n }\n get [Symbol.toStringTag]() {\n return Edge.toStringTag;\n }\n preprocess(metadata, ignoreIdCheck) {\n const { source, sourceCell, sourcePort, sourcePoint, target, targetCell, targetPort, targetPoint } = metadata, others = __rest(metadata, [\"source\", \"sourceCell\", \"sourcePort\", \"sourcePoint\", \"target\", \"targetCell\", \"targetPort\", \"targetPoint\"]);\n const data = others;\n const isValidId = (val) => typeof val === 'string' || typeof val === 'number';\n if (source != null) {\n if (Cell.isCell(source)) {\n data.source = { cell: source.id };\n }\n else if (isValidId(source)) {\n data.source = { cell: source };\n }\n else if (Point.isPoint(source)) {\n data.source = source.toJSON();\n }\n else if (Array.isArray(source)) {\n data.source = { x: source[0], y: source[1] };\n }\n else {\n const cell = source.cell;\n if (Cell.isCell(cell)) {\n data.source = Object.assign(Object.assign({}, source), { cell: cell.id });\n }\n else {\n data.source = source;\n }\n }\n }\n if (sourceCell != null || sourcePort != null) {\n let terminal = data.source;\n if (sourceCell != null) {\n const id = isValidId(sourceCell) ? sourceCell : sourceCell.id;\n if (terminal) {\n terminal.cell = id;\n }\n else {\n terminal = data.source = { cell: id };\n }\n }\n if (sourcePort != null && terminal) {\n terminal.port = sourcePort;\n }\n }\n else if (sourcePoint != null) {\n data.source = Point.create(sourcePoint).toJSON();\n }\n if (target != null) {\n if (Cell.isCell(target)) {\n data.target = { cell: target.id };\n }\n else if (isValidId(target)) {\n data.target = { cell: target };\n }\n else if (Point.isPoint(target)) {\n data.target = target.toJSON();\n }\n else if (Array.isArray(target)) {\n data.target = { x: target[0], y: target[1] };\n }\n else {\n const cell = target.cell;\n if (Cell.isCell(cell)) {\n data.target = Object.assign(Object.assign({}, target), { cell: cell.id });\n }\n else {\n data.target = target;\n }\n }\n }\n if (targetCell != null || targetPort != null) {\n let terminal = data.target;\n if (targetCell != null) {\n const id = isValidId(targetCell) ? targetCell : targetCell.id;\n if (terminal) {\n terminal.cell = id;\n }\n else {\n terminal = data.target = { cell: id };\n }\n }\n if (targetPort != null && terminal) {\n terminal.port = targetPort;\n }\n }\n else if (targetPoint != null) {\n data.target = Point.create(targetPoint).toJSON();\n }\n return super.preprocess(data, ignoreIdCheck);\n }\n setup() {\n super.setup();\n this.on('change:labels', (args) => this.onLabelsChanged(args));\n this.on('change:vertices', (args) => this.onVertexsChanged(args));\n }\n isEdge() {\n return true;\n }\n // #region terminal\n disconnect(options = {}) {\n this.store.set({\n source: { x: 0, y: 0 },\n target: { x: 0, y: 0 },\n }, options);\n return this;\n }\n get source() {\n return this.getSource();\n }\n set source(data) {\n this.setSource(data);\n }\n getSource() {\n return this.getTerminal('source');\n }\n getSourceCellId() {\n return this.source.cell;\n }\n getSourcePortId() {\n return this.source.port;\n }\n setSource(source, args, options = {}) {\n return this.setTerminal('source', source, args, options);\n }\n get target() {\n return this.getTarget();\n }\n set target(data) {\n this.setTarget(data);\n }\n getTarget() {\n return this.getTerminal('target');\n }\n getTargetCellId() {\n return this.target.cell;\n }\n getTargetPortId() {\n return this.target.port;\n }\n setTarget(target, args, options = {}) {\n return this.setTerminal('target', target, args, options);\n }\n getTerminal(type) {\n return Object.assign({}, this.store.get(type));\n }\n setTerminal(type, terminal, args, options = {}) {\n // `terminal` is a cell\n if (Cell.isCell(terminal)) {\n this.store.set(type, ObjectExt.merge({}, args, { cell: terminal.id }), options);\n return this;\n }\n // `terminal` is a point-like object\n const p = terminal;\n if (Point.isPoint(terminal) || (p.x != null && p.y != null)) {\n this.store.set(type, ObjectExt.merge({}, args, { x: p.x, y: p.y }), options);\n return this;\n }\n // `terminal` is an object\n this.store.set(type, ObjectExt.cloneDeep(terminal), options);\n return this;\n }\n getSourcePoint() {\n return this.getTerminalPoint('source');\n }\n getTargetPoint() {\n return this.getTerminalPoint('target');\n }\n getTerminalPoint(type) {\n const terminal = this[type];\n if (Point.isPointLike(terminal)) {\n return Point.create(terminal);\n }\n const cell = this.getTerminalCell(type);\n if (cell) {\n return cell.getConnectionPoint(this, type);\n }\n return new Point();\n }\n getSourceCell() {\n return this.getTerminalCell('source');\n }\n getTargetCell() {\n return this.getTerminalCell('target');\n }\n getTerminalCell(type) {\n if (this.model) {\n const cellId = type === 'source' ? this.getSourceCellId() : this.getTargetCellId();\n if (cellId) {\n return this.model.getCell(cellId);\n }\n }\n return null;\n }\n getSourceNode() {\n return this.getTerminalNode('source');\n }\n getTargetNode() {\n return this.getTerminalNode('target');\n }\n getTerminalNode(type) {\n let cell = this; // eslint-disable-line\n const visited = {};\n while (cell && cell.isEdge()) {\n if (visited[cell.id]) {\n return null;\n }\n visited[cell.id] = true;\n cell = cell.getTerminalCell(type);\n }\n return cell && cell.isNode() ? cell : null;\n }\n // #endregion\n // #region router\n get router() {\n return this.getRouter();\n }\n set router(data) {\n if (data == null) {\n this.removeRouter();\n }\n else {\n this.setRouter(data);\n }\n }\n getRouter() {\n return this.store.get('router');\n }\n setRouter(name, args, options) {\n if (typeof name === 'object') {\n this.store.set('router', name, args);\n }\n else {\n this.store.set('router', { name, args }, options);\n }\n return this;\n }\n removeRouter(options = {}) {\n this.store.remove('router', options);\n return this;\n }\n // #endregion\n // #region connector\n get connector() {\n return this.getConnector();\n }\n set connector(data) {\n if (data == null) {\n this.removeConnector();\n }\n else {\n this.setConnector(data);\n }\n }\n getConnector() {\n return this.store.get('connector');\n }\n setConnector(name, args, options) {\n if (typeof name === 'object') {\n this.store.set('connector', name, args);\n }\n else {\n this.store.set('connector', { name, args }, options);\n }\n return this;\n }\n removeConnector(options = {}) {\n return this.store.remove('connector', options);\n }\n // #endregion\n // #region strategy\n get strategy() {\n return this.getStrategy();\n }\n set strategy(data) {\n if (data == null) {\n this.removeStrategy();\n }\n else {\n this.setStrategy(data);\n }\n }\n getStrategy() {\n return this.store.get('strategy');\n }\n setStrategy(name, args, options) {\n if (typeof name === 'object') {\n this.store.set('strategy', name, args);\n }\n else {\n this.store.set('strategy', { name, args }, options);\n }\n return this;\n }\n removeStrategy(options = {}) {\n return this.store.remove('strategy', options);\n }\n // #endregion\n // #region labels\n getDefaultLabel() {\n const ctor = this.constructor;\n const defaults = this.store.get('defaultLabel') || ctor.defaultLabel || {};\n return ObjectExt.cloneDeep(defaults);\n }\n get labels() {\n return this.getLabels();\n }\n set labels(labels) {\n this.setLabels(labels);\n }\n getLabels() {\n return [...this.store.get('labels', [])].map((item) => this.parseLabel(item));\n }\n setLabels(labels, options = {}) {\n this.store.set('labels', Array.isArray(labels) ? labels : [labels], options);\n return this;\n }\n insertLabel(label, index, options = {}) {\n const labels = this.getLabels();\n const len = labels.length;\n let idx = index != null && Number.isFinite(index) ? index : len;\n if (idx < 0) {\n idx = len + idx + 1;\n }\n labels.splice(idx, 0, this.parseLabel(label));\n return this.setLabels(labels, options);\n }\n appendLabel(label, options = {}) {\n return this.insertLabel(label, -1, options);\n }\n getLabelAt(index) {\n const labels = this.getLabels();\n if (index != null && Number.isFinite(index)) {\n return this.parseLabel(labels[index]);\n }\n return null;\n }\n setLabelAt(index, label, options = {}) {\n if (index != null && Number.isFinite(index)) {\n const labels = this.getLabels();\n labels[index] = this.parseLabel(label);\n this.setLabels(labels, options);\n }\n return this;\n }\n removeLabelAt(index, options = {}) {\n const labels = this.getLabels();\n const idx = index != null && Number.isFinite(index) ? index : -1;\n const removed = labels.splice(idx, 1);\n this.setLabels(labels, options);\n return removed.length ? removed[0] : null;\n }\n parseLabel(label) {\n if (typeof label === 'string') {\n const ctor = this.constructor;\n return ctor.parseStringLabel(label);\n }\n return label;\n }\n onLabelsChanged({ previous, current, }) {\n const added = previous && current\n ? current.filter((label1) => {\n if (!previous.find((label2) => label1 === label2 || ObjectExt.isEqual(label1, label2))) {\n return label1;\n }\n return null;\n })\n : current\n ? [...current]\n : [];\n const removed = previous && current\n ? previous.filter((label1) => {\n if (!current.find((label2) => label1 === label2 || ObjectExt.isEqual(label1, label2))) {\n return label1;\n }\n return null;\n })\n : previous\n ? [...previous]\n : [];\n if (added.length > 0) {\n this.notify('labels:added', { added, cell: this, edge: this });\n }\n if (removed.length > 0) {\n this.notify('labels:removed', { removed, cell: this, edge: this });\n }\n }\n // #endregion\n // #region vertices\n get vertexMarkup() {\n return this.getVertexMarkup();\n }\n set vertexMarkup(markup) {\n this.setVertexMarkup(markup);\n }\n getDefaultVertexMarkup() {\n return this.store.get('defaultVertexMarkup') || Markup.getEdgeVertexMarkup();\n }\n getVertexMarkup() {\n return this.store.get('vertexMarkup') || this.getDefaultVertexMarkup();\n }\n setVertexMarkup(markup, options = {}) {\n this.store.set('vertexMarkup', Markup.clone(markup), options);\n return this;\n }\n get vertices() {\n return this.getVertices();\n }\n set vertices(vertices) {\n this.setVertices(vertices);\n }\n getVertices() {\n return [...this.store.get('vertices', [])];\n }\n setVertices(vertices, options = {}) {\n const points = Array.isArray(vertices) ? vertices : [vertices];\n this.store.set('vertices', points.map((p) => Point.toJSON(p)), options);\n return this;\n }\n insertVertex(vertice, index, options = {}) {\n const vertices = this.getVertices();\n const len = vertices.length;\n let idx = index != null && Number.isFinite(index) ? index : len;\n if (idx < 0) {\n idx = len + idx + 1;\n }\n vertices.splice(idx, 0, Point.toJSON(vertice));\n return this.setVertices(vertices, options);\n }\n appendVertex(vertex, options = {}) {\n return this.insertVertex(vertex, -1, options);\n }\n getVertexAt(index) {\n if (index != null && Number.isFinite(index)) {\n const vertices = this.getVertices();\n return vertices[index];\n }\n return null;\n }\n setVertexAt(index, vertice, options = {}) {\n if (index != null && Number.isFinite(index)) {\n const vertices = this.getVertices();\n vertices[index] = vertice;\n this.setVertices(vertices, options);\n }\n return this;\n }\n removeVertexAt(index, options = {}) {\n const vertices = this.getVertices();\n const idx = index != null && Number.isFinite(index) ? index : -1;\n vertices.splice(idx, 1);\n return this.setVertices(vertices, options);\n }\n onVertexsChanged({ previous, current, }) {\n const added = previous && current\n ? current.filter((p1) => {\n if (!previous.find((p2) => Point.equals(p1, p2))) {\n return p1;\n }\n return null;\n })\n : current\n ? [...current]\n : [];\n const removed = previous && current\n ? previous.filter((p1) => {\n if (!current.find((p2) => Point.equals(p1, p2))) {\n return p1;\n }\n return null;\n })\n : previous\n ? [...previous]\n : [];\n if (added.length > 0) {\n this.notify('vertexs:added', { added, cell: this, edge: this });\n }\n if (removed.length > 0) {\n this.notify('vertexs:removed', { removed, cell: this, edge: this });\n }\n }\n // #endregion\n // #region markup\n getDefaultMarkup() {\n return this.store.get('defaultMarkup') || Markup.getEdgeMarkup();\n }\n getMarkup() {\n return super.getMarkup() || this.getDefaultMarkup();\n }\n // #endregion\n // #region toolMarkup\n get toolMarkup() {\n return this.getToolMarkup();\n }\n set toolMarkup(markup) {\n this.setToolMarkup(markup);\n }\n getDefaultToolMarkup() {\n return this.store.get('defaultToolMarkup') || Markup.getEdgeToolMarkup();\n }\n getToolMarkup() {\n return this.store.get('toolMarkup') || this.getDefaultToolMarkup();\n }\n setToolMarkup(markup, options = {}) {\n this.store.set('toolMarkup', markup, options);\n return this;\n }\n get doubleToolMarkup() {\n return this.getDoubleToolMarkup();\n }\n set doubleToolMarkup(markup) {\n this.setDoubleToolMarkup(markup);\n }\n getDefaultDoubleToolMarkup() {\n return this.store.get('defaultDoubleToolMarkup');\n }\n getDoubleToolMarkup() {\n return (this.store.get('doubleToolMarkup') || this.getDefaultDoubleToolMarkup());\n }\n setDoubleToolMarkup(markup, options = {}) {\n this.store.set('doubleToolMarkup', markup, options);\n return this;\n }\n // #endregion\n // #region arrowheadMarkup\n get arrowheadMarkup() {\n return this.getArrowheadMarkup();\n }\n set arrowheadMarkup(markup) {\n this.setArrowheadMarkup(markup);\n }\n getDefaultArrowheadMarkup() {\n return (this.store.get('defaultArrowheadMarkup') ||\n Markup.getEdgeArrowheadMarkup());\n }\n getArrowheadMarkup() {\n return this.store.get('arrowheadMarkup') || this.getDefaultArrowheadMarkup();\n }\n setArrowheadMarkup(markup, options = {}) {\n this.store.set('arrowheadMarkup', markup, options);\n return this;\n }\n // #endregion\n // #region transform\n /**\n * Translate the edge vertices (and source and target if they are points)\n * by `tx` pixels in the x-axis and `ty` pixels in the y-axis.\n */\n translate(tx, ty, options = {}) {\n options.translateBy = options.translateBy || this.id;\n options.tx = tx;\n options.ty = ty;\n return this.applyToPoints((p) => ({\n x: (p.x || 0) + tx,\n y: (p.y || 0) + ty,\n }), options);\n }\n /**\n * Scales the edge's points (vertices) relative to the given origin.\n */\n scale(sx, sy, origin, options = {}) {\n return this.applyToPoints((p) => {\n return Point.create(p).scale(sx, sy, origin).toJSON();\n }, options);\n }\n applyToPoints(worker, options = {}) {\n const attrs = {};\n const source = this.getSource();\n const target = this.getTarget();\n if (Point.isPointLike(source)) {\n attrs.source = worker(source);\n }\n if (Point.isPointLike(target)) {\n attrs.target = worker(target);\n }\n const vertices = this.getVertices();\n if (vertices.length > 0) {\n attrs.vertices = vertices.map(worker);\n }\n this.store.set(attrs, options);\n return this;\n }\n // #endregion\n // #region common\n getBBox() {\n return this.getPolyline().bbox();\n }\n getConnectionPoint() {\n return this.getPolyline().pointAt(0.5);\n }\n getPolyline() {\n const points = [\n this.getSourcePoint(),\n ...this.getVertices().map((vertice) => Point.create(vertice)),\n this.getTargetPoint(),\n ];\n return new Polyline(points);\n }\n updateParent(options) {\n let newParent = null;\n const source = this.getSourceCell();\n const target = this.getTargetCell();\n const prevParent = this.getParent();\n if (source && target) {\n if (source === target || source.isDescendantOf(target)) {\n newParent = target;\n }\n else if (target.isDescendantOf(source)) {\n newParent = source;\n }\n else {\n newParent = Cell.getCommonAncestor(source, target);\n }\n }\n // Unembeds the edge if source and target has no common\n // ancestor or common ancestor changed\n if (prevParent && (!newParent || newParent.id !== prevParent.id)) {\n prevParent.unembed(this, options);\n }\n if (newParent) {\n newParent.embed(this, options);\n }\n return newParent;\n }\n hasLoop(options = {}) {\n const source = this.getSource();\n const target = this.getTarget();\n const sourceId = source.cell;\n const targetId = target.cell;\n if (!sourceId || !targetId) {\n return false;\n }\n let loop = sourceId === targetId;\n // Note that there in the deep mode a edge can have a loop,\n // even if it connects only a parent and its embed.\n // A loop \"target equals source\" is valid in both shallow and deep mode.\n // eslint-disable-next-line\n if (!loop && options.deep && this._model) {\n const sourceCell = this.getSourceCell();\n const targetCell = this.getTargetCell();\n if (sourceCell && targetCell) {\n loop =\n sourceCell.isAncestorOf(targetCell, options) ||\n targetCell.isAncestorOf(sourceCell, options);\n }\n }\n return loop;\n }\n getFragmentAncestor() {\n const cells = [this, this.getSourceNode(), this.getTargetNode()].filter((item) => item != null);\n return this.getCommonAncestor(...cells);\n }\n isFragmentDescendantOf(cell) {\n const ancestor = this.getFragmentAncestor();\n return (!!ancestor && (ancestor.id === cell.id || ancestor.isDescendantOf(cell)));\n }\n}\nEdge.defaults = {};\n(function (Edge) {\n function equalTerminals(a, b) {\n const a1 = a;\n const b1 = b;\n if (a1.cell === b1.cell) {\n return a1.port === b1.port || (a1.port == null && b1.port == null);\n }\n return false;\n }\n Edge.equalTerminals = equalTerminals;\n})(Edge || (Edge = {}));\n(function (Edge) {\n Edge.defaultLabel = {\n markup: [\n {\n tagName: 'rect',\n selector: 'body',\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n text: {\n fill: '#000',\n fontSize: 14,\n textAnchor: 'middle',\n textVerticalAnchor: 'middle',\n pointerEvents: 'none',\n },\n rect: {\n ref: 'label',\n fill: '#fff',\n rx: 3,\n ry: 3,\n refWidth: 1,\n refHeight: 1,\n refX: 0,\n refY: 0,\n },\n },\n position: {\n distance: 0.5,\n },\n };\n function parseStringLabel(text) {\n return {\n attrs: { label: { text } },\n };\n }\n Edge.parseStringLabel = parseStringLabel;\n})(Edge || (Edge = {}));\n(function (Edge) {\n Edge.toStringTag = `X6.${Edge.name}`;\n function isEdge(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Edge) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const edge = instance;\n if ((tag == null || tag === Edge.toStringTag) &&\n typeof edge.isNode === 'function' &&\n typeof edge.isEdge === 'function' &&\n typeof edge.prop === 'function' &&\n typeof edge.attr === 'function' &&\n typeof edge.disconnect === 'function' &&\n typeof edge.getSource === 'function' &&\n typeof edge.getTarget === 'function') {\n return true;\n }\n return false;\n }\n Edge.isEdge = isEdge;\n})(Edge || (Edge = {}));\n(function (Edge) {\n Edge.registry = Registry.create({\n type: 'edge',\n process(shape, options) {\n if (ShareRegistry.exist(shape, false)) {\n throw new Error(`Edge with name '${shape}' was registered by anthor Node`);\n }\n if (typeof options === 'function') {\n options.config({ shape });\n return options;\n }\n let parent = Edge;\n // default inherit from 'dege'\n const { inherit = 'edge' } = options, others = __rest(options, [\"inherit\"]);\n if (typeof inherit === 'string') {\n const base = this.get(inherit || 'edge');\n if (base == null && inherit) {\n this.onNotFound(inherit, 'inherited');\n }\n else {\n parent = base;\n }\n }\n else {\n parent = inherit;\n }\n if (others.constructorName == null) {\n others.constructorName = shape;\n }\n const ctor = parent.define.call(parent, others);\n ctor.config({ shape });\n return ctor;\n },\n });\n ShareRegistry.setEdgeRegistry(Edge.registry);\n})(Edge || (Edge = {}));\n(function (Edge) {\n let counter = 0;\n function getClassName(name) {\n if (name) {\n return StringExt.pascalCase(name);\n }\n counter += 1;\n return `CustomEdge${counter}`;\n }\n function define(config) {\n const { constructorName, overwrite } = config, others = __rest(config, [\"constructorName\", \"overwrite\"]);\n const ctor = ObjectExt.createClass(getClassName(constructorName || others.shape), this);\n ctor.config(others);\n if (others.shape) {\n Edge.registry.register(others.shape, ctor, overwrite);\n }\n return ctor;\n }\n Edge.define = define;\n function create(options) {\n const shape = options.shape || 'edge';\n const Ctor = Edge.registry.get(shape);\n if (Ctor) {\n return new Ctor(options);\n }\n return Edge.registry.onNotFound(shape);\n }\n Edge.create = create;\n})(Edge || (Edge = {}));\n(function (Edge) {\n const shape = 'basic.edge';\n Edge.config({\n shape,\n propHooks(metadata) {\n const { label, vertices } = metadata, others = __rest(metadata, [\"label\", \"vertices\"]);\n if (label) {\n if (others.labels == null) {\n others.labels = [];\n }\n const formated = typeof label === 'string' ? Edge.parseStringLabel(label) : label;\n others.labels.push(formated);\n }\n if (vertices) {\n if (Array.isArray(vertices)) {\n others.vertices = vertices.map((item) => Point.create(item).toJSON());\n }\n }\n return others;\n },\n });\n Edge.registry.register(shape, Edge);\n})(Edge || (Edge = {}));\n//# sourceMappingURL=edge.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Rectangle, Polyline, Point, Angle, Path, Line } from '../geometry';\nimport { StringExt, ObjectExt, NumberExt, FunctionExt, Dom, Vector, } from '../util';\nimport { Router, Connector, NodeAnchor, EdgeAnchor, ConnectionPoint, } from '../registry';\nimport { Edge } from '../model/edge';\nimport { Markup } from './markup';\nimport { CellView } from './cell';\nexport class EdgeView extends CellView {\n constructor() {\n super(...arguments);\n this.POINT_ROUNDING = 2;\n this.markerCache = {};\n // #endregion\n // #endregion\n }\n get [Symbol.toStringTag]() {\n return EdgeView.toStringTag;\n }\n getContainerClassName() {\n return [super.getContainerClassName(), this.prefixClassName('edge')].join(' ');\n }\n get sourceBBox() {\n const sourceView = this.sourceView;\n if (!sourceView) {\n const sourceDef = this.cell.getSource();\n return new Rectangle(sourceDef.x, sourceDef.y);\n }\n const sourceMagnet = this.sourceMagnet;\n if (sourceView.isEdgeElement(sourceMagnet)) {\n return new Rectangle(this.sourceAnchor.x, this.sourceAnchor.y);\n }\n return sourceView.getBBoxOfElement(sourceMagnet || sourceView.container);\n }\n get targetBBox() {\n const targetView = this.targetView;\n if (!targetView) {\n const targetDef = this.cell.getTarget();\n return new Rectangle(targetDef.x, targetDef.y);\n }\n const targetMagnet = this.targetMagnet;\n if (targetView.isEdgeElement(targetMagnet)) {\n return new Rectangle(this.targetAnchor.x, this.targetAnchor.y);\n }\n return targetView.getBBoxOfElement(targetMagnet || targetView.container);\n }\n isEdgeView() {\n return true;\n }\n confirmUpdate(flag, options = {}) {\n let ref = flag;\n if (this.hasAction(ref, 'source')) {\n if (!this.updateTerminalProperties('source')) {\n return ref;\n }\n ref = this.removeAction(ref, 'source');\n }\n if (this.hasAction(ref, 'target')) {\n if (!this.updateTerminalProperties('target')) {\n return ref;\n }\n ref = this.removeAction(ref, 'target');\n }\n const graph = this.graph;\n const sourceView = this.sourceView;\n const targetView = this.targetView;\n if (graph &&\n ((sourceView && !graph.renderer.isViewMounted(sourceView)) ||\n (targetView && !graph.renderer.isViewMounted(targetView)))) {\n // Wait for the sourceView and targetView to be rendered.\n return ref;\n }\n if (this.hasAction(ref, 'render')) {\n this.render();\n ref = this.removeAction(ref, [\n 'render',\n 'update',\n 'vertices',\n 'labels',\n 'tools',\n 'widget',\n ]);\n return ref;\n }\n ref = this.handleAction(ref, 'vertices', () => this.renderVertexMarkers());\n ref = this.handleAction(ref, 'update', () => this.update(null, options));\n ref = this.handleAction(ref, 'labels', () => this.onLabelsChange(options));\n ref = this.handleAction(ref, 'tools', () => {\n this.renderTools();\n this.updateToolsPosition();\n });\n ref = this.handleAction(ref, 'widget', () => this.renderExternalTools());\n return ref;\n }\n onLabelsChange(options = {}) {\n // Note: this optimization works in async=false mode only\n if (this.shouldRerenderLabels(options)) {\n this.renderLabels();\n }\n else {\n this.updateLabels();\n }\n this.updateLabelPositions();\n }\n shouldRerenderLabels(options = {}) {\n const previousLabels = this.cell.previous('labels');\n if (previousLabels == null) {\n return true;\n }\n // Here is an optimization for cases when we know, that change does\n // not require re-rendering of all labels.\n if ('propertyPathArray' in options && 'propertyValue' in options) {\n // The label is setting by `prop()` method\n const pathArray = options.propertyPathArray || [];\n const pathLength = pathArray.length;\n if (pathLength > 1) {\n // We are changing a single label here e.g. 'labels/0/position'\n const index = pathArray[1];\n if (previousLabels[index]) {\n if (pathLength === 2) {\n // We are changing the entire label. Need to check if the\n // markup is also being changed.\n return (typeof options.propertyValue === 'object' &&\n ObjectExt.has(options.propertyValue, 'markup'));\n }\n // We are changing a label property but not the markup\n if (pathArray[2] !== 'markup') {\n return false;\n }\n }\n }\n }\n return true;\n }\n render() {\n this.empty();\n this.containers = {};\n this.renderMarkup();\n this.renderLabels();\n this.update();\n return this;\n }\n renderMarkup() {\n const markup = this.cell.markup;\n if (markup) {\n if (typeof markup === 'string') {\n return this.renderStringMarkup(markup);\n }\n return this.renderJSONMarkup(markup);\n }\n throw new TypeError('Invalid edge markup.');\n }\n renderJSONMarkup(markup) {\n const ret = this.parseJSONMarkup(markup, this.container);\n this.selectors = ret.selectors;\n this.container.append(ret.fragment);\n }\n renderStringMarkup(markup) {\n const cache = this.containers;\n const children = Vector.createVectors(markup);\n // Cache children elements for quicker access.\n children.forEach((child) => {\n const className = child.attr('class');\n if (className) {\n cache[StringExt.camelCase(className)] =\n child.node;\n }\n });\n this.renderTools();\n this.renderVertexMarkers();\n this.renderArrowheadMarkers();\n Dom.append(this.container, children.map((child) => child.node));\n }\n renderLabels() {\n const edge = this.cell;\n const labels = edge.getLabels();\n const count = labels.length;\n let container = this.containers.labels;\n this.labelCache = {};\n this.labelSelectors = {};\n if (count <= 0) {\n if (container && container.parentNode) {\n container.parentNode.removeChild(container);\n }\n return this;\n }\n if (container) {\n this.empty(container);\n }\n else {\n container = Dom.createSvgElement('g');\n this.addClass(this.prefixClassName('edge-labels'), container);\n this.containers.labels = container;\n }\n for (let i = 0, ii = labels.length; i < ii; i += 1) {\n const label = labels[i];\n const normalized = this.normalizeLabelMarkup(this.parseLabelMarkup(label.markup));\n let labelNode;\n let selectors;\n if (normalized) {\n labelNode = normalized.node;\n selectors = normalized.selectors;\n }\n else {\n const defaultLabel = edge.getDefaultLabel();\n const normalized = this.normalizeLabelMarkup(this.parseLabelMarkup(defaultLabel.markup));\n labelNode = normalized.node;\n selectors = normalized.selectors;\n }\n labelNode.setAttribute('data-index', `${i}`);\n container.appendChild(labelNode);\n const rootSelector = this.rootSelector;\n if (selectors[rootSelector]) {\n throw new Error('Ambiguous label root selector.');\n }\n selectors[rootSelector] = labelNode;\n this.labelCache[i] = labelNode;\n this.labelSelectors[i] = selectors;\n }\n if (container.parentNode == null) {\n this.container.appendChild(container);\n }\n this.updateLabels();\n this.customizeLabels();\n return this;\n }\n parseLabelMarkup(markup) {\n if (markup) {\n if (typeof markup === 'string') {\n return this.parseLabelStringMarkup(markup);\n }\n return this.parseJSONMarkup(markup);\n }\n return null;\n }\n parseLabelStringMarkup(labelMarkup) {\n const children = Vector.createVectors(labelMarkup);\n const fragment = document.createDocumentFragment();\n for (let i = 0, n = children.length; i < n; i += 1) {\n const currentChild = children[i].node;\n fragment.appendChild(currentChild);\n }\n return { fragment, selectors: {} };\n }\n normalizeLabelMarkup(markup) {\n if (markup == null) {\n return;\n }\n const fragment = markup.fragment;\n if (!(fragment instanceof DocumentFragment) || !fragment.hasChildNodes()) {\n throw new Error('Invalid label markup.');\n }\n let vel;\n const childNodes = fragment.childNodes;\n if (childNodes.length > 1 || childNodes[0].nodeName.toUpperCase() !== 'G') {\n // default markup fragment is not wrapped in `<g/>`\n // add a `<g/>` container\n vel = Vector.create('g').append(fragment);\n }\n else {\n vel = Vector.create(childNodes[0]);\n }\n vel.addClass(this.prefixClassName('edge-label'));\n return {\n node: vel.node,\n selectors: markup.selectors,\n };\n }\n updateLabels() {\n if (this.containers.labels) {\n const edge = this.cell;\n const labels = edge.labels;\n const canLabelMove = this.can('edgeLabelMovable');\n const defaultLabel = edge.getDefaultLabel();\n for (let i = 0, n = labels.length; i < n; i += 1) {\n const elem = this.labelCache[i];\n const selectors = this.labelSelectors[i];\n elem.setAttribute('cursor', canLabelMove ? 'move' : 'default');\n const label = labels[i];\n const attrs = ObjectExt.merge({}, defaultLabel.attrs, label.attrs);\n this.updateAttrs(elem, attrs, {\n selectors,\n rootBBox: label.size ? Rectangle.fromSize(label.size) : undefined,\n });\n }\n }\n }\n mergeLabelAttrs(hasCustomMarkup, labelAttrs, defaultLabelAttrs) {\n if (labelAttrs === null) {\n return null;\n }\n if (labelAttrs === undefined) {\n if (defaultLabelAttrs === null) {\n return null;\n }\n if (defaultLabelAttrs === undefined) {\n return undefined;\n }\n if (hasCustomMarkup) {\n return defaultLabelAttrs;\n }\n return ObjectExt.merge({}, defaultLabelAttrs);\n }\n if (hasCustomMarkup) {\n return ObjectExt.merge({}, defaultLabelAttrs, labelAttrs);\n }\n }\n customizeLabels() {\n if (this.containers.labels) {\n const edge = this.cell;\n const labels = edge.labels;\n for (let i = 0, n = labels.length; i < n; i += 1) {\n const label = labels[i];\n const container = this.labelCache[i];\n const selectors = this.labelSelectors[i];\n this.graph.hook.onEdgeLabelRendered({\n edge,\n label,\n container,\n selectors,\n });\n }\n }\n }\n renderTools() {\n const container = this.containers.tools;\n if (container == null) {\n return this;\n }\n const markup = this.cell.toolMarkup;\n const $container = this.$(container).empty();\n if (Markup.isStringMarkup(markup)) {\n let template = StringExt.template(markup);\n const tool = Vector.create(template());\n $container.append(tool.node);\n this.toolCache = tool.node;\n // If `doubleTools` is enabled, we render copy of the tools on the\n // other side of the edge as well but only if the edge is longer\n // than `longLength`.\n if (this.options.doubleTools) {\n let tool2;\n const doubleToolMarkup = this.cell.doubleToolMarkup;\n if (Markup.isStringMarkup(doubleToolMarkup)) {\n template = StringExt.template(doubleToolMarkup);\n tool2 = Vector.create(template());\n }\n else {\n tool2 = tool.clone();\n }\n $container.append(tool2.node);\n this.tool2Cache = tool2.node;\n }\n }\n return this;\n }\n renderExternalTools() {\n const tools = this.cell.getTools();\n this.addTools(tools);\n return this;\n }\n renderVertexMarkers() {\n const container = this.containers.vertices;\n if (container == null) {\n return this;\n }\n const markup = this.cell.vertexMarkup;\n const $container = this.$(container).empty();\n if (Markup.isStringMarkup(markup)) {\n const template = StringExt.template(markup);\n this.cell.getVertices().forEach((vertex, index) => {\n $container.append(Vector.create(template(Object.assign({ index }, vertex))).node);\n });\n }\n return this;\n }\n renderArrowheadMarkers() {\n const container = this.containers.arrowheads;\n if (container == null) {\n return this;\n }\n const markup = this.cell.arrowheadMarkup;\n const $container = this.$(container).empty();\n if (Markup.isStringMarkup(markup)) {\n const template = StringExt.template(markup);\n const sourceArrowhead = Vector.create(template({ end: 'source' })).node;\n const targetArrowhead = Vector.create(template({ end: 'target' })).node;\n this.containers.sourceArrowhead = sourceArrowhead;\n this.containers.targetArrowhead = targetArrowhead;\n $container.append(sourceArrowhead, targetArrowhead);\n }\n return this;\n }\n // #endregion\n // #region updating\n update(partialAttrs, options = {}) {\n this.cleanCache();\n this.updateConnection(options);\n const attrs = this.cell.getAttrs();\n if (attrs != null) {\n this.updateAttrs(this.container, attrs, {\n attrs: partialAttrs === attrs ? null : partialAttrs,\n selectors: this.selectors,\n });\n }\n this.updateConnectionPath();\n this.updateLabelPositions();\n this.updateToolsPosition();\n this.updateArrowheadMarkers();\n if (options.toolId == null) {\n this.renderExternalTools();\n }\n else {\n this.updateTools(options);\n }\n return this;\n }\n removeRedundantLinearVertices(options = {}) {\n const edge = this.cell;\n const vertices = edge.getVertices();\n const routePoints = [this.sourceAnchor, ...vertices, this.targetAnchor];\n const rawCount = routePoints.length;\n // Puts the route points into a polyline and try to simplify.\n const polyline = new Polyline(routePoints);\n polyline.simplify({ threshold: 0.01 });\n const simplifiedPoints = polyline.points.map((point) => point.toJSON());\n const simplifiedCount = simplifiedPoints.length;\n // If simplification did not remove any redundant vertices.\n if (rawCount === simplifiedCount) {\n return 0;\n }\n // Sets simplified polyline points as edge vertices.\n // Removes first and last polyline points again (source/target anchors).\n edge.setVertices(simplifiedPoints.slice(1, simplifiedCount - 1), options);\n return rawCount - simplifiedCount;\n }\n updateConnectionPath() {\n const containers = this.containers;\n if (containers.connection) {\n const pathData = this.getConnectionPathData();\n containers.connection.setAttribute('d', pathData);\n }\n if (containers.connectionWrap) {\n const pathData = this.getConnectionPathData();\n containers.connectionWrap.setAttribute('d', pathData);\n }\n if (containers.sourceMarker && containers.targetMarker) {\n this.translateAndAutoOrientArrows(containers.sourceMarker, containers.targetMarker);\n }\n }\n getTerminalView(type) {\n switch (type) {\n case 'source':\n return this.sourceView || null;\n case 'target':\n return this.targetView || null;\n default:\n throw new Error(`Unknown terminal type '${type}'`);\n }\n }\n getTerminalAnchor(type) {\n switch (type) {\n case 'source':\n return Point.create(this.sourceAnchor);\n case 'target':\n return Point.create(this.targetAnchor);\n default:\n throw new Error(`Unknown terminal type '${type}'`);\n }\n }\n getTerminalConnectionPoint(type) {\n switch (type) {\n case 'source':\n return Point.create(this.sourcePoint);\n case 'target':\n return Point.create(this.targetPoint);\n default:\n throw new Error(`Unknown terminal type '${type}'`);\n }\n }\n getTerminalMagnet(type, options = {}) {\n switch (type) {\n case 'source': {\n if (options.raw) {\n return this.sourceMagnet;\n }\n const sourceView = this.sourceView;\n if (!sourceView) {\n return null;\n }\n return this.sourceMagnet || sourceView.container;\n }\n case 'target': {\n if (options.raw) {\n return this.targetMagnet;\n }\n const targetView = this.targetView;\n if (!targetView) {\n return null;\n }\n return this.targetMagnet || targetView.container;\n }\n default: {\n throw new Error(`Unknown terminal type '${type}'`);\n }\n }\n }\n updateConnection(options = {}) {\n const edge = this.cell;\n // The edge is being translated by an ancestor that will shift\n // source, target and vertices by an equal distance.\n if (options.translateBy &&\n edge.isFragmentDescendantOf(options.translateBy)) {\n const tx = options.tx || 0;\n const ty = options.ty || 0;\n this.routePoints = new Polyline(this.routePoints).translate(tx, ty).points;\n this.translateConnectionPoints(tx, ty);\n this.path.translate(tx, ty);\n }\n else {\n const vertices = edge.getVertices();\n // 1. Find anchor points\n const anchors = this.findAnchors(vertices);\n this.sourceAnchor = anchors.source;\n this.targetAnchor = anchors.target;\n // 2. Find route points\n this.routePoints = this.findRoutePoints(vertices);\n // 3. Find connection points\n const connectionPoints = this.findConnectionPoints(this.routePoints, this.sourceAnchor, this.targetAnchor);\n this.sourcePoint = connectionPoints.source;\n this.targetPoint = connectionPoints.target;\n // 4. Find Marker Connection Point\n const markerPoints = this.findMarkerPoints(this.routePoints, this.sourcePoint, this.targetPoint);\n // 5. Make path\n this.path = this.findPath(this.routePoints, markerPoints.source || this.sourcePoint, markerPoints.target || this.targetPoint);\n }\n this.cleanCache();\n }\n findAnchors(vertices) {\n const edge = this.cell;\n const source = edge.source;\n const target = edge.target;\n const firstVertex = vertices[0];\n const lastVertex = vertices[vertices.length - 1];\n if (target.priority && !source.priority) {\n // Reversed order\n return this.findAnchorsOrdered('target', lastVertex, 'source', firstVertex);\n }\n // Usual order\n return this.findAnchorsOrdered('source', firstVertex, 'target', lastVertex);\n }\n findAnchorsOrdered(firstType, firstPoint, secondType, secondPoint) {\n let firstAnchor;\n let secondAnchor;\n const edge = this.cell;\n const firstTerminal = edge[firstType];\n const secondTerminal = edge[secondType];\n const firstView = this.getTerminalView(firstType);\n const secondView = this.getTerminalView(secondType);\n const firstMagnet = this.getTerminalMagnet(firstType);\n const secondMagnet = this.getTerminalMagnet(secondType);\n if (firstView) {\n let firstRef;\n if (firstPoint) {\n firstRef = Point.create(firstPoint);\n }\n else if (secondView) {\n firstRef = secondMagnet;\n }\n else {\n firstRef = Point.create(secondTerminal);\n }\n firstAnchor = this.getAnchor(firstTerminal.anchor, firstView, firstMagnet, firstRef, firstType);\n }\n else {\n firstAnchor = Point.create(firstTerminal);\n }\n if (secondView) {\n const secondRef = Point.create(secondPoint || firstAnchor);\n secondAnchor = this.getAnchor(secondTerminal.anchor, secondView, secondMagnet, secondRef, secondType);\n }\n else {\n secondAnchor = Point.isPointLike(secondTerminal)\n ? Point.create(secondTerminal)\n : new Point();\n }\n return {\n [firstType]: firstAnchor,\n [secondType]: secondAnchor,\n };\n }\n getAnchor(def, cellView, magnet, ref, terminalType) {\n const isEdge = cellView.isEdgeElement(magnet);\n const connecting = this.graph.options.connecting;\n let config = typeof def === 'string' ? { name: def } : def;\n if (!config) {\n const defaults = isEdge\n ? (terminalType === 'source'\n ? connecting.sourceEdgeAnchor\n : connecting.targetEdgeAnchor) || connecting.edgeAnchor\n : (terminalType === 'source'\n ? connecting.sourceAnchor\n : connecting.targetAnchor) || connecting.anchor;\n config = typeof defaults === 'string' ? { name: defaults } : defaults;\n }\n if (!config) {\n throw new Error(`Anchor should be specified.`);\n }\n let anchor;\n const name = config.name;\n if (isEdge) {\n const fn = EdgeAnchor.registry.get(name);\n if (typeof fn !== 'function') {\n return EdgeAnchor.registry.onNotFound(name);\n }\n anchor = FunctionExt.call(fn, this, cellView, magnet, ref, config.args || {}, terminalType);\n }\n else {\n const fn = NodeAnchor.registry.get(name);\n if (typeof fn !== 'function') {\n return NodeAnchor.registry.onNotFound(name);\n }\n anchor = FunctionExt.call(fn, this, cellView, magnet, ref, config.args || {}, terminalType);\n }\n return anchor ? anchor.round(this.POINT_ROUNDING) : new Point();\n }\n findRoutePoints(vertices = []) {\n const defaultRouter = this.graph.options.connecting.router || Router.presets.normal;\n const router = this.cell.getRouter() || defaultRouter;\n let routePoints;\n if (typeof router === 'function') {\n routePoints = FunctionExt.call(router, this, vertices, {}, this);\n }\n else {\n const name = typeof router === 'string' ? router : router.name;\n const args = typeof router === 'string' ? {} : router.args || {};\n const fn = name ? Router.registry.get(name) : Router.presets.normal;\n if (typeof fn !== 'function') {\n return Router.registry.onNotFound(name);\n }\n routePoints = FunctionExt.call(fn, this, vertices, args, this);\n }\n return routePoints == null\n ? vertices.map((p) => Point.create(p))\n : routePoints.map((p) => Point.create(p));\n }\n findConnectionPoints(routePoints, sourceAnchor, targetAnchor) {\n const edge = this.cell;\n const connecting = this.graph.options.connecting;\n const sourceTerminal = edge.getSource();\n const targetTerminal = edge.getTarget();\n const sourceView = this.sourceView;\n const targetView = this.targetView;\n const firstRoutePoint = routePoints[0];\n const lastRoutePoint = routePoints[routePoints.length - 1];\n // source\n let sourcePoint;\n if (sourceView && !sourceView.isEdgeElement(this.sourceMagnet)) {\n const sourceMagnet = this.sourceMagnet || sourceView.container;\n const sourcePointRef = firstRoutePoint || targetAnchor;\n const sourceLine = new Line(sourcePointRef, sourceAnchor);\n const connectionPointDef = sourceTerminal.connectionPoint ||\n connecting.sourceConnectionPoint ||\n connecting.connectionPoint;\n sourcePoint = this.getConnectionPoint(connectionPointDef, sourceView, sourceMagnet, sourceLine, 'source');\n }\n else {\n sourcePoint = sourceAnchor;\n }\n // target\n let targetPoint;\n if (targetView && !targetView.isEdgeElement(this.targetMagnet)) {\n const targetMagnet = this.targetMagnet || targetView.container;\n const targetConnectionPointDef = targetTerminal.connectionPoint ||\n connecting.targetConnectionPoint ||\n connecting.connectionPoint;\n const targetPointRef = lastRoutePoint || sourceAnchor;\n const targetLine = new Line(targetPointRef, targetAnchor);\n targetPoint = this.getConnectionPoint(targetConnectionPointDef, targetView, targetMagnet, targetLine, 'target');\n }\n else {\n targetPoint = targetAnchor;\n }\n return {\n source: sourcePoint,\n target: targetPoint,\n };\n }\n getConnectionPoint(def, view, magnet, line, endType) {\n const anchor = line.end;\n if (def == null) {\n return anchor;\n }\n const name = typeof def === 'string' ? def : def.name;\n const args = typeof def === 'string' ? {} : def.args;\n const fn = ConnectionPoint.registry.get(name);\n if (typeof fn !== 'function') {\n return ConnectionPoint.registry.onNotFound(name);\n }\n const connectionPoint = FunctionExt.call(fn, this, line, view, magnet, args || {}, endType);\n return connectionPoint ? connectionPoint.round(this.POINT_ROUNDING) : anchor;\n }\n updateMarkerAttr(type) {\n const attrs = this.cell.getAttrs();\n const key = `.${type}-marker`;\n const partial = attrs && attrs[key];\n if (partial) {\n this.updateAttrs(this.container, {}, {\n attrs: { [key]: partial },\n selectors: this.selectors,\n });\n }\n }\n findMarkerPoints(routePoints, sourcePoint, targetPoint) {\n const getLineWidth = (type) => {\n const attrs = this.cell.getAttrs();\n const keys = Object.keys(attrs);\n for (let i = 0, l = keys.length; i < l; i += 1) {\n const attr = attrs[keys[i]];\n if (attr[`${type}Marker`] || attr[`${type}-marker`]) {\n const strokeWidth = attr.strokeWidth || attr['stroke-width'];\n if (strokeWidth) {\n return parseFloat(strokeWidth);\n }\n break;\n }\n }\n return null;\n };\n const firstRoutePoint = routePoints[0];\n const lastRoutePoint = routePoints[routePoints.length - 1];\n const sourceMarkerElem = this.containers.sourceMarker;\n const targetMarkerElem = this.containers.targetMarker;\n const cache = this.markerCache;\n let sourceMarkerPoint;\n let targetMarkerPoint;\n // Move the source point by the width of the marker taking into\n // account its scale around x-axis. Note that scale is the only\n // transform that makes sense to be set in `.marker-source`\n // attributes object as all other transforms (translate/rotate)\n // will be replaced by the `translateAndAutoOrient()` function.\n if (sourceMarkerElem) {\n this.updateMarkerAttr('source');\n // support marker connection point registry???\n cache.sourceBBox = cache.sourceBBox || Dom.getBBox(sourceMarkerElem);\n if (cache.sourceBBox.width > 0) {\n const scale = Dom.scale(sourceMarkerElem);\n sourceMarkerPoint = sourcePoint\n .clone()\n .move(firstRoutePoint || targetPoint, cache.sourceBBox.width * scale.sx * -1);\n }\n }\n else {\n const strokeWidth = getLineWidth('source');\n if (strokeWidth) {\n sourceMarkerPoint = sourcePoint\n .clone()\n .move(firstRoutePoint || targetPoint, -strokeWidth);\n }\n }\n if (targetMarkerElem) {\n this.updateMarkerAttr('target');\n cache.targetBBox = cache.targetBBox || Dom.getBBox(targetMarkerElem);\n if (cache.targetBBox.width > 0) {\n const scale = Dom.scale(targetMarkerElem);\n targetMarkerPoint = targetPoint\n .clone()\n .move(lastRoutePoint || sourcePoint, cache.targetBBox.width * scale.sx * -1);\n }\n }\n else {\n const strokeWidth = getLineWidth('target');\n if (strokeWidth) {\n targetMarkerPoint = targetPoint\n .clone()\n .move(lastRoutePoint || sourcePoint, -strokeWidth);\n }\n }\n // If there was no markup for the marker, use the connection point.\n cache.sourcePoint = sourceMarkerPoint || sourcePoint.clone();\n cache.targetPoint = targetMarkerPoint || targetPoint.clone();\n return {\n source: sourceMarkerPoint,\n target: targetMarkerPoint,\n };\n }\n findPath(routePoints, sourcePoint, targetPoint) {\n const def = this.cell.getConnector() || this.graph.options.connecting.connector;\n let name;\n let args;\n let fn;\n if (typeof def === 'string') {\n name = def;\n }\n else {\n name = def.name;\n args = def.args;\n }\n if (name) {\n const method = Connector.registry.get(name);\n if (typeof method !== 'function') {\n return Connector.registry.onNotFound(name);\n }\n fn = method;\n }\n else {\n fn = Connector.presets.normal;\n }\n const path = FunctionExt.call(fn, this, sourcePoint, targetPoint, routePoints, Object.assign(Object.assign({}, args), { raw: true }), this);\n return typeof path === 'string' ? Path.parse(path) : path;\n }\n translateConnectionPoints(tx, ty) {\n const cache = this.markerCache;\n if (cache.sourcePoint) {\n cache.sourcePoint.translate(tx, ty);\n }\n if (cache.targetPoint) {\n cache.targetPoint.translate(tx, ty);\n }\n this.sourcePoint.translate(tx, ty);\n this.targetPoint.translate(tx, ty);\n this.sourceAnchor.translate(tx, ty);\n this.targetAnchor.translate(tx, ty);\n }\n updateLabelPositions() {\n if (this.containers.labels == null) {\n return this;\n }\n const path = this.path;\n if (!path) {\n return this;\n }\n const edge = this.cell;\n const labels = edge.getLabels();\n if (labels.length === 0) {\n return this;\n }\n const defaultLabel = edge.getDefaultLabel();\n const defaultPosition = this.normalizeLabelPosition(defaultLabel.position);\n for (let i = 0, ii = labels.length; i < ii; i += 1) {\n const label = labels[i];\n const labelPosition = this.normalizeLabelPosition(label.position);\n const pos = ObjectExt.merge({}, defaultPosition, labelPosition);\n const matrix = this.getLabelTransformationMatrix(pos);\n this.labelCache[i].setAttribute('transform', Dom.matrixToTransformString(matrix));\n }\n return this;\n }\n updateToolsPosition() {\n if (this.containers.tools == null) {\n return this;\n }\n // Move the tools a bit to the target position but don't cover the\n // `sourceArrowhead` marker. Note that the offset is hardcoded here.\n // The offset should be always more than the\n // `this.$('.marker-arrowhead[end=\"source\"]')[0].bbox().width` but looking\n // this up all the time would be slow.\n let scale = '';\n let offset = this.options.toolsOffset;\n const connectionLength = this.getConnectionLength();\n // Firefox returns `connectionLength=NaN` in odd cases (for bezier curves).\n // In that case we won't update tools position at all.\n if (connectionLength != null) {\n // If the edge is too short, make the tools half the\n // size and the offset twice as low.\n if (connectionLength < this.options.shortLength) {\n scale = 'scale(.5)';\n offset /= 2;\n }\n let pos = this.getPointAtLength(offset);\n if (pos != null) {\n Dom.attr(this.toolCache, 'transform', `translate(${pos.x},${pos.y}) ${scale}`);\n }\n if (this.options.doubleTools &&\n connectionLength >= this.options.longLength) {\n const doubleToolsOffset = this.options.doubleToolsOffset || offset;\n pos = this.getPointAtLength(connectionLength - doubleToolsOffset);\n if (pos != null) {\n Dom.attr(this.tool2Cache, 'transform', `translate(${pos.x},${pos.y}) ${scale}`);\n }\n Dom.attr(this.tool2Cache, 'visibility', 'visible');\n }\n else if (this.options.doubleTools) {\n Dom.attr(this.tool2Cache, 'visibility', 'hidden');\n }\n }\n return this;\n }\n updateArrowheadMarkers() {\n const container = this.containers.arrowheads;\n if (container == null) {\n return this;\n }\n if (container.style.display === 'none') {\n return this;\n }\n const sourceArrowhead = this.containers.sourceArrowhead;\n const targetArrowhead = this.containers.targetArrowhead;\n if (sourceArrowhead && targetArrowhead) {\n const len = this.getConnectionLength() || 0;\n const sx = len < this.options.shortLength ? 0.5 : 1;\n Dom.scale(sourceArrowhead, sx);\n Dom.scale(targetArrowhead, sx);\n this.translateAndAutoOrientArrows(sourceArrowhead, targetArrowhead);\n }\n return this;\n }\n updateTerminalProperties(type) {\n const edge = this.cell;\n const graph = this.graph;\n const terminal = edge[type];\n const nodeId = terminal && terminal.cell;\n const viewKey = `${type}View`;\n // terminal is a point\n if (!nodeId) {\n this[viewKey] = null;\n this.updateTerminalMagnet(type);\n return true;\n }\n const terminalCell = graph.getCellById(nodeId);\n if (!terminalCell) {\n throw new Error(`Edge's ${type} node with id \"${nodeId}\" not exists`);\n }\n const endView = terminalCell.findView(graph);\n if (!endView) {\n return false;\n }\n this[viewKey] = endView;\n this.updateTerminalMagnet(type);\n return true;\n }\n updateTerminalMagnet(type) {\n const propName = `${type}Magnet`;\n const terminalView = this.getTerminalView(type);\n if (terminalView) {\n let magnet = terminalView.getMagnetFromEdgeTerminal(this.cell[type]);\n if (magnet === terminalView.container) {\n magnet = null;\n }\n this[propName] = magnet;\n }\n else {\n this[propName] = null;\n }\n }\n translateAndAutoOrientArrows(sourceArrow, targetArrow) {\n const route = this.routePoints;\n if (sourceArrow) {\n Dom.translateAndAutoOrient(sourceArrow, this.sourcePoint, route[0] || this.targetPoint, this.graph.view.stage);\n }\n if (targetArrow) {\n Dom.translateAndAutoOrient(targetArrow, this.targetPoint, route[route.length - 1] || this.sourcePoint, this.graph.view.stage);\n }\n }\n getLabelPositionAngle(idx) {\n const label = this.cell.getLabelAt(idx);\n if (label && label.position && typeof label.position === 'object') {\n return label.position.angle || 0;\n }\n return 0;\n }\n getLabelPositionArgs(idx) {\n const label = this.cell.getLabelAt(idx);\n if (label && label.position && typeof label.position === 'object') {\n return label.position.options;\n }\n }\n getDefaultLabelPositionArgs() {\n const defaultLabel = this.cell.getDefaultLabel();\n if (defaultLabel &&\n defaultLabel.position &&\n typeof defaultLabel.position === 'object') {\n return defaultLabel.position.options;\n }\n }\n // merge default label position args into label position args\n // keep `undefined` or `null` because `{}` means something else\n mergeLabelPositionArgs(labelPositionArgs, defaultLabelPositionArgs) {\n if (labelPositionArgs === null) {\n return null;\n }\n if (labelPositionArgs === undefined) {\n if (defaultLabelPositionArgs === null) {\n return null;\n }\n return defaultLabelPositionArgs;\n }\n return ObjectExt.merge({}, defaultLabelPositionArgs, labelPositionArgs);\n }\n addLabel(p1, p2, p3, options) {\n let localX;\n let localY;\n let localAngle = 0;\n let localOptions;\n if (typeof p1 !== 'number') {\n localX = p1.x;\n localY = p1.y;\n if (typeof p2 === 'number') {\n localAngle = p2;\n localOptions = p3;\n }\n else {\n localOptions = p2;\n }\n }\n else {\n localX = p1;\n localY = p2;\n if (typeof p3 === 'number') {\n localAngle = p3;\n localOptions = options;\n }\n else {\n localOptions = p3;\n }\n }\n // merge label position arguments\n const defaultLabelPositionArgs = this.getDefaultLabelPositionArgs();\n const labelPositionArgs = localOptions;\n const positionArgs = this.mergeLabelPositionArgs(labelPositionArgs, defaultLabelPositionArgs);\n // append label to labels array\n const label = {\n position: this.getLabelPosition(localX, localY, localAngle, positionArgs),\n };\n const index = -1;\n this.cell.insertLabel(label, index, localOptions);\n return index;\n }\n addVertex(x, y, options) {\n const isPoint = typeof x !== 'number';\n const localX = isPoint ? x.x : x;\n const localY = isPoint ? x.y : y;\n const localOptions = isPoint ? y : options;\n const vertex = { x: localX, y: localY };\n const index = this.getVertexIndex(localX, localY);\n this.cell.insertVertex(vertex, index, localOptions);\n return index;\n }\n sendToken(token, options, callback) {\n let duration;\n let reversed;\n let selector;\n let rorate;\n let timing = 'linear';\n if (typeof options === 'object') {\n duration = options.duration;\n reversed = options.reversed === true;\n selector = options.selector;\n if (options.rotate === false) {\n rorate = '';\n }\n else if (options.rotate === true) {\n rorate = 'auto';\n }\n else if (options.rotate != null) {\n rorate = `${options.rotate}`;\n }\n if (options.timing) {\n timing = options.timing;\n }\n }\n else {\n duration = options;\n reversed = false;\n selector = null;\n }\n duration = duration || 1000;\n const attrs = {\n dur: `${duration}ms`,\n repeatCount: '1',\n calcMode: timing,\n fill: 'freeze',\n };\n if (rorate) {\n attrs.rotate = rorate;\n }\n if (reversed) {\n attrs.keyPoints = '1;0';\n attrs.keyTimes = '0;1';\n }\n if (typeof options === 'object') {\n const { duration, reversed, selector, rotate, timing } = options, others = __rest(options, [\"duration\", \"reversed\", \"selector\", \"rotate\", \"timing\"]);\n Object.keys(others).forEach((key) => {\n attrs[key] = others[key];\n });\n }\n let path;\n if (typeof selector === 'string') {\n path = this.findOne(selector, this.container, this.selectors);\n }\n else {\n // Select connection path automatically.\n path = this.containers.connection\n ? this.containers.connection\n : this.container.querySelector('path');\n }\n if (!(path instanceof SVGPathElement)) {\n throw new Error('Token animation requires a valid connection path.');\n }\n const target = typeof token === 'string' ? this.findOne(token) : token;\n if (target == null) {\n throw new Error('Token animation requires a valid token element.');\n }\n const parent = target.parentNode;\n const revert = () => {\n if (!parent) {\n Dom.remove(target);\n }\n };\n const vToken = Vector.create(target);\n if (!parent) {\n vToken.appendTo(this.graph.view.stage);\n }\n const onComplete = attrs.complete;\n attrs.complete = (e) => {\n revert();\n if (callback) {\n callback();\n }\n if (onComplete) {\n onComplete(e);\n }\n };\n const stop = vToken.animateAlongPath(attrs, path);\n return () => {\n revert();\n stop();\n };\n }\n // #endregion\n getConnection() {\n return this.path != null ? this.path.clone() : null;\n }\n getConnectionPathData() {\n if (this.path == null) {\n return '';\n }\n const cache = this.cache.pathCache;\n if (!ObjectExt.has(cache, 'data')) {\n cache.data = this.path.serialize();\n }\n return cache.data || '';\n }\n getConnectionSubdivisions() {\n if (this.path == null) {\n return null;\n }\n const cache = this.cache.pathCache;\n if (!ObjectExt.has(cache, 'segmentSubdivisions')) {\n cache.segmentSubdivisions = this.path.getSegmentSubdivisions();\n }\n return cache.segmentSubdivisions;\n }\n getConnectionLength() {\n if (this.path == null) {\n return 0;\n }\n const cache = this.cache.pathCache;\n if (!ObjectExt.has(cache, 'length')) {\n cache.length = this.path.length({\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n return cache.length;\n }\n getPointAtLength(length) {\n if (this.path == null) {\n return null;\n }\n return this.path.pointAtLength(length, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getPointAtRatio(ratio) {\n if (this.path == null) {\n return null;\n }\n if (NumberExt.isPercentage(ratio)) {\n // eslint-disable-next-line\n ratio = parseFloat(ratio) / 100;\n }\n return this.path.pointAt(ratio, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getTangentAtLength(length) {\n if (this.path == null) {\n return null;\n }\n return this.path.tangentAtLength(length, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getTangentAtRatio(ratio) {\n if (this.path == null) {\n return null;\n }\n return this.path.tangentAt(ratio, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getClosestPoint(point) {\n if (this.path == null) {\n return null;\n }\n return this.path.closestPoint(point, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getClosestPointLength(point) {\n if (this.path == null) {\n return null;\n }\n return this.path.closestPointLength(point, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getClosestPointRatio(point) {\n if (this.path == null) {\n return null;\n }\n return this.path.closestPointNormalizedLength(point, {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n });\n }\n getLabelPosition(x, y, p3, p4) {\n const pos = { distance: 0 };\n // normalize data from the two possible signatures\n let angle = 0;\n let options;\n if (typeof p3 === 'number') {\n angle = p3;\n options = p4;\n }\n else {\n options = p3;\n }\n if (options != null) {\n pos.options = options;\n }\n // identify distance/offset settings\n const isOffsetAbsolute = options && options.absoluteOffset;\n const isDistanceRelative = !(options && options.absoluteDistance);\n const isDistanceAbsoluteReverse = options && options.absoluteDistance && options.reverseDistance;\n // find closest point t\n const path = this.path;\n const pathOptions = {\n segmentSubdivisions: this.getConnectionSubdivisions(),\n };\n const labelPoint = new Point(x, y);\n const t = path.closestPointT(labelPoint, pathOptions);\n // distance\n const totalLength = this.getConnectionLength() || 0;\n let labelDistance = path.lengthAtT(t, pathOptions);\n if (isDistanceRelative) {\n labelDistance = totalLength > 0 ? labelDistance / totalLength : 0;\n }\n if (isDistanceAbsoluteReverse) {\n // fix for end point (-0 => 1)\n labelDistance = -1 * (totalLength - labelDistance) || 1;\n }\n pos.distance = labelDistance;\n // offset\n // use absolute offset if:\n // - options.absoluteOffset is true,\n // - options.absoluteOffset is not true but there is no tangent\n let tangent;\n if (!isOffsetAbsolute)\n tangent = path.tangentAtT(t);\n let labelOffset;\n if (tangent) {\n labelOffset = tangent.pointOffset(labelPoint);\n }\n else {\n const closestPoint = path.pointAtT(t);\n const labelOffsetDiff = labelPoint.diff(closestPoint);\n labelOffset = { x: labelOffsetDiff.x, y: labelOffsetDiff.y };\n }\n pos.offset = labelOffset;\n pos.angle = angle;\n return pos;\n }\n normalizeLabelPosition(pos) {\n if (typeof pos === 'number') {\n return { distance: pos };\n }\n return pos;\n }\n getLabelTransformationMatrix(labelPosition) {\n const pos = this.normalizeLabelPosition(labelPosition);\n const options = pos.options || {};\n const labelAngle = pos.angle || 0;\n const labelDistance = pos.distance;\n const isDistanceRelative = labelDistance > 0 && labelDistance <= 1;\n let labelOffset = 0;\n const offsetCoord = { x: 0, y: 0 };\n const offset = pos.offset;\n if (offset) {\n if (typeof offset === 'number') {\n labelOffset = offset;\n }\n else {\n if (offset.x != null) {\n offsetCoord.x = offset.x;\n }\n if (offset.y != null) {\n offsetCoord.y = offset.y;\n }\n }\n }\n const isOffsetAbsolute = offsetCoord.x !== 0 || offsetCoord.y !== 0 || labelOffset === 0;\n const isKeepGradient = options.keepGradient;\n const isEnsureLegibility = options.ensureLegibility;\n const path = this.path;\n const pathOpt = { segmentSubdivisions: this.getConnectionSubdivisions() };\n const distance = isDistanceRelative\n ? labelDistance * this.getConnectionLength()\n : labelDistance;\n const tangent = path.tangentAtLength(distance, pathOpt);\n let translation;\n let angle = labelAngle;\n if (tangent) {\n if (isOffsetAbsolute) {\n translation = tangent.start;\n translation.translate(offsetCoord);\n }\n else {\n const normal = tangent.clone();\n normal.rotate(-90, tangent.start);\n normal.setLength(labelOffset);\n translation = normal.end;\n }\n if (isKeepGradient) {\n angle = tangent.angle() + labelAngle;\n if (isEnsureLegibility) {\n angle = Angle.normalize(((angle + 90) % 180) - 90);\n }\n }\n }\n else {\n // fallback - the connection has zero length\n translation = path.start;\n if (isOffsetAbsolute) {\n translation.translate(offsetCoord);\n }\n }\n return Dom.createSVGMatrix()\n .translate(translation.x, translation.y)\n .rotate(angle);\n }\n getLabelCoordinates(pos) {\n const matrix = this.getLabelTransformationMatrix(pos);\n return new Point(matrix.e, matrix.f);\n }\n getVertexIndex(x, y) {\n const edge = this.cell;\n const vertices = edge.getVertices();\n const vertexLength = this.getClosestPointLength(new Point(x, y));\n let index = 0;\n if (vertexLength != null) {\n for (const ii = vertices.length; index < ii; index += 1) {\n const currentVertex = vertices[index];\n const currentLength = this.getClosestPointLength(currentVertex);\n if (currentLength != null && vertexLength < currentLength) {\n break;\n }\n }\n }\n return index;\n }\n getEventArgs(e, x, y) {\n const view = this; // eslint-disable-line\n const edge = view.cell;\n const cell = edge;\n if (x == null || y == null) {\n return { e, view, edge, cell };\n }\n return { e, x, y, view, edge, cell };\n }\n notifyUnhandledMouseDown(e, x, y) {\n this.notify('edge:unhandled:mousedown', {\n e,\n x,\n y,\n view: this,\n cell: this.cell,\n edge: this.cell,\n });\n }\n notifyMouseDown(e, x, y) {\n super.onMouseDown(e, x, y);\n this.notify('edge:mousedown', this.getEventArgs(e, x, y));\n }\n notifyMouseMove(e, x, y) {\n super.onMouseMove(e, x, y);\n this.notify('edge:mousemove', this.getEventArgs(e, x, y));\n }\n notifyMouseUp(e, x, y) {\n super.onMouseUp(e, x, y);\n this.notify('edge:mouseup', this.getEventArgs(e, x, y));\n }\n onClick(e, x, y) {\n super.onClick(e, x, y);\n this.notify('edge:click', this.getEventArgs(e, x, y));\n }\n onDblClick(e, x, y) {\n super.onDblClick(e, x, y);\n this.notify('edge:dblclick', this.getEventArgs(e, x, y));\n }\n onContextMenu(e, x, y) {\n super.onContextMenu(e, x, y);\n this.notify('edge:contextmenu', this.getEventArgs(e, x, y));\n }\n onMouseDown(e, x, y) {\n this.notifyMouseDown(e, x, y);\n const className = e.target.getAttribute('class');\n switch (className) {\n case 'vertex': {\n this.startVertexDragging(e, x, y);\n return;\n }\n case 'vertex-remove':\n case 'vertex-remove-area': {\n this.handleVertexRemoving(e, x, y);\n return;\n }\n case 'connection':\n case 'connection-wrap': {\n this.handleVertexAdding(e, x, y);\n return;\n }\n case 'arrowhead': {\n this.startArrowheadDragging(e, x, y);\n return;\n }\n case 'source-marker':\n case 'target-marker': {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n default:\n break;\n }\n this.startEdgeDragging(e, x, y);\n }\n onMouseMove(e, x, y) {\n const data = this.getEventData(e);\n switch (data.action) {\n case 'drag-vertex': {\n this.dragVertex(e, x, y);\n break;\n }\n case 'drag-label': {\n this.dragLabel(e, x, y);\n break;\n }\n case 'drag-arrowhead': {\n this.dragArrowhead(e, x, y);\n break;\n }\n case 'drag-edge': {\n this.dragEdge(e, x, y);\n break;\n }\n default:\n break;\n }\n this.notifyMouseMove(e, x, y);\n return data;\n }\n onMouseUp(e, x, y) {\n const data = this.getEventData(e);\n switch (data.action) {\n case 'drag-vertex': {\n this.stopVertexDragging(e, x, y);\n break;\n }\n case 'drag-label': {\n this.stopLabelDragging(e, x, y);\n break;\n }\n case 'drag-arrowhead': {\n this.stopArrowheadDragging(e, x, y);\n break;\n }\n case 'drag-edge': {\n this.stopEdgeDragging(e, x, y);\n break;\n }\n default:\n break;\n }\n this.notifyMouseUp(e, x, y);\n this.checkMouseleave(e);\n return data;\n }\n onMouseOver(e) {\n super.onMouseOver(e);\n this.notify('edge:mouseover', this.getEventArgs(e));\n }\n onMouseOut(e) {\n super.onMouseOut(e);\n this.notify('edge:mouseout', this.getEventArgs(e));\n }\n onMouseEnter(e) {\n super.onMouseEnter(e);\n this.notify('edge:mouseenter', this.getEventArgs(e));\n }\n onMouseLeave(e) {\n super.onMouseLeave(e);\n this.notify('edge:mouseleave', this.getEventArgs(e));\n }\n onMouseWheel(e, x, y, delta) {\n super.onMouseWheel(e, x, y, delta);\n this.notify('edge:mousewheel', Object.assign({ delta }, this.getEventArgs(e, x, y)));\n }\n onCustomEvent(e, name, x, y) {\n // For default edge tool\n const tool = Dom.findParentByClass(e.target, 'edge-tool', this.container);\n if (tool) {\n e.stopPropagation(); // no further action to be executed\n if (this.can('useEdgeTools')) {\n if (name === 'edge:remove') {\n this.cell.remove({ ui: true });\n return;\n }\n this.notify('edge:customevent', Object.assign({ name }, this.getEventArgs(e, x, y)));\n }\n this.notifyMouseDown(e, x, y);\n }\n else {\n this.notify('edge:customevent', Object.assign({ name }, this.getEventArgs(e, x, y)));\n super.onCustomEvent(e, name, x, y);\n }\n }\n onLabelMouseDown(e, x, y) {\n this.notifyMouseDown(e, x, y);\n this.startLabelDragging(e, x, y);\n const stopPropagation = this.getEventData(e).stopPropagation;\n if (stopPropagation) {\n e.stopPropagation();\n }\n }\n // #region drag edge\n startEdgeDragging(e, x, y) {\n if (!this.can('edgeMovable')) {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n this.setEventData(e, {\n x,\n y,\n moving: false,\n action: 'drag-edge',\n });\n }\n dragEdge(e, x, y) {\n const data = this.getEventData(e);\n if (!data.moving) {\n data.moving = true;\n this.addClass('edge-moving');\n this.notify('edge:move', {\n e,\n x,\n y,\n view: this,\n cell: this.cell,\n edge: this.cell,\n });\n }\n this.cell.translate(x - data.x, y - data.y, { ui: true });\n this.setEventData(e, { x, y });\n this.notify('edge:moving', {\n e,\n x,\n y,\n view: this,\n cell: this.cell,\n edge: this.cell,\n });\n }\n stopEdgeDragging(e, x, y) {\n const data = this.getEventData(e);\n if (data.moving) {\n this.removeClass('edge-moving');\n this.notify('edge:moved', {\n e,\n x,\n y,\n view: this,\n cell: this.cell,\n edge: this.cell,\n });\n }\n data.moving = false;\n }\n // #endregion\n // #region drag arrowhead\n prepareArrowheadDragging(type, options) {\n const magnet = this.getTerminalMagnet(type);\n const data = {\n action: 'drag-arrowhead',\n x: options.x,\n y: options.y,\n isNewEdge: options.isNewEdge === true,\n terminalType: type,\n initialMagnet: magnet,\n initialTerminal: ObjectExt.clone(this.cell[type]),\n fallbackAction: options.fallbackAction || 'revert',\n getValidateConnectionArgs: this.createValidateConnectionArgs(type),\n options: options.options,\n };\n this.beforeArrowheadDragging(data);\n return data;\n }\n createValidateConnectionArgs(type) {\n const args = [];\n args[4] = type;\n args[5] = this;\n let opposite;\n let i = 0;\n let j = 0;\n if (type === 'source') {\n i = 2;\n opposite = 'target';\n }\n else {\n j = 2;\n opposite = 'source';\n }\n const terminal = this.cell[opposite];\n const cellId = terminal.cell;\n if (cellId) {\n let magnet;\n const view = (args[i] = this.graph.renderer.findViewByCell(cellId));\n if (view) {\n magnet = view.getMagnetFromEdgeTerminal(terminal);\n if (magnet === view.container) {\n magnet = undefined;\n }\n }\n args[i + 1] = magnet;\n }\n return (cellView, magnet) => {\n args[j] = cellView;\n args[j + 1] = cellView.container === magnet ? undefined : magnet;\n return args;\n };\n }\n beforeArrowheadDragging(data) {\n data.zIndex = this.cell.zIndex;\n this.cell.toFront();\n const style = this.container.style;\n data.pointerEvents = style.pointerEvents;\n style.pointerEvents = 'none';\n if (this.graph.options.connecting.highlight) {\n this.highlightAvailableMagnets(data);\n }\n }\n afterArrowheadDragging(data) {\n if (data.zIndex != null) {\n this.cell.setZIndex(data.zIndex, { ui: true });\n data.zIndex = null;\n }\n const container = this.container;\n container.style.pointerEvents = data.pointerEvents || '';\n if (this.graph.options.connecting.highlight) {\n this.unhighlightAvailableMagnets(data);\n }\n }\n arrowheadDragging(target, x, y, data) {\n data.x = x;\n data.y = y;\n // Checking views right under the pointer\n if (data.currentTarget !== target) {\n // Unhighlight the previous view under pointer if there was one.\n if (data.currentMagnet && data.currentView) {\n data.currentView.unhighlight(data.currentMagnet, {\n type: 'magnetAdsorbed',\n });\n }\n data.currentView = this.graph.renderer.findViewByElem(target);\n if (data.currentView) {\n // If we found a view that is under the pointer, we need to find\n // the closest magnet based on the real target element of the event.\n data.currentMagnet = data.currentView.findMagnet(target);\n if (data.currentMagnet &&\n this.graph.hook.validateConnection(...data.getValidateConnectionArgs(data.currentView, data.currentMagnet), data.currentView.getEdgeTerminal(data.currentMagnet, x, y, this.cell, data.terminalType))) {\n data.currentView.highlight(data.currentMagnet, {\n type: 'magnetAdsorbed',\n });\n }\n else {\n // This type of connection is not valid. Disregard this magnet.\n data.currentMagnet = null;\n }\n }\n else {\n // Make sure we'll unset previous magnet.\n data.currentMagnet = null;\n }\n }\n data.currentTarget = target;\n this.cell.prop(data.terminalType, { x, y }, Object.assign(Object.assign({}, data.options), { ui: true }));\n }\n arrowheadDragged(data, x, y) {\n const view = data.currentView;\n const magnet = data.currentMagnet;\n if (!magnet || !view) {\n return;\n }\n view.unhighlight(magnet, { type: 'magnetAdsorbed' });\n const type = data.terminalType;\n const terminal = view.getEdgeTerminal(magnet, x, y, this.cell, type);\n this.cell.setTerminal(type, terminal, { ui: true });\n }\n snapArrowhead(x, y, data) {\n const graph = this.graph;\n const snap = graph.options.connecting.snap;\n const radius = (typeof snap === 'object' && snap.radius) || 50;\n const views = graph.renderer.findViewsInArea({\n x: x - radius,\n y: y - radius,\n width: 2 * radius,\n height: 2 * radius,\n });\n const prevView = data.closestView || null;\n const prevMagnet = data.closestMagnet || null;\n data.closestView = null;\n data.closestMagnet = null;\n let distance;\n let minDistance = Number.MAX_SAFE_INTEGER;\n const pos = new Point(x, y);\n views.forEach((view) => {\n if (view.container.getAttribute('magnet') !== 'false') {\n // Find distance from the center of the cell to pointer coordinates\n distance = view.cell.getBBox().getCenter().distance(pos);\n // the connection is looked up in a circle area by `distance < r`\n if (distance < radius && distance < minDistance) {\n if (prevMagnet === view.container ||\n graph.hook.validateConnection(...data.getValidateConnectionArgs(view, null), view.getEdgeTerminal(view.container, x, y, this.cell, data.terminalType))) {\n minDistance = distance;\n data.closestView = view;\n data.closestMagnet = view.container;\n }\n }\n }\n view.container.querySelectorAll('[magnet]').forEach((magnet) => {\n if (magnet.getAttribute('magnet') !== 'false') {\n const bbox = view.getBBoxOfElement(magnet);\n distance = pos.distance(bbox.getCenter());\n if (distance < radius && distance < minDistance) {\n if (prevMagnet === magnet ||\n graph.hook.validateConnection(...data.getValidateConnectionArgs(view, magnet), view.getEdgeTerminal(magnet, x, y, this.cell, data.terminalType))) {\n minDistance = distance;\n data.closestView = view;\n data.closestMagnet = magnet;\n }\n }\n }\n });\n });\n let terminal;\n const type = data.terminalType;\n const closestView = data.closestView;\n const closestMagnet = data.closestMagnet;\n const changed = prevMagnet !== closestMagnet;\n if (prevView && changed) {\n prevView.unhighlight(prevMagnet, {\n type: 'magnetAdsorbed',\n });\n }\n if (closestView) {\n if (!changed) {\n return;\n }\n closestView.highlight(closestMagnet, {\n type: 'magnetAdsorbed',\n });\n terminal = closestView.getEdgeTerminal(closestMagnet, x, y, this.cell, type);\n }\n else {\n terminal = { x, y };\n }\n this.cell.setTerminal(type, terminal, {}, Object.assign(Object.assign({}, data.options), { ui: true }));\n }\n snapArrowheadEnd(data) {\n // Finish off link snapping.\n // Everything except view unhighlighting was already done on pointermove.\n const closestView = data.closestView;\n const closestMagnet = data.closestMagnet;\n if (closestView && closestMagnet) {\n closestView.unhighlight(closestMagnet, {\n type: 'magnetAdsorbed',\n });\n data.currentMagnet = closestView.findMagnet(closestMagnet);\n }\n data.closestView = null;\n data.closestMagnet = null;\n }\n finishEmbedding(data) {\n // Resets parent of the edge if embedding is enabled\n if (this.graph.options.embedding.enabled && this.cell.updateParent()) {\n // Make sure we don't reverse to the original 'z' index\n data.zIndex = null;\n }\n }\n fallbackConnection(data) {\n switch (data.fallbackAction) {\n case 'remove':\n this.cell.remove({ ui: true });\n break;\n case 'revert':\n default:\n this.cell.prop(data.terminalType, data.initialTerminal, {\n ui: true,\n });\n break;\n }\n }\n notifyConnectionEvent(data, e) {\n const terminalType = data.terminalType;\n const initialTerminal = data.initialTerminal;\n const currentTerminal = this.cell[terminalType];\n const changed = currentTerminal && !Edge.equalTerminals(initialTerminal, currentTerminal);\n if (changed) {\n const graph = this.graph;\n const previous = initialTerminal;\n const previousCell = previous.cell\n ? graph.getCellById(previous.cell)\n : null;\n const previousPort = previous.port;\n const previousView = previousCell\n ? graph.findViewByCell(previousCell)\n : null;\n const previousPoint = previousCell || data.isNewEdge\n ? null\n : Point.create(initialTerminal).toJSON();\n const current = currentTerminal;\n const currentCell = current.cell ? graph.getCellById(current.cell) : null;\n const currentPort = current.port;\n const currentView = currentCell ? graph.findViewByCell(currentCell) : null;\n const currentPoint = currentCell\n ? null\n : Point.create(currentTerminal).toJSON();\n this.notify('edge:connected', {\n e,\n previousCell,\n previousPort,\n previousView,\n previousPoint,\n currentCell,\n currentView,\n currentPort,\n currentPoint,\n previousMagnet: data.initialMagnet,\n currentMagnet: data.currentMagnet,\n edge: this.cell,\n view: this,\n type: terminalType,\n isNew: data.isNewEdge,\n });\n }\n }\n highlightAvailableMagnets(data) {\n const graph = this.graph;\n const cells = graph.model.getCells();\n data.marked = {};\n for (let i = 0, ii = cells.length; i < ii; i += 1) {\n const view = graph.renderer.findViewByCell(cells[i]);\n if (!view) {\n continue;\n }\n const magnets = Array.prototype.slice.call(view.container.querySelectorAll('[magnet]'));\n if (view.container.getAttribute('magnet') !== 'false') {\n magnets.push(view.container);\n }\n const availableMagnets = magnets.filter((magnet) => graph.hook.validateConnection(...data.getValidateConnectionArgs(view, magnet), view.getEdgeTerminal(magnet, data.x, data.y, this.cell, data.terminalType)));\n if (availableMagnets.length > 0) {\n // highlight all available magnets\n for (let j = 0, jj = availableMagnets.length; j < jj; j += 1) {\n view.highlight(availableMagnets[j], { type: 'magnetAvailable' });\n }\n // highlight the entire view\n view.highlight(null, { type: 'nodeAvailable' });\n data.marked[view.cell.id] = availableMagnets;\n }\n }\n }\n unhighlightAvailableMagnets(data) {\n const marked = data.marked || {};\n Object.keys(marked).forEach((id) => {\n const view = this.graph.renderer.findViewByCell(id);\n if (view) {\n const magnets = marked[id];\n magnets.forEach((magnet) => {\n view.unhighlight(magnet, { type: 'magnetAvailable' });\n });\n view.unhighlight(null, { type: 'nodeAvailable' });\n }\n });\n data.marked = null;\n }\n startArrowheadDragging(e, x, y) {\n if (!this.can('arrowheadMovable')) {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n const elem = e.target;\n const type = elem.getAttribute('data-terminal');\n const data = this.prepareArrowheadDragging(type, { x, y });\n this.setEventData(e, data);\n }\n dragArrowhead(e, x, y) {\n const data = this.getEventData(e);\n if (this.graph.options.connecting.snap) {\n this.snapArrowhead(x, y, data);\n }\n else {\n this.arrowheadDragging(this.getEventTarget(e), x, y, data);\n }\n }\n stopArrowheadDragging(e, x, y) {\n const graph = this.graph;\n const data = this.getEventData(e);\n if (graph.options.connecting.snap) {\n this.snapArrowheadEnd(data);\n }\n else {\n this.arrowheadDragged(data, x, y);\n }\n const valid = graph.hook.validateEdge(this.cell, data.terminalType, data.initialTerminal);\n if (valid) {\n this.finishEmbedding(data);\n this.notifyConnectionEvent(data, e);\n }\n else {\n // If the changed edge is not allowed, revert to its previous state.\n this.fallbackConnection(data);\n }\n this.afterArrowheadDragging(data);\n }\n // #endregion\n // #region drag lable\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n startLabelDragging(e, x, y) {\n if (this.can('edgeLabelMovable')) {\n const target = e.currentTarget;\n const index = parseInt(target.getAttribute('data-index'), 10);\n const positionAngle = this.getLabelPositionAngle(index);\n const labelPositionArgs = this.getLabelPositionArgs(index);\n const defaultLabelPositionArgs = this.getDefaultLabelPositionArgs();\n const positionArgs = this.mergeLabelPositionArgs(labelPositionArgs, defaultLabelPositionArgs);\n this.setEventData(e, {\n index,\n positionAngle,\n positionArgs,\n stopPropagation: true,\n action: 'drag-label',\n });\n }\n else {\n // If labels can't be dragged no default action is triggered.\n this.setEventData(e, { stopPropagation: true });\n }\n this.graph.view.delegateDragEvents(e, this);\n }\n dragLabel(e, x, y) {\n const data = this.getEventData(e);\n const originLabel = this.cell.getLabelAt(data.index);\n const label = ObjectExt.merge({}, originLabel, {\n position: this.getLabelPosition(x, y, data.positionAngle, data.positionArgs),\n });\n this.cell.setLabelAt(data.index, label);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stopLabelDragging(e, x, y) { }\n // #endregion\n // #region drag vertex\n handleVertexAdding(e, x, y) {\n if (!this.can('vertexAddable')) {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n // Store the index at which the new vertex has just been placed.\n // We'll be update the very same vertex position in `pointermove()`.\n const index = this.addVertex({ x, y }, { ui: true });\n this.setEventData(e, {\n index,\n action: 'drag-vertex',\n });\n }\n handleVertexRemoving(e, x, y) {\n if (!this.can('vertexDeletable')) {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n const target = e.target;\n const index = parseInt(target.getAttribute('idx'), 10);\n this.cell.removeVertexAt(index);\n }\n startVertexDragging(e, x, y) {\n if (!this.can('vertexMovable')) {\n this.notifyUnhandledMouseDown(e, x, y);\n return;\n }\n const target = e.target;\n const index = parseInt(target.getAttribute('idx'), 10);\n this.setEventData(e, {\n index,\n action: 'drag-vertex',\n });\n }\n dragVertex(e, x, y) {\n const data = this.getEventData(e);\n this.cell.setVertexAt(data.index, { x, y }, { ui: true });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stopVertexDragging(e, x, y) { }\n}\n(function (EdgeView) {\n EdgeView.toStringTag = `X6.${EdgeView.name}`;\n function isEdgeView(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof EdgeView) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const view = instance;\n if ((tag == null || tag === EdgeView.toStringTag) &&\n typeof view.isNodeView === 'function' &&\n typeof view.isEdgeView === 'function' &&\n typeof view.confirmUpdate === 'function' &&\n typeof view.update === 'function' &&\n typeof view.getConnection === 'function') {\n return true;\n }\n return false;\n }\n EdgeView.isEdgeView = isEdgeView;\n})(EdgeView || (EdgeView = {}));\nEdgeView.config({\n isSvgElement: true,\n priority: 1,\n bootstrap: ['render', 'source', 'target'],\n actions: {\n view: ['render'],\n markup: ['render'],\n attrs: ['update'],\n source: ['source', 'update'],\n target: ['target', 'update'],\n router: ['update'],\n connector: ['update'],\n labels: ['labels'],\n defaultLabel: ['labels'],\n vertices: ['vertices', 'update'],\n vertexMarkup: ['vertices'],\n toolMarkup: ['tools'],\n tools: ['widget'],\n },\n shortLength: 105,\n longLength: 155,\n toolsOffset: 40,\n doubleTools: false,\n doubleToolsOffset: 65,\n sampleInterval: 50,\n});\nEdgeView.registry.register('edge', EdgeView, true);\n//# sourceMappingURL=edge.js.map","import { Util, Config } from '../global';\nimport { ArrayExt, FunctionExt, Dom, Vector } from '../util';\nimport { Rectangle, Point } from '../geometry';\nimport { Cell } from '../model/cell';\nimport { CellView } from './cell';\nimport { Markup } from './markup';\nexport class NodeView extends CellView {\n constructor() {\n super(...arguments);\n this.scalableNode = null;\n this.rotatableNode = null;\n this.scalableSelector = 'scalable';\n this.rotatableSelector = 'rotatable';\n this.defaultPortMarkup = Markup.getPortMarkup();\n this.defaultPortLabelMarkup = Markup.getPortLabelMarkup();\n this.defaultPortContainerMarkup = Markup.getPortContainerMarkup();\n this.portsCache = {};\n // #endregion\n }\n get [Symbol.toStringTag]() {\n return NodeView.toStringTag;\n }\n getContainerClassName() {\n const classList = [\n super.getContainerClassName(),\n this.prefixClassName('node'),\n ];\n if (!this.can('nodeMovable')) {\n classList.push(this.prefixClassName('node-immovable'));\n }\n return classList.join(' ');\n }\n updateClassName(e) {\n const target = e.target;\n if (target.hasAttribute('magnet')) {\n // port\n const className = this.prefixClassName('port-unconnectable');\n if (this.can('magnetConnectable')) {\n Dom.removeClass(target, className);\n }\n else {\n Dom.addClass(target, className);\n }\n }\n else {\n // node\n const className = this.prefixClassName('node-immovable');\n if (this.can('nodeMovable')) {\n this.removeClass(className);\n }\n else {\n this.addClass(className);\n }\n }\n }\n isNodeView() {\n return true;\n }\n confirmUpdate(flag, options = {}) {\n let ret = flag;\n if (this.hasAction(ret, 'ports')) {\n this.removePorts();\n this.cleanPortsCache();\n }\n if (this.hasAction(ret, 'render')) {\n this.render();\n ret = this.removeAction(ret, [\n 'render',\n 'update',\n 'resize',\n 'translate',\n 'rotate',\n 'ports',\n 'tools',\n ]);\n }\n else {\n ret = this.handleAction(ret, 'resize', () => this.resize(options), 'update');\n ret = this.handleAction(ret, 'update', () => this.update(), \n // `update()` will render ports when useCSSSelectors are enabled\n Config.useCSSSelector ? 'ports' : null);\n ret = this.handleAction(ret, 'translate', () => this.translate());\n ret = this.handleAction(ret, 'rotate', () => this.rotate());\n ret = this.handleAction(ret, 'ports', () => this.renderPorts());\n ret = this.handleAction(ret, 'tools', () => this.renderTools());\n }\n return ret;\n }\n update(partialAttrs) {\n this.cleanCache();\n // When CSS selector strings are used, make sure no rule matches port nodes.\n if (Config.useCSSSelector) {\n this.removePorts();\n }\n const node = this.cell;\n const size = node.getSize();\n const attrs = node.getAttrs();\n this.updateAttrs(this.container, attrs, {\n attrs: partialAttrs === attrs ? null : partialAttrs,\n rootBBox: new Rectangle(0, 0, size.width, size.height),\n selectors: this.selectors,\n scalableNode: this.scalableNode,\n rotatableNode: this.rotatableNode,\n });\n if (Config.useCSSSelector) {\n this.renderPorts();\n }\n }\n renderMarkup() {\n const markup = this.cell.markup;\n if (markup) {\n if (typeof markup === 'string') {\n return this.renderStringMarkup(markup);\n }\n return this.renderJSONMarkup(markup);\n }\n throw new TypeError('Invalid node markup.');\n }\n renderJSONMarkup(markup) {\n const ret = this.parseJSONMarkup(markup, this.container);\n const one = (elems) => Array.isArray(elems) ? elems[0] : elems;\n this.selectors = ret.selectors;\n this.rotatableNode = one(this.selectors[this.rotatableSelector]);\n this.scalableNode = one(this.selectors[this.scalableSelector]);\n this.container.appendChild(ret.fragment);\n }\n renderStringMarkup(markup) {\n Dom.append(this.container, Vector.toNodes(Vector.createVectors(markup)));\n this.rotatableNode = Dom.findOne(this.container, `.${this.rotatableSelector}`);\n this.scalableNode = Dom.findOne(this.container, `.${this.scalableSelector}`);\n this.selectors = {};\n if (this.rootSelector) {\n this.selectors[this.rootSelector] = this.container;\n }\n }\n render() {\n this.empty();\n this.renderMarkup();\n if (this.scalableNode) {\n // Double update is necessary for elements with the scalable group only\n // Note the `resize()` triggers the other `update`.\n this.update();\n }\n this.resize();\n if (this.rotatableNode) {\n this.rotate();\n this.translate();\n }\n else {\n this.updateTransform();\n }\n if (!Config.useCSSSelector) {\n this.renderPorts();\n }\n this.renderTools();\n return this;\n }\n resize(opt = {}) {\n if (this.scalableNode) {\n return this.updateSize(opt);\n }\n if (this.cell.getAngle()) {\n this.rotate();\n }\n this.update();\n }\n translate() {\n if (this.rotatableNode) {\n return this.updateTranslation();\n }\n this.updateTransform();\n }\n rotate() {\n if (this.rotatableNode) {\n this.updateRotation();\n // It's necessary to call the update for the nodes outside\n // the rotatable group referencing nodes inside the group\n this.update();\n return;\n }\n this.updateTransform();\n }\n getTranslationString() {\n const position = this.cell.getPosition();\n return `translate(${position.x},${position.y})`;\n }\n getRotationString() {\n const angle = this.cell.getAngle();\n if (angle) {\n const size = this.cell.getSize();\n return `rotate(${angle},${size.width / 2},${size.height / 2})`;\n }\n }\n updateTransform() {\n let transform = this.getTranslationString();\n const rot = this.getRotationString();\n if (rot) {\n transform += ` ${rot}`;\n }\n this.container.setAttribute('transform', transform);\n }\n updateRotation() {\n if (this.rotatableNode != null) {\n const transform = this.getRotationString();\n if (transform != null) {\n this.rotatableNode.setAttribute('transform', transform);\n }\n else {\n this.rotatableNode.removeAttribute('transform');\n }\n }\n }\n updateTranslation() {\n this.container.setAttribute('transform', this.getTranslationString());\n }\n updateSize(opt = {}) {\n const cell = this.cell;\n const size = cell.getSize();\n const angle = cell.getAngle();\n const scalableNode = this.scalableNode;\n // Getting scalable group's bbox.\n // Due to a bug in webkit's native SVG .getBBox implementation, the\n // bbox of groups with path children includes the paths' control points.\n // To work around the issue, we need to check whether there are any path\n // elements inside the scalable group.\n let recursive = false;\n if (scalableNode.getElementsByTagName('path').length > 0) {\n // If scalable has at least one descendant that is a path, we need\n // toswitch to recursive bbox calculation. Otherwise, group bbox\n // calculation works and so we can use the (faster) native function.\n recursive = true;\n }\n const scalableBBox = Dom.getBBox(scalableNode, { recursive });\n // Make sure `scalableBbox.width` and `scalableBbox.height` are not zero\n // which can happen if the element does not have any content.\n const sx = size.width / (scalableBBox.width || 1);\n const sy = size.height / (scalableBBox.height || 1);\n scalableNode.setAttribute('transform', `scale(${sx},${sy})`);\n // Now the interesting part. The goal is to be able to store the object geometry via just `x`, `y`, `angle`, `width` and `height`\n // Order of transformations is significant but we want to reconstruct the object always in the order:\n // resize(), rotate(), translate() no matter of how the object was transformed. For that to work,\n // we must adjust the `x` and `y` coordinates of the object whenever we resize it (because the origin of the\n // rotation changes). The new `x` and `y` coordinates are computed by canceling the previous rotation\n // around the center of the resized object (which is a different origin then the origin of the previous rotation)\n // and getting the top-left corner of the resulting object. Then we clean up the rotation back to what it originally was.\n // Cancel the rotation but now around a different origin, which is the center of the scaled object.\n const rotatableNode = this.rotatableNode;\n if (rotatableNode != null) {\n const transform = rotatableNode.getAttribute('transform');\n if (transform) {\n rotatableNode.setAttribute('transform', `${transform} rotate(${-angle},${size.width / 2},${size.height / 2})`);\n const rotatableBBox = Dom.getBBox(scalableNode, {\n target: this.graph.view.stage,\n });\n // Store new x, y and perform rotate() again against the new rotation origin.\n cell.prop('position', { x: rotatableBBox.x, y: rotatableBBox.y }, Object.assign({ updated: true }, opt));\n this.translate();\n this.rotate();\n }\n }\n // Update must always be called on non-rotated element. Otherwise,\n // relative positioning would work with wrong (rotated) bounding boxes.\n this.update();\n }\n // #region ports\n findPortElem(portId, selector) {\n const cache = portId ? this.portsCache[portId] : null;\n if (!cache) {\n return null;\n }\n const portRoot = cache.portContentElement;\n const portSelectors = cache.portContentSelectors || {};\n return this.findOne(selector, portRoot, portSelectors);\n }\n initializePorts() {\n this.cleanPortsCache();\n }\n refreshPorts() {\n this.removePorts();\n this.cleanPortsCache();\n this.renderPorts();\n }\n cleanPortsCache() {\n this.portsCache = {};\n }\n removePorts() {\n Object.keys(this.portsCache).forEach((portId) => {\n const cached = this.portsCache[portId];\n Dom.remove(cached.portElement);\n });\n }\n renderPorts() {\n const container = this.getPortsContainer();\n // References to rendered elements without z-index\n const references = [];\n container.childNodes.forEach((child) => {\n references.push(child);\n });\n const portsGropsByZ = ArrayExt.groupBy(this.cell.getParsedPorts(), 'zIndex');\n const autoZIndexKey = 'auto';\n // render non-z first\n if (portsGropsByZ[autoZIndexKey]) {\n portsGropsByZ[autoZIndexKey].forEach((port) => {\n const portElement = this.getPortElement(port);\n container.append(portElement);\n references.push(portElement);\n });\n }\n Object.keys(portsGropsByZ).forEach((key) => {\n if (key !== autoZIndexKey) {\n const zIndex = parseInt(key, 10);\n this.appendPorts(portsGropsByZ[key], zIndex, references);\n }\n });\n this.updatePorts();\n }\n getPortsContainer() {\n return this.rotatableNode || this.container;\n }\n appendPorts(ports, zIndex, refs) {\n const elems = ports.map((p) => this.getPortElement(p));\n if (refs[zIndex] || zIndex < 0) {\n Dom.before(refs[Math.max(zIndex, 0)], elems);\n }\n else {\n Dom.append(this.getPortsContainer(), elems);\n }\n }\n getPortElement(port) {\n const cached = this.portsCache[port.id];\n if (cached) {\n return cached.portElement;\n }\n return this.createPortElement(port);\n }\n createPortElement(port) {\n let renderResult = Markup.renderMarkup(this.getPortContainerMarkup());\n const portElement = renderResult.elem;\n if (portElement == null) {\n throw new Error('Invalid port container markup.');\n }\n renderResult = Markup.renderMarkup(this.getPortMarkup(port));\n const portContentElement = renderResult.elem;\n const portContentSelectors = renderResult.selectors;\n if (portContentElement == null) {\n throw new Error('Invalid port markup.');\n }\n this.setAttrs({\n port: port.id,\n 'port-group': port.group,\n }, portContentElement);\n renderResult = Markup.renderMarkup(this.getPortLabelMarkup(port.label));\n const portLabelElement = renderResult.elem;\n const portLabelSelectors = renderResult.selectors;\n if (portLabelElement == null) {\n throw new Error('Invalid port label markup.');\n }\n let portSelectors;\n if (portContentSelectors && portLabelSelectors) {\n // eslint-disable-next-line\n for (const key in portLabelSelectors) {\n if (portContentSelectors[key] && key !== this.rootSelector) {\n throw new Error('Selectors within port must be unique.');\n }\n }\n portSelectors = Object.assign(Object.assign({}, portContentSelectors), portLabelSelectors);\n }\n else {\n portSelectors = portContentSelectors || portLabelSelectors;\n }\n Dom.addClass(portElement, 'x6-port');\n Dom.addClass(portContentElement, 'x6-port-body');\n Dom.addClass(portLabelElement, 'x6-port-label');\n portElement.appendChild(portContentElement);\n portElement.appendChild(portLabelElement);\n this.portsCache[port.id] = {\n portElement,\n portSelectors,\n portLabelElement,\n portLabelSelectors,\n portContentElement,\n portContentSelectors,\n };\n this.graph.hook.onPortRendered({\n port,\n node: this.cell,\n container: portElement,\n selectors: portSelectors,\n labelContainer: portLabelElement,\n labelSelectors: portLabelSelectors,\n contentContainer: portContentElement,\n contentSelectors: portContentSelectors,\n });\n return portElement;\n }\n updatePorts() {\n // Layout ports without group\n this.updatePortGroup();\n // Layout ports with explicit group\n const groups = this.cell.getParsedGroups();\n Object.keys(groups).forEach((groupName) => this.updatePortGroup(groupName));\n }\n updatePortGroup(groupName) {\n const bbox = Rectangle.fromSize(this.cell.getSize());\n const metrics = this.cell.getPortsLayoutByGroup(groupName, bbox);\n for (let i = 0, n = metrics.length; i < n; i += 1) {\n const metric = metrics[i];\n const portId = metric.portId;\n const cached = this.portsCache[portId] || {};\n const portLayout = metric.portLayout;\n this.applyPortTransform(cached.portElement, portLayout);\n if (metric.portAttrs != null) {\n const options = {\n selectors: cached.portSelectors || {},\n };\n if (metric.portSize) {\n options.rootBBox = Rectangle.fromSize(metric.portSize);\n }\n this.updateAttrs(cached.portElement, metric.portAttrs, options);\n }\n const labelLayout = metric.labelLayout;\n if (labelLayout) {\n this.applyPortTransform(cached.portLabelElement, labelLayout, -(portLayout.angle || 0));\n if (labelLayout.attrs) {\n const options = {\n selectors: cached.portLabelSelectors || {},\n };\n if (metric.labelSize) {\n options.rootBBox = Rectangle.fromSize(metric.labelSize);\n }\n this.updateAttrs(cached.portLabelElement, labelLayout.attrs, options);\n }\n }\n }\n }\n applyPortTransform(element, layout, initialAngle = 0) {\n const angle = layout.angle;\n const position = layout.position;\n const matrix = Dom.createSVGMatrix()\n .rotate(initialAngle)\n .translate(position.x || 0, position.y || 0)\n .rotate(angle || 0);\n Dom.transform(element, matrix, { absolute: true });\n }\n getPortContainerMarkup() {\n return this.cell.getPortContainerMarkup() || this.defaultPortContainerMarkup;\n }\n getPortMarkup(port) {\n return port.markup || this.cell.portMarkup || this.defaultPortMarkup;\n }\n getPortLabelMarkup(label) {\n return (label.markup || this.cell.portLabelMarkup || this.defaultPortLabelMarkup);\n }\n getEventArgs(e, x, y) {\n const view = this; // eslint-disable-line\n const node = view.cell;\n const cell = node;\n if (x == null || y == null) {\n return { e, view, node, cell };\n }\n return { e, x, y, view, node, cell };\n }\n notifyMouseDown(e, x, y) {\n super.onMouseDown(e, x, y);\n this.notify('node:mousedown', this.getEventArgs(e, x, y));\n }\n notifyMouseMove(e, x, y) {\n super.onMouseMove(e, x, y);\n this.notify('node:mousemove', this.getEventArgs(e, x, y));\n }\n notifyMouseUp(e, x, y) {\n super.onMouseUp(e, x, y);\n this.notify('node:mouseup', this.getEventArgs(e, x, y));\n }\n onClick(e, x, y) {\n super.onClick(e, x, y);\n this.notify('node:click', this.getEventArgs(e, x, y));\n }\n onDblClick(e, x, y) {\n super.onDblClick(e, x, y);\n this.notify('node:dblclick', this.getEventArgs(e, x, y));\n }\n onContextMenu(e, x, y) {\n super.onContextMenu(e, x, y);\n this.notify('node:contextmenu', this.getEventArgs(e, x, y));\n }\n onMouseDown(e, x, y) {\n if (this.isPropagationStopped(e)) {\n return;\n }\n this.notifyMouseDown(e, x, y);\n this.startNodeDragging(e, x, y);\n }\n onMouseMove(e, x, y) {\n const data = this.getEventData(e);\n const action = data.action;\n if (action === 'magnet') {\n this.dragMagnet(e, x, y);\n }\n else {\n if (action === 'move') {\n const meta = data;\n const view = meta.targetView || this;\n view.dragNode(e, x, y);\n view.notify('node:moving', {\n e,\n x,\n y,\n view,\n cell: view.cell,\n node: view.cell,\n });\n }\n this.notifyMouseMove(e, x, y);\n }\n this.setEventData(e, data);\n }\n onMouseUp(e, x, y) {\n const data = this.getEventData(e);\n const action = data.action;\n if (action === 'magnet') {\n this.stopMagnetDragging(e, x, y);\n }\n else {\n this.notifyMouseUp(e, x, y);\n if (action === 'move') {\n const meta = data;\n const view = meta.targetView || this;\n view.stopNodeDragging(e, x, y);\n }\n }\n const magnet = data.targetMagnet;\n if (magnet) {\n this.onMagnetClick(e, magnet, x, y);\n }\n this.checkMouseleave(e);\n }\n onMouseOver(e) {\n super.onMouseOver(e);\n this.notify('node:mouseover', this.getEventArgs(e));\n }\n onMouseOut(e) {\n super.onMouseOut(e);\n this.notify('node:mouseout', this.getEventArgs(e));\n }\n onMouseEnter(e) {\n this.updateClassName(e);\n super.onMouseEnter(e);\n this.notify('node:mouseenter', this.getEventArgs(e));\n }\n onMouseLeave(e) {\n super.onMouseLeave(e);\n this.notify('node:mouseleave', this.getEventArgs(e));\n }\n onMouseWheel(e, x, y, delta) {\n super.onMouseWheel(e, x, y, delta);\n this.notify('node:mousewheel', Object.assign({ delta }, this.getEventArgs(e, x, y)));\n }\n onMagnetClick(e, magnet, x, y) {\n const count = this.graph.view.getMouseMovedCount(e);\n if (count > this.graph.options.clickThreshold) {\n return;\n }\n this.notify('node:magnet:click', Object.assign({ magnet }, this.getEventArgs(e, x, y)));\n }\n onMagnetDblClick(e, magnet, x, y) {\n this.notify('node:magnet:dblclick', Object.assign({ magnet }, this.getEventArgs(e, x, y)));\n }\n onMagnetContextMenu(e, magnet, x, y) {\n this.notify('node:magnet:contextmenu', Object.assign({ magnet }, this.getEventArgs(e, x, y)));\n }\n onMagnetMouseDown(e, magnet, x, y) {\n this.startMagnetDragging(e, x, y);\n }\n onCustomEvent(e, name, x, y) {\n this.notify('node:customevent', Object.assign({ name }, this.getEventArgs(e, x, y)));\n super.onCustomEvent(e, name, x, y);\n }\n prepareEmbedding(e) {\n // const cell = data.cell || this.cell\n // const graph = data.graph || this.graph\n // const model = graph.model\n // model.startBatch('to-front')\n // // Bring the model to the front with all his embeds.\n // cell.toFront({ deep: true, ui: true })\n // const maxZ = model\n // .getNodes()\n // .reduce((max, cell) => Math.max(max, cell.getZIndex() || 0), 0)\n // const connectedEdges = model.getConnectedEdges(cell, {\n // deep: true,\n // enclosed: true,\n // })\n // connectedEdges.forEach((edge) => {\n // const zIndex = edge.getZIndex() || 0\n // if (zIndex <= maxZ) {\n // edge.setZIndex(maxZ + 1, { ui: true })\n // }\n // })\n // model.stopBatch('to-front')\n // Before we start looking for suitable parent we remove the current one.\n // const parent = cell.getParent()\n // if (parent) {\n // parent.unembed(cell, { ui: true })\n // }\n const data = this.getEventData(e);\n const node = data.cell || this.cell;\n const view = this.graph.findViewByCell(node);\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n this.notify('node:embed', {\n e,\n node,\n view,\n cell: node,\n x: localPoint.x,\n y: localPoint.y,\n currentParent: node.getParent(),\n });\n }\n processEmbedding(e, data) {\n const cell = data.cell || this.cell;\n const graph = data.graph || this.graph;\n const options = graph.options.embedding;\n const findParent = options.findParent;\n let candidates = typeof findParent === 'function'\n ? FunctionExt.call(findParent, graph, {\n view: this,\n node: this.cell,\n }).filter((c) => {\n return (Cell.isCell(c) &&\n this.cell.id !== c.id &&\n !c.isDescendantOf(this.cell));\n })\n : graph.model.getNodesUnderNode(cell, {\n by: findParent,\n });\n // Picks the node with the highest `z` index\n if (options.frontOnly) {\n candidates = candidates.slice(-1);\n }\n let newCandidateView = null;\n const prevCandidateView = data.candidateEmbedView;\n const validateEmbeding = options.validate;\n for (let i = candidates.length - 1; i >= 0; i -= 1) {\n const candidate = candidates[i];\n if (prevCandidateView && prevCandidateView.cell.id === candidate.id) {\n // candidate remains the same\n newCandidateView = prevCandidateView;\n break;\n }\n else {\n const view = candidate.findView(graph);\n if (FunctionExt.call(validateEmbeding, graph, {\n child: this.cell,\n parent: view.cell,\n childView: this,\n parentView: view,\n })) {\n // flip to the new candidate\n newCandidateView = view;\n break;\n }\n }\n }\n this.clearEmbedding(data);\n if (newCandidateView) {\n newCandidateView.highlight(null, { type: 'embedding' });\n }\n data.candidateEmbedView = newCandidateView;\n const localPoint = graph.snapToGrid(e.clientX, e.clientY);\n this.notify('node:embedding', {\n e,\n cell,\n node: cell,\n view: graph.findViewByCell(cell),\n x: localPoint.x,\n y: localPoint.y,\n currentParent: cell.getParent(),\n candidateParent: newCandidateView ? newCandidateView.cell : null,\n });\n }\n clearEmbedding(data) {\n const candidateView = data.candidateEmbedView;\n if (candidateView) {\n candidateView.unhighlight(null, { type: 'embedding' });\n data.candidateEmbedView = null;\n }\n }\n finalizeEmbedding(e, data) {\n const cell = data.cell || this.cell;\n const graph = data.graph || this.graph;\n const view = graph.findViewByCell(cell);\n const parent = cell.getParent();\n const candidateView = data.candidateEmbedView;\n if (candidateView) {\n // Candidate view is chosen to become the parent of the node.\n candidateView.unhighlight(null, { type: 'embedding' });\n data.candidateEmbedView = null;\n if (parent == null || parent.id !== candidateView.cell.id) {\n candidateView.cell.insertChild(cell, undefined, { ui: true });\n }\n }\n else if (parent) {\n parent.unembed(cell, { ui: true });\n }\n graph.model.getConnectedEdges(cell, { deep: true }).forEach((edge) => {\n edge.updateParent({ ui: true });\n });\n const localPoint = graph.snapToGrid(e.clientX, e.clientY);\n if (view) {\n view.notify('node:embedded', {\n e,\n cell,\n x: localPoint.x,\n y: localPoint.y,\n node: cell,\n view: graph.findViewByCell(cell),\n previousParent: parent,\n currentParent: cell.getParent(),\n });\n }\n }\n getDelegatedView() {\n let cell = this.cell;\n let view = this; // eslint-disable-line\n while (view) {\n if (cell.isEdge()) {\n break;\n }\n if (!cell.hasParent() || view.can('stopDelegateOnDragging')) {\n return view;\n }\n cell = cell.getParent();\n view = this.graph.renderer.findViewByCell(cell);\n }\n return null;\n }\n startMagnetDragging(e, x, y) {\n if (!this.can('magnetConnectable')) {\n return;\n }\n e.stopPropagation();\n const magnet = e.currentTarget;\n const graph = this.graph;\n this.setEventData(e, {\n targetMagnet: magnet,\n });\n if (graph.hook.validateMagnet(this, magnet, e)) {\n if (graph.options.magnetThreshold <= 0) {\n this.startConnectting(e, magnet, x, y);\n }\n this.setEventData(e, {\n action: 'magnet',\n });\n this.stopPropagation(e);\n }\n else {\n this.onMouseDown(e, x, y);\n }\n graph.view.delegateDragEvents(e, this);\n }\n startConnectting(e, magnet, x, y) {\n this.graph.model.startBatch('add-edge');\n const edgeView = this.createEdgeFromMagnet(magnet, x, y);\n edgeView.notifyMouseDown(e, x, y); // backwards compatibility events\n edgeView.setEventData(e, edgeView.prepareArrowheadDragging('target', {\n x,\n y,\n isNewEdge: true,\n fallbackAction: 'remove',\n }));\n this.setEventData(e, { edgeView });\n }\n createEdgeFromMagnet(magnet, x, y) {\n const graph = this.graph;\n const model = graph.model;\n const edge = graph.hook.getDefaultEdge(this, magnet);\n edge.setSource(Object.assign(Object.assign({}, edge.getSource()), this.getEdgeTerminal(magnet, x, y, edge, 'source')));\n edge.setTarget(Object.assign(Object.assign({}, edge.getTarget()), { x, y }));\n edge.addTo(model, { async: false, ui: true });\n return edge.findView(graph);\n }\n dragMagnet(e, x, y) {\n const data = this.getEventData(e);\n const edgeView = data.edgeView;\n if (edgeView) {\n edgeView.onMouseMove(e, x, y);\n this.autoScrollGraph(e.clientX, e.clientY);\n }\n else {\n const graph = this.graph;\n const magnetThreshold = graph.options.magnetThreshold;\n const currentTarget = this.getEventTarget(e);\n const targetMagnet = data.targetMagnet;\n // magnetThreshold when the pointer leaves the magnet\n if (magnetThreshold === 'onleave') {\n if (targetMagnet === currentTarget ||\n targetMagnet.contains(currentTarget)) {\n return;\n }\n // eslint-disable-next-line no-lonely-if\n }\n else {\n // magnetThreshold defined as a number of movements\n if (graph.view.getMouseMovedCount(e) <= magnetThreshold) {\n return;\n }\n }\n this.startConnectting(e, targetMagnet, x, y);\n }\n }\n stopMagnetDragging(e, x, y) {\n const data = this.eventData(e);\n const edgeView = data.edgeView;\n if (edgeView) {\n edgeView.onMouseUp(e, x, y);\n this.graph.model.stopBatch('add-edge');\n }\n }\n notifyUnhandledMouseDown(e, x, y) {\n this.notify('node:unhandled:mousedown', {\n e,\n x,\n y,\n view: this,\n cell: this.cell,\n node: this.cell,\n });\n }\n notifyNodeMove(name, e, x, y, cell) {\n let cells = [cell];\n const selection = this.graph.selection.widget;\n if (selection && selection.options.movable) {\n const selectedCells = this.graph.getSelectedCells();\n if (selectedCells.includes(cell)) {\n cells = selectedCells.filter((c) => c.isNode());\n }\n }\n cells.forEach((c) => {\n this.notify(name, {\n e,\n x,\n y,\n cell: c,\n node: c,\n view: c.findView(this.graph),\n });\n });\n }\n startNodeDragging(e, x, y) {\n const targetView = this.getDelegatedView();\n if (targetView == null || !targetView.can('nodeMovable')) {\n return this.notifyUnhandledMouseDown(e, x, y);\n }\n this.setEventData(e, {\n targetView,\n action: 'move',\n });\n const position = Point.create(targetView.cell.getPosition());\n targetView.setEventData(e, {\n moving: false,\n offset: position.diff(x, y),\n restrict: this.graph.hook.getRestrictArea(targetView),\n });\n }\n dragNode(e, x, y) {\n const node = this.cell;\n const graph = this.graph;\n const gridSize = graph.getGridSize();\n const data = this.getEventData(e);\n const offset = data.offset;\n const restrict = data.restrict;\n if (!data.moving) {\n data.moving = true;\n this.addClass('node-moving');\n this.notifyNodeMove('node:move', e, x, y, this.cell);\n }\n this.autoScrollGraph(e.clientX, e.clientY);\n const posX = Util.snapToGrid(x + offset.x, gridSize);\n const posY = Util.snapToGrid(y + offset.y, gridSize);\n node.setPosition(posX, posY, {\n restrict,\n deep: true,\n ui: true,\n });\n if (graph.options.embedding.enabled) {\n if (!data.embedding) {\n this.prepareEmbedding(e);\n data.embedding = true;\n }\n this.processEmbedding(e, data);\n }\n }\n stopNodeDragging(e, x, y) {\n const data = this.getEventData(e);\n if (data.embedding) {\n this.finalizeEmbedding(e, data);\n }\n if (data.moving) {\n this.removeClass('node-moving');\n this.notifyNodeMove('node:moved', e, x, y, this.cell);\n }\n data.moving = false;\n data.embedding = false;\n }\n autoScrollGraph(x, y) {\n const scroller = this.graph.scroller.widget;\n if (scroller) {\n scroller.autoScroll(x, y);\n }\n }\n}\n(function (NodeView) {\n NodeView.toStringTag = `X6.${NodeView.name}`;\n function isNodeView(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof NodeView) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const view = instance;\n if ((tag == null || tag === NodeView.toStringTag) &&\n typeof view.isNodeView === 'function' &&\n typeof view.isEdgeView === 'function' &&\n typeof view.confirmUpdate === 'function' &&\n typeof view.update === 'function' &&\n typeof view.findPortElem === 'function' &&\n typeof view.resize === 'function' &&\n typeof view.rotate === 'function' &&\n typeof view.translate === 'function') {\n return true;\n }\n return false;\n }\n NodeView.isNodeView = isNodeView;\n})(NodeView || (NodeView = {}));\nNodeView.config({\n isSvgElement: true,\n priority: 0,\n bootstrap: ['render'],\n actions: {\n view: ['render'],\n markup: ['render'],\n attrs: ['update'],\n size: ['resize', 'ports', 'tools'],\n angle: ['rotate', 'tools'],\n position: ['translate', 'tools'],\n ports: ['ports'],\n tools: ['tools'],\n },\n});\nNodeView.registry.register('node', NodeView, true);\n//# sourceMappingURL=node.js.map","import { NodeView } from '../../view';\nimport { getName, createShape } from './util';\nconst viewName = getName('text');\nexport class Text extends createShape('text', {\n view: viewName,\n attrs: {\n text: {\n fontSize: 18,\n fill: '#000000',\n stroke: null,\n refX: 0.5,\n refY: 0.5,\n },\n },\n}, { noText: true }) {\n}\n(function (Text) {\n class View extends NodeView {\n confirmUpdate(flag, options = {}) {\n let ret = super.confirmUpdate(flag, options);\n if (this.hasAction(ret, 'scale')) {\n this.resize();\n ret = this.removeAction(ret, 'scale');\n }\n return ret;\n }\n }\n Text.View = View;\n View.config({\n actions: {\n attrs: ['scale'],\n },\n });\n NodeView.registry.register(viewName, View);\n})(Text || (Text = {}));\n//# sourceMappingURL=text.js.map","import { ArrayExt } from '../util';\nimport { Basecoat } from '../common';\nexport class Collection extends Basecoat {\n constructor(cells, options = {}) {\n super();\n this.length = 0;\n this.comparator = options.comparator || 'zIndex';\n this.clean();\n if (cells) {\n this.reset(cells, { silent: true });\n }\n }\n toJSON() {\n return this.cells.map((cell) => cell.toJSON());\n }\n add(cells, index, options) {\n let localIndex;\n let localOptions;\n if (typeof index === 'number') {\n localIndex = index;\n localOptions = Object.assign({ merge: false }, options);\n }\n else {\n localIndex = this.length;\n localOptions = Object.assign({ merge: false }, index);\n }\n if (localIndex > this.length) {\n localIndex = this.length;\n }\n if (localIndex < 0) {\n localIndex += this.length + 1;\n }\n const entities = Array.isArray(cells) ? cells : [cells];\n const sortable = this.comparator &&\n typeof index !== 'number' &&\n localOptions.sort !== false;\n const sortAttr = this.comparator || null;\n let sort = false;\n const added = [];\n const merged = [];\n entities.forEach((cell) => {\n const existing = this.get(cell);\n if (existing) {\n if (localOptions.merge && !cell.isSameStore(existing)) {\n existing.setProp(cell.getProp(), options); // merge\n merged.push(existing);\n if (sortable && !sort) {\n if (sortAttr == null || typeof sortAttr === 'function') {\n sort = existing.hasChanged();\n }\n else if (typeof sortAttr === 'string') {\n sort = existing.hasChanged(sortAttr);\n }\n else {\n sort = sortAttr.some((key) => existing.hasChanged(key));\n }\n }\n }\n }\n else {\n added.push(cell);\n this.reference(cell);\n }\n });\n if (added.length) {\n if (sortable) {\n sort = true;\n }\n this.cells.splice(localIndex, 0, ...added);\n this.length = this.cells.length;\n }\n if (sort) {\n this.sort({ silent: true });\n }\n if (!localOptions.silent) {\n added.forEach((cell, i) => {\n const args = {\n cell,\n index: localIndex + i,\n options: localOptions,\n };\n this.trigger('added', args);\n if (!localOptions.dryrun) {\n cell.notify('added', Object.assign({}, args));\n }\n });\n if (sort) {\n this.trigger('sorted');\n }\n if (added.length || merged.length) {\n this.trigger('updated', {\n added,\n merged,\n removed: [],\n options: localOptions,\n });\n }\n }\n return this;\n }\n remove(cells, options = {}) {\n const arr = Array.isArray(cells) ? cells : [cells];\n const removed = this.removeCells(arr, options);\n if (!options.silent && removed.length > 0) {\n this.trigger('updated', {\n options,\n removed,\n added: [],\n merged: [],\n });\n }\n return Array.isArray(cells) ? removed : removed[0];\n }\n removeCells(cells, options) {\n const removed = [];\n for (let i = 0; i < cells.length; i += 1) {\n const cell = this.get(cells[i]);\n if (cell == null) {\n continue;\n }\n const index = this.cells.indexOf(cell);\n this.cells.splice(index, 1);\n this.length -= 1;\n delete this.map[cell.id];\n removed.push(cell);\n this.unreference(cell);\n if (!options.dryrun) {\n cell.remove();\n }\n if (!options.silent) {\n this.trigger('removed', { cell, index, options });\n if (!options.dryrun) {\n cell.notify('removed', { cell, index, options });\n }\n }\n }\n return removed;\n }\n reset(cells, options = {}) {\n const previous = this.cells.slice();\n previous.forEach((cell) => this.unreference(cell));\n this.clean();\n this.add(cells, Object.assign({ silent: true }, options));\n if (!options.silent) {\n const current = this.cells.slice();\n this.trigger('reseted', {\n options,\n previous,\n current,\n });\n const added = [];\n const removed = [];\n current.forEach((a) => {\n const exist = previous.some((b) => b.id === a.id);\n if (!exist) {\n added.push(a);\n }\n });\n previous.forEach((a) => {\n const exist = current.some((b) => b.id === a.id);\n if (!exist) {\n removed.push(a);\n }\n });\n this.trigger('updated', { options, added, removed, merged: [] });\n }\n return this;\n }\n push(cell, options) {\n return this.add(cell, this.length, options);\n }\n pop(options) {\n const cell = this.at(this.length - 1);\n return this.remove(cell, options);\n }\n unshift(cell, options) {\n return this.add(cell, 0, options);\n }\n shift(options) {\n const cell = this.at(0);\n return this.remove(cell, options);\n }\n get(cell) {\n if (cell == null) {\n return null;\n }\n const id = typeof cell === 'string' || typeof cell === 'number' ? cell : cell.id;\n return this.map[id] || null;\n }\n has(cell) {\n return this.get(cell) != null;\n }\n at(index) {\n if (index < 0) {\n index += this.length; // eslint-disable-line\n }\n return this.cells[index] || null;\n }\n first() {\n return this.at(0);\n }\n last() {\n return this.at(-1);\n }\n indexOf(cell) {\n return this.cells.indexOf(cell);\n }\n toArray() {\n return this.cells.slice();\n }\n sort(options = {}) {\n if (this.comparator != null) {\n this.cells = ArrayExt.sortBy(this.cells, this.comparator);\n if (!options.silent) {\n this.trigger('sorted');\n }\n }\n return this;\n }\n clone() {\n const constructor = this.constructor;\n return new constructor(this.cells.slice(), {\n comparator: this.comparator,\n });\n }\n reference(cell) {\n this.map[cell.id] = cell;\n cell.on('*', this.notifyCellEvent, this);\n }\n unreference(cell) {\n cell.off('*', this.notifyCellEvent, this);\n delete this.map[cell.id];\n }\n notifyCellEvent(name, args) {\n const cell = args.cell;\n this.trigger(`cell:${name}`, args);\n if (cell) {\n if (cell.isNode()) {\n this.trigger(`node:${name}`, Object.assign(Object.assign({}, args), { node: cell }));\n }\n else if (cell.isEdge()) {\n this.trigger(`edge:${name}`, Object.assign(Object.assign({}, args), { edge: cell }));\n }\n }\n }\n clean() {\n this.length = 0;\n this.cells = [];\n this.map = {};\n }\n}\n//# sourceMappingURL=collection.js.map","import { FunctionExt } from '../util';\nimport { Basecoat, Dijkstra } from '../common';\nimport { Rectangle } from '../geometry';\nimport { Cell } from './cell';\nimport { Edge } from './edge';\nimport { Node } from './node';\nimport { Collection } from './collection';\nexport class Model extends Basecoat {\n constructor(cells = []) {\n super();\n this.batches = {};\n this.addings = new WeakMap();\n this.nodes = {};\n this.edges = {};\n this.outgoings = {};\n this.incomings = {};\n this.collection = new Collection(cells);\n this.setup();\n }\n get [Symbol.toStringTag]() {\n return Model.toStringTag;\n }\n notify(name, args) {\n this.trigger(name, args);\n const graph = this.graph;\n if (graph) {\n if (name === 'sorted' || name === 'reseted' || name === 'updated') {\n graph.trigger(`model:${name}`, args);\n }\n else {\n graph.trigger(name, args);\n }\n }\n return this;\n }\n setup() {\n const collection = this.collection;\n collection.on('sorted', () => this.notify('sorted', null));\n collection.on('updated', (args) => this.notify('updated', args));\n collection.on('cell:change:zIndex', () => this.sortOnChangeZ());\n collection.on('added', ({ cell }) => {\n this.onCellAdded(cell);\n });\n collection.on('removed', (args) => {\n const cell = args.cell;\n this.onCellRemoved(cell, args.options);\n // Should trigger remove-event manually after cell was removed.\n this.notify('cell:removed', args);\n if (cell.isNode()) {\n this.notify('node:removed', Object.assign(Object.assign({}, args), { node: cell }));\n }\n else if (cell.isEdge()) {\n this.notify('edge:removed', Object.assign(Object.assign({}, args), { edge: cell }));\n }\n });\n collection.on('reseted', (args) => {\n this.onReset(args.current);\n this.notify('reseted', args);\n });\n collection.on('edge:change:source', ({ edge }) => this.onEdgeTerminalChanged(edge, 'source'));\n collection.on('edge:change:target', ({ edge }) => {\n this.onEdgeTerminalChanged(edge, 'target');\n });\n }\n sortOnChangeZ() {\n this.collection.sort();\n }\n onCellAdded(cell) {\n const cellId = cell.id;\n if (cell.isEdge()) {\n // Auto update edge's parent\n cell.updateParent();\n this.edges[cellId] = true;\n this.onEdgeTerminalChanged(cell, 'source');\n this.onEdgeTerminalChanged(cell, 'target');\n }\n else {\n this.nodes[cellId] = true;\n }\n }\n onCellRemoved(cell, options) {\n const cellId = cell.id;\n if (cell.isEdge()) {\n delete this.edges[cellId];\n const source = cell.getSource();\n const target = cell.getTarget();\n if (source && source.cell) {\n const cache = this.outgoings[source.cell];\n const index = cache ? cache.indexOf(cellId) : -1;\n if (index >= 0) {\n cache.splice(index, 1);\n if (cache.length === 0) {\n delete this.outgoings[source.cell];\n }\n }\n }\n if (target && target.cell) {\n const cache = this.incomings[target.cell];\n const index = cache ? cache.indexOf(cellId) : -1;\n if (index >= 0) {\n cache.splice(index, 1);\n if (cache.length === 0) {\n delete this.incomings[target.cell];\n }\n }\n }\n }\n else {\n delete this.nodes[cellId];\n }\n if (!options.clear) {\n if (options.disconnectEdges) {\n this.disconnectConnectedEdges(cell, options);\n }\n else {\n this.removeConnectedEdges(cell, options);\n }\n }\n if (cell.model === this) {\n cell.model = null;\n }\n }\n onReset(cells) {\n this.nodes = {};\n this.edges = {};\n this.outgoings = {};\n this.incomings = {};\n cells.forEach((cell) => this.onCellAdded(cell));\n }\n onEdgeTerminalChanged(edge, type) {\n const ref = type === 'source' ? this.outgoings : this.incomings;\n const prev = edge.previous(type);\n if (prev && prev.cell) {\n const cache = ref[prev.cell];\n const index = cache ? cache.indexOf(edge.id) : -1;\n if (index >= 0) {\n cache.splice(index, 1);\n if (cache.length === 0) {\n delete ref[prev.cell];\n }\n }\n }\n const terminal = edge.getTerminal(type);\n if (terminal && terminal.cell) {\n const cache = ref[terminal.cell] || [];\n const index = cache.indexOf(edge.id);\n if (index === -1) {\n cache.push(edge.id);\n }\n ref[terminal.cell] = cache;\n }\n }\n prepareCell(cell, options) {\n if (!cell.model && (!options || !options.dryrun)) {\n cell.model = this;\n }\n if (cell.zIndex == null) {\n cell.setZIndex(this.getMaxZIndex() + 1, { silent: true });\n }\n return cell;\n }\n resetCells(cells, options = {}) {\n // Do not update model at this time. Because if we just update the graph\n // with the same json-data, the edge will reference to the old nodes.\n cells.map((cell) => this.prepareCell(cell, Object.assign(Object.assign({}, options), { dryrun: true })));\n this.collection.reset(cells, options);\n // Update model and trigger edge update it's references\n cells.map((cell) => this.prepareCell(cell, { options }));\n return this;\n }\n clear(options = {}) {\n const raw = this.getCells();\n if (raw.length === 0) {\n return this;\n }\n const localOptions = Object.assign(Object.assign({}, options), { clear: true });\n this.batchUpdate('clear', () => {\n // The nodes come after the edges.\n const cells = raw.sort((a, b) => {\n const v1 = a.isEdge() ? 1 : 2;\n const v2 = b.isEdge() ? 1 : 2;\n return v1 - v2;\n });\n while (cells.length > 0) {\n // Note that all the edges are removed first, so it's safe to\n // remove the nodes without removing the connected edges first.\n const cell = cells.shift();\n if (cell) {\n cell.remove(localOptions);\n }\n }\n }, localOptions);\n return this;\n }\n addNode(metadata, options = {}) {\n const node = Node.isNode(metadata) ? metadata : this.createNode(metadata);\n this.addCell(node, options);\n return node;\n }\n createNode(metadata) {\n return Node.create(metadata);\n }\n addEdge(metadata, options = {}) {\n const edge = Edge.isEdge(metadata) ? metadata : this.createEdge(metadata);\n this.addCell(edge, options);\n return edge;\n }\n createEdge(metadata) {\n return Edge.create(metadata);\n }\n addCell(cell, options = {}) {\n if (Array.isArray(cell)) {\n return this.addCells(cell, options);\n }\n if (!this.collection.has(cell) && !this.addings.has(cell)) {\n this.addings.set(cell, true);\n this.collection.add(this.prepareCell(cell, options), options);\n cell.eachChild((child) => this.addCell(child, options));\n this.addings.delete(cell);\n }\n return this;\n }\n addCells(cells, options = {}) {\n const count = cells.length;\n if (count === 0) {\n return this;\n }\n const localOptions = Object.assign(Object.assign({}, options), { position: count - 1, maxPosition: count - 1 });\n this.startBatch('add', Object.assign(Object.assign({}, localOptions), { cells }));\n cells.forEach((cell) => {\n this.addCell(cell, localOptions);\n localOptions.position -= 1;\n });\n this.stopBatch('add', Object.assign(Object.assign({}, localOptions), { cells }));\n return this;\n }\n removeCell(obj, options = {}) {\n const cell = typeof obj === 'string' ? this.getCell(obj) : obj;\n if (cell && this.has(cell)) {\n return this.collection.remove(cell, options);\n }\n return null;\n }\n updateCellId(cell, newId) {\n this.startBatch('update', { id: newId });\n cell.prop('id', newId);\n const newCell = cell.clone({ keepId: true });\n this.addCell(newCell);\n // update connected edge terminal\n const edges = this.getConnectedEdges(cell);\n edges.forEach((edge) => {\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (sourceCell === cell) {\n edge.setSource(Object.assign(Object.assign({}, edge.getSource()), { cell: newId }));\n }\n if (targetCell === cell) {\n edge.setTarget(Object.assign(Object.assign({}, edge.getTarget()), { cell: newId }));\n }\n });\n this.removeCell(cell);\n this.stopBatch('update', { id: newId });\n return newCell;\n }\n removeCells(cells, options = {}) {\n if (cells.length) {\n return this.batchUpdate('remove', () => {\n return cells.map((cell) => this.removeCell(cell, options));\n });\n }\n return [];\n }\n removeConnectedEdges(cell, options = {}) {\n const edges = this.getConnectedEdges(cell);\n edges.forEach((edge) => {\n edge.remove(options);\n });\n return edges;\n }\n disconnectConnectedEdges(cell, options = {}) {\n const cellId = typeof cell === 'string' ? cell : cell.id;\n this.getConnectedEdges(cell).forEach((edge) => {\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (sourceCell && sourceCell.id === cellId) {\n edge.setSource({ x: 0, y: 0 }, options);\n }\n if (targetCell && targetCell.id === cellId) {\n edge.setTarget({ x: 0, y: 0 }, options);\n }\n });\n }\n has(obj) {\n return this.collection.has(obj);\n }\n total() {\n return this.collection.length;\n }\n indexOf(cell) {\n return this.collection.indexOf(cell);\n }\n /**\n * Returns a cell from the graph by its id.\n */\n getCell(id) {\n return this.collection.get(id);\n }\n /**\n * Returns all the nodes and edges in the graph.\n */\n getCells() {\n return this.collection.toArray();\n }\n /**\n * Returns the first cell (node or edge) in the graph. The first cell is\n * defined as the cell with the lowest `zIndex`.\n */\n getFirstCell() {\n return this.collection.first();\n }\n /**\n * Returns the last cell (node or edge) in the graph. The last cell is\n * defined as the cell with the highest `zIndex`.\n */\n getLastCell() {\n return this.collection.last();\n }\n /**\n * Returns the lowest `zIndex` value in the graph.\n */\n getMinZIndex() {\n const first = this.collection.first();\n return first ? first.getZIndex() || 0 : 0;\n }\n /**\n * Returns the highest `zIndex` value in the graph.\n */\n getMaxZIndex() {\n const last = this.collection.last();\n return last ? last.getZIndex() || 0 : 0;\n }\n getCellsFromCache(cache) {\n return cache\n ? Object.keys(cache)\n .map((id) => this.getCell(id))\n .filter((cell) => cell != null)\n : [];\n }\n /**\n * Returns all the nodes in the graph.\n */\n getNodes() {\n return this.getCellsFromCache(this.nodes);\n }\n /**\n * Returns all the edges in the graph.\n */\n getEdges() {\n return this.getCellsFromCache(this.edges);\n }\n /**\n * Returns all outgoing edges for the node.\n */\n getOutgoingEdges(cell) {\n const cellId = typeof cell === 'string' ? cell : cell.id;\n const cellIds = this.outgoings[cellId];\n return cellIds\n ? cellIds\n .map((id) => this.getCell(id))\n .filter((cell) => cell && cell.isEdge())\n : null;\n }\n /**\n * Returns all incoming edges for the node.\n */\n getIncomingEdges(cell) {\n const cellId = typeof cell === 'string' ? cell : cell.id;\n const cellIds = this.incomings[cellId];\n return cellIds\n ? cellIds\n .map((id) => this.getCell(id))\n .filter((cell) => cell && cell.isEdge())\n : null;\n }\n /**\n * Returns edges connected with cell.\n */\n getConnectedEdges(cell, options = {}) {\n const result = [];\n const node = typeof cell === 'string' ? this.getCell(cell) : cell;\n if (node == null) {\n return result;\n }\n const cache = {};\n const indirect = options.indirect;\n let incoming = options.incoming;\n let outgoing = options.outgoing;\n if (incoming == null && outgoing == null) {\n incoming = outgoing = true;\n }\n const collect = (cell, isOutgoing) => {\n const edges = isOutgoing\n ? this.getOutgoingEdges(cell)\n : this.getIncomingEdges(cell);\n if (edges != null) {\n edges.forEach((edge) => {\n if (cache[edge.id]) {\n return;\n }\n result.push(edge);\n cache[edge.id] = true;\n if (indirect) {\n if (incoming) {\n collect(edge, false);\n }\n if (outgoing) {\n collect(edge, true);\n }\n }\n });\n }\n if (indirect && cell.isEdge()) {\n const terminal = isOutgoing\n ? cell.getTargetCell()\n : cell.getSourceCell();\n if (terminal && terminal.isEdge()) {\n if (!cache[terminal.id]) {\n result.push(terminal);\n collect(terminal, isOutgoing);\n }\n }\n }\n };\n if (outgoing) {\n collect(node, true);\n }\n if (incoming) {\n collect(node, false);\n }\n if (options.deep) {\n const descendants = node.getDescendants({ deep: true });\n const embedsCache = {};\n descendants.forEach((cell) => {\n if (cell.isNode()) {\n embedsCache[cell.id] = true;\n }\n });\n const collectSub = (cell, isOutgoing) => {\n const edges = isOutgoing\n ? this.getOutgoingEdges(cell.id)\n : this.getIncomingEdges(cell.id);\n if (edges != null) {\n edges.forEach((edge) => {\n if (!cache[edge.id]) {\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (!options.enclosed &&\n sourceCell &&\n embedsCache[sourceCell.id] &&\n targetCell &&\n embedsCache[targetCell.id]) {\n return;\n }\n result.push(edge);\n cache[edge.id] = true;\n }\n });\n }\n };\n descendants.forEach((cell) => {\n if (cell.isEdge()) {\n return;\n }\n if (outgoing) {\n collectSub(cell, true);\n }\n if (incoming) {\n collectSub(cell, false);\n }\n });\n }\n return result;\n }\n isBoundary(cell, isOrigin) {\n const node = typeof cell === 'string' ? this.getCell(cell) : cell;\n const arr = isOrigin\n ? this.getIncomingEdges(node)\n : this.getOutgoingEdges(node);\n return arr == null || arr.length === 0;\n }\n getBoundaryNodes(isOrigin) {\n const result = [];\n Object.keys(this.nodes).forEach((nodeId) => {\n if (this.isBoundary(nodeId, isOrigin)) {\n const node = this.getCell(nodeId);\n if (node) {\n result.push(node);\n }\n }\n });\n return result;\n }\n /**\n * Returns an array of all the roots of the graph.\n */\n getRoots() {\n return this.getBoundaryNodes(true);\n }\n /**\n * Returns an array of all the leafs of the graph.\n */\n getLeafs() {\n return this.getBoundaryNodes(false);\n }\n /**\n * Returns `true` if the node is a root node, i.e. there is no edges\n * coming to the node.\n */\n isRoot(cell) {\n return this.isBoundary(cell, true);\n }\n /**\n * Returns `true` if the node is a leaf node, i.e. there is no edges\n * going out from the node.\n */\n isLeaf(cell) {\n return this.isBoundary(cell, false);\n }\n /**\n * Returns all the neighbors of node in the graph. Neighbors are all\n * the nodes connected to node via either incoming or outgoing edge.\n */\n getNeighbors(cell, options = {}) {\n let incoming = options.incoming;\n let outgoing = options.outgoing;\n if (incoming == null && outgoing == null) {\n incoming = outgoing = true;\n }\n const edges = this.getConnectedEdges(cell, options);\n const map = edges.reduce((memo, edge) => {\n const hasLoop = edge.hasLoop(options);\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (incoming &&\n sourceCell &&\n sourceCell.isNode() &&\n !memo[sourceCell.id]) {\n if (hasLoop ||\n (sourceCell !== cell &&\n (!options.deep || !sourceCell.isDescendantOf(cell)))) {\n memo[sourceCell.id] = sourceCell;\n }\n }\n if (outgoing &&\n targetCell &&\n targetCell.isNode() &&\n !memo[targetCell.id]) {\n if (hasLoop ||\n (targetCell !== cell &&\n (!options.deep || !targetCell.isDescendantOf(cell)))) {\n memo[targetCell.id] = targetCell;\n }\n }\n return memo;\n }, {});\n if (cell.isEdge()) {\n if (incoming) {\n const sourceCell = cell.getSourceCell();\n if (sourceCell && sourceCell.isNode() && !map[sourceCell.id]) {\n map[sourceCell.id] = sourceCell;\n }\n }\n if (outgoing) {\n const targetCell = cell.getTargetCell();\n if (targetCell && targetCell.isNode() && !map[targetCell.id]) {\n map[targetCell.id] = targetCell;\n }\n }\n }\n return Object.keys(map).map((id) => map[id]);\n }\n /**\n * Returns `true` if `cell2` is a neighbor of `cell1`.\n */\n isNeighbor(cell1, cell2, options = {}) {\n let incoming = options.incoming;\n let outgoing = options.outgoing;\n if (incoming == null && outgoing == null) {\n incoming = outgoing = true;\n }\n return this.getConnectedEdges(cell1, options).some((edge) => {\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (incoming && sourceCell && sourceCell.id === cell2.id) {\n return true;\n }\n if (outgoing && targetCell && targetCell.id === cell2.id) {\n return true;\n }\n return false;\n });\n }\n getSuccessors(cell, options = {}) {\n const successors = [];\n this.search(cell, (curr, distance) => {\n if (curr !== cell && this.matchDistance(distance, options.distance)) {\n successors.push(curr);\n }\n }, Object.assign(Object.assign({}, options), { outgoing: true }));\n return successors;\n }\n /**\n * Returns `true` if `cell2` is a successor of `cell1`.\n */\n isSuccessor(cell1, cell2, options = {}) {\n let result = false;\n this.search(cell1, (curr, distance) => {\n if (curr === cell2 &&\n curr !== cell1 &&\n this.matchDistance(distance, options.distance)) {\n result = true;\n return false;\n }\n }, Object.assign(Object.assign({}, options), { outgoing: true }));\n return result;\n }\n getPredecessors(cell, options = {}) {\n const predecessors = [];\n this.search(cell, (curr, distance) => {\n if (curr !== cell && this.matchDistance(distance, options.distance)) {\n predecessors.push(curr);\n }\n }, Object.assign(Object.assign({}, options), { incoming: true }));\n return predecessors;\n }\n /**\n * Returns `true` if `cell2` is a predecessor of `cell1`.\n */\n isPredecessor(cell1, cell2, options = {}) {\n let result = false;\n this.search(cell1, (curr, distance) => {\n if (curr === cell2 &&\n curr !== cell1 &&\n this.matchDistance(distance, options.distance)) {\n result = true;\n return false;\n }\n }, Object.assign(Object.assign({}, options), { incoming: true }));\n return result;\n }\n matchDistance(distance, preset) {\n if (preset == null) {\n return true;\n }\n if (typeof preset === 'function') {\n return preset(distance);\n }\n if (Array.isArray(preset) && preset.includes(distance)) {\n return true;\n }\n return distance === preset;\n }\n /**\n * Returns the common ancestor of the passed cells.\n */\n getCommonAncestor(...cells) {\n const arr = [];\n cells.forEach((item) => {\n if (item) {\n if (Array.isArray(item)) {\n arr.push(...item);\n }\n else {\n arr.push(item);\n }\n }\n });\n return Cell.getCommonAncestor(...arr);\n }\n /**\n * Returns an array of cells that result from finding nodes/edges that\n * are connected to any of the cells in the cells array. This function\n * loops over cells and if the current cell is a edge, it collects its\n * source/target nodes; if it is an node, it collects its incoming and\n * outgoing edges if both the edge terminal (source/target) are in the\n * cells array.\n */\n getSubGraph(cells, options = {}) {\n const subgraph = [];\n const cache = {};\n const nodes = [];\n const edges = [];\n const collect = (cell) => {\n if (!cache[cell.id]) {\n subgraph.push(cell);\n cache[cell.id] = cell;\n if (cell.isEdge()) {\n edges.push(cell);\n }\n if (cell.isNode()) {\n nodes.push(cell);\n }\n }\n };\n cells.forEach((cell) => {\n collect(cell);\n if (options.deep) {\n const descendants = cell.getDescendants({ deep: true });\n descendants.forEach((descendant) => collect(descendant));\n }\n });\n edges.forEach((edge) => {\n // For edges, include their source & target\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (sourceCell && !cache[sourceCell.id]) {\n subgraph.push(sourceCell);\n cache[sourceCell.id] = sourceCell;\n if (sourceCell.isNode()) {\n nodes.push(sourceCell);\n }\n }\n if (targetCell && !cache[targetCell.id]) {\n subgraph.push(targetCell);\n cache[targetCell.id] = targetCell;\n if (targetCell.isNode()) {\n nodes.push(targetCell);\n }\n }\n });\n nodes.forEach((node) => {\n // For nodes, include their connected edges if their source/target\n // is in the subgraph.\n const edges = this.getConnectedEdges(node, options);\n edges.forEach((edge) => {\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n if (!cache[edge.id] &&\n sourceCell &&\n cache[sourceCell.id] &&\n targetCell &&\n cache[targetCell.id]) {\n subgraph.push(edge);\n cache[edge.id] = edge;\n }\n });\n });\n return subgraph;\n }\n /**\n * Clones the whole subgraph (including all the connected links whose\n * source/target is in the subgraph). If `options.deep` is `true`, also\n * take into account all the embedded cells of all the subgraph cells.\n *\n * Returns a map of the form: { [original cell ID]: [clone] }.\n */\n cloneSubGraph(cells, options = {}) {\n const subgraph = this.getSubGraph(cells, options);\n return this.cloneCells(subgraph);\n }\n cloneCells(cells) {\n return Cell.cloneCells(cells);\n }\n getNodesFromPoint(x, y) {\n const p = typeof x === 'number' ? { x, y: y || 0 } : x;\n return this.getNodes().filter((node) => {\n return node.getBBox().containsPoint(p);\n });\n }\n getNodesInArea(x, y, w, h, options) {\n const rect = typeof x === 'number'\n ? new Rectangle(x, y, w, h)\n : Rectangle.create(x);\n const opts = typeof x === 'number' ? options : y;\n const strict = opts && opts.strict;\n return this.getNodes().filter((node) => {\n const bbox = node.getBBox();\n return strict ? rect.containsRect(bbox) : rect.isIntersectWithRect(bbox);\n });\n }\n getEdgesInArea(x, y, w, h, options) {\n const rect = typeof x === 'number'\n ? new Rectangle(x, y, w, h)\n : Rectangle.create(x);\n const opts = typeof x === 'number' ? options : y;\n const strict = opts && opts.strict;\n return this.getEdges().filter((edge) => {\n const bbox = edge.getBBox();\n if (bbox.width === 0) {\n bbox.inflate(1, 0);\n }\n else if (bbox.height === 0) {\n bbox.inflate(0, 1);\n }\n return strict ? rect.containsRect(bbox) : rect.isIntersectWithRect(bbox);\n });\n }\n getNodesUnderNode(node, options = {}) {\n const bbox = node.getBBox();\n const nodes = options.by == null || options.by === 'bbox'\n ? this.getNodesInArea(bbox)\n : this.getNodesFromPoint(bbox[options.by]);\n return nodes.filter((curr) => node.id !== curr.id && !curr.isDescendantOf(node));\n }\n /**\n * Returns the bounding box that surrounds all cells in the graph.\n */\n getAllCellsBBox() {\n return this.getCellsBBox(this.getCells());\n }\n /**\n * Returns the bounding box that surrounds all the given cells.\n */\n getCellsBBox(cells, options = {}) {\n return Cell.getCellsBBox(cells, options);\n }\n // #region search\n search(cell, iterator, options = {}) {\n if (options.breadthFirst) {\n this.breadthFirstSearch(cell, iterator, options);\n }\n else {\n this.depthFirstSearch(cell, iterator, options);\n }\n }\n breadthFirstSearch(cell, iterator, options = {}) {\n const queue = [];\n const visited = {};\n const distance = {};\n queue.push(cell);\n distance[cell.id] = 0;\n while (queue.length > 0) {\n const next = queue.shift();\n if (next == null || visited[next.id]) {\n continue;\n }\n visited[next.id] = true;\n if (FunctionExt.call(iterator, this, next, distance[next.id]) === false) {\n continue;\n }\n const neighbors = this.getNeighbors(next, options);\n neighbors.forEach((neighbor) => {\n distance[neighbor.id] = distance[next.id] + 1;\n queue.push(neighbor);\n });\n }\n }\n depthFirstSearch(cell, iterator, options = {}) {\n const queue = [];\n const visited = {};\n const distance = {};\n queue.push(cell);\n distance[cell.id] = 0;\n while (queue.length > 0) {\n const next = queue.pop();\n if (next == null || visited[next.id]) {\n continue;\n }\n visited[next.id] = true;\n if (FunctionExt.call(iterator, this, next, distance[next.id]) === false) {\n continue;\n }\n const neighbors = this.getNeighbors(next, options);\n const lastIndex = queue.length;\n neighbors.forEach((neighbor) => {\n distance[neighbor.id] = distance[next.id] + 1;\n queue.splice(lastIndex, 0, neighbor);\n });\n }\n }\n // #endregion\n // #region shortest path\n /** *\n * Returns an array of IDs of nodes on the shortest\n * path between source and target.\n */\n getShortestPath(source, target, options = {}) {\n const adjacencyList = {};\n this.getEdges().forEach((edge) => {\n const sourceId = edge.getSourceCellId();\n const targetId = edge.getTargetCellId();\n if (sourceId && targetId) {\n if (!adjacencyList[sourceId]) {\n adjacencyList[sourceId] = [];\n }\n if (!adjacencyList[targetId]) {\n adjacencyList[targetId] = [];\n }\n adjacencyList[sourceId].push(targetId);\n if (!options.directed) {\n adjacencyList[targetId].push(sourceId);\n }\n }\n });\n const sourceId = typeof source === 'string' ? source : source.id;\n const previous = Dijkstra.run(adjacencyList, sourceId, options.weight);\n const path = [];\n let targetId = typeof target === 'string' ? target : target.id;\n if (previous[targetId]) {\n path.push(targetId);\n }\n while ((targetId = previous[targetId])) {\n path.unshift(targetId);\n }\n return path;\n }\n // #endregion\n // #region transform\n /**\n * Translate all cells in the graph by `tx` and `ty` pixels.\n */\n translate(tx, ty, options) {\n this.getCells()\n .filter((cell) => !cell.hasParent())\n .forEach((cell) => cell.translate(tx, ty, options));\n return this;\n }\n resize(width, height, options) {\n return this.resizeCells(width, height, this.getCells(), options);\n }\n resizeCells(width, height, cells, options = {}) {\n const bbox = this.getCellsBBox(cells);\n if (bbox) {\n const sx = Math.max(width / bbox.width, 0);\n const sy = Math.max(height / bbox.height, 0);\n const origin = bbox.getOrigin();\n cells.forEach((cell) => cell.scale(sx, sy, origin, options));\n }\n return this;\n }\n // #endregion\n // #region serialize/deserialize\n toJSON(options = {}) {\n return Model.toJSON(this.getCells(), options);\n }\n parseJSON(data) {\n return Model.fromJSON(data);\n }\n fromJSON(data, options = {}) {\n const cells = this.parseJSON(data);\n this.resetCells(cells, options);\n return this;\n }\n // #endregion\n // #region batch\n startBatch(name, data = {}) {\n this.batches[name] = (this.batches[name] || 0) + 1;\n this.notify('batch:start', { name, data });\n return this;\n }\n stopBatch(name, data = {}) {\n this.batches[name] = (this.batches[name] || 0) - 1;\n this.notify('batch:stop', { name, data });\n return this;\n }\n batchUpdate(name, execute, data = {}) {\n this.startBatch(name, data);\n const result = execute();\n this.stopBatch(name, data);\n return result;\n }\n hasActiveBatch(name = Object.keys(this.batches)) {\n const names = Array.isArray(name) ? name : [name];\n return names.some((batch) => this.batches[batch] > 0);\n }\n}\n(function (Model) {\n Model.toStringTag = `X6.${Model.name}`;\n function isModel(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Model) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const model = instance;\n if ((tag == null || tag === Model.toStringTag) &&\n typeof model.addNode === 'function' &&\n typeof model.addEdge === 'function' &&\n model.collection != null) {\n return true;\n }\n return false;\n }\n Model.isModel = isModel;\n})(Model || (Model = {}));\n(function (Model) {\n function toJSON(cells, options = {}) {\n return {\n cells: cells.map((cell) => cell.toJSON(options)),\n };\n }\n Model.toJSON = toJSON;\n function fromJSON(data) {\n const cells = [];\n if (Array.isArray(data)) {\n cells.push(...data);\n }\n else {\n if (data.cells) {\n cells.push(...data.cells);\n }\n if (data.nodes) {\n data.nodes.forEach((node) => {\n if (node.shape == null) {\n node.shape = 'rect';\n }\n cells.push(node);\n });\n }\n if (data.edges) {\n data.edges.forEach((edge) => {\n if (edge.shape == null) {\n edge.shape = 'edge';\n }\n cells.push(edge);\n });\n }\n }\n return cells.map((cell) => {\n const type = cell.shape;\n if (type) {\n if (Node.registry.exist(type)) {\n return Node.create(cell);\n }\n if (Edge.registry.exist(type)) {\n return Edge.create(cell);\n }\n }\n throw new Error('The `shape` should be specified when creating a node/edge instance');\n });\n }\n Model.fromJSON = fromJSON;\n})(Model || (Model = {}));\n//# sourceMappingURL=model.js.map","import { Platform, StringExt, ObjectExt, Dom } from '../../util';\nimport { Node } from '../../model';\nimport { NodeView } from '../../view';\nimport { getName } from './util';\nconst contentSelector = '.text-block-content';\nconst registryName = getName('text-block');\nexport class TextBlock extends Node {\n get content() {\n return this.getContent();\n }\n set content(val) {\n this.setContent(val);\n }\n getContent() {\n return this.store.get('content', '');\n }\n setContent(content, options = {}) {\n this.store.set('content', content, options);\n }\n setup() {\n super.setup();\n this.store.on('change:*', (metadata) => {\n const key = metadata.key;\n if (key === 'content') {\n this.updateContent(this.getContent());\n }\n else if (key === 'size') {\n this.updateSize(this.getSize());\n }\n });\n this.updateSize(this.getSize());\n this.updateContent(this.getContent());\n }\n updateSize(size) {\n if (Platform.SUPPORT_FOREIGNOBJECT) {\n this.setAttrs({\n foreignObject: Object.assign({}, size),\n [contentSelector]: {\n style: Object.assign({}, size),\n },\n });\n }\n }\n updateContent(content) {\n if (Platform.SUPPORT_FOREIGNOBJECT) {\n this.setAttrs({\n [contentSelector]: {\n html: content ? StringExt.sanitizeHTML(content) : '',\n },\n });\n }\n else {\n this.setAttrs({\n [contentSelector]: {\n text: content,\n },\n });\n }\n }\n}\n(function (TextBlock) {\n TextBlock.config({\n type: registryName,\n view: registryName,\n markup: [\n '<g class=\"rotatable\">',\n '<g class=\"scalable\"><rect/></g>',\n Platform.SUPPORT_FOREIGNOBJECT\n ? [\n `<foreignObject>`,\n `<body xmlns=\"http://www.w3.org/1999/xhtml\">`,\n `<div class=\"${contentSelector.substr(1)}\" />`,\n `</body>`,\n `</foreignObject>`,\n ].join('')\n : `<text class=\"${contentSelector.substr(1)}\"/>`,\n '</g>',\n ].join(''),\n attrs: {\n '.': {\n fill: '#ffffff',\n stroke: 'none',\n },\n rect: {\n fill: '#ffffff',\n stroke: '#000000',\n width: 80,\n height: 100,\n },\n text: {\n fill: '#000000',\n fontSize: 14,\n fontFamily: 'Arial, helvetica, sans-serif',\n },\n body: {\n style: {\n background: 'transparent',\n position: 'static',\n margin: 0,\n padding: 0,\n },\n },\n foreignObject: {\n style: {\n overflow: 'hidden',\n },\n },\n [contentSelector]: {\n refX: 0.5,\n refY: 0.5,\n yAlign: 'middle',\n xAlign: 'middle',\n style: {\n textAlign: 'center',\n verticalAlign: 'middle',\n display: 'table-cell',\n padding: '0 5px',\n margin: 0,\n },\n },\n },\n });\n Node.registry.register(registryName, TextBlock);\n})(TextBlock || (TextBlock = {}));\n(function (TextBlock) {\n const contentAction = 'content';\n class View extends NodeView {\n confirmUpdate(flag, options = {}) {\n let ret = super.confirmUpdate(flag, options);\n if (this.hasAction(ret, contentAction)) {\n this.updateContent();\n ret = this.removeAction(ret, contentAction);\n }\n return ret;\n }\n update(partialAttrs) {\n if (Platform.SUPPORT_FOREIGNOBJECT) {\n super.update(partialAttrs);\n }\n else {\n const node = this.cell;\n const attrs = Object.assign({}, (partialAttrs || node.getAttrs()));\n delete attrs[contentSelector];\n super.update(attrs);\n if (!partialAttrs || ObjectExt.has(partialAttrs, contentSelector)) {\n this.updateContent(partialAttrs);\n }\n }\n }\n updateContent(partialAttrs) {\n if (Platform.SUPPORT_FOREIGNOBJECT) {\n super.update(partialAttrs);\n }\n else {\n const node = this.cell;\n const textAttrs = (partialAttrs || node.getAttrs())[contentSelector];\n // Break the text to fit the node size taking into\n // account the attributes set on the node.\n const text = Dom.breakText(node.getContent(), node.getSize(), textAttrs, {\n svgDocument: this.graph.view.svg,\n });\n const attrs = {\n [contentSelector]: ObjectExt.merge({}, textAttrs, { text }),\n };\n super.update(attrs);\n }\n }\n }\n TextBlock.View = View;\n (function (View) {\n View.config({\n bootstrap: ['render', contentAction],\n actions: Platform.SUPPORT_FOREIGNOBJECT\n ? {}\n : {\n size: contentAction,\n content: contentAction,\n },\n });\n NodeView.registry.register(registryName, View);\n })(View = TextBlock.View || (TextBlock.View = {}));\n})(TextBlock || (TextBlock = {}));\n//# sourceMappingURL=text-block.js.map","import { Base } from '../base';\nexport const Empty = Base.define({\n shape: 'empty',\n});\n//# sourceMappingURL=empty.js.map","import { ObjectExt } from '../../util';\nimport { Base } from '../base';\nexport function getMarkup(tagName, selector = 'body') {\n return [\n {\n tagName,\n selector,\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ];\n}\nexport function createShape(shape, config, options = {}) {\n const defaults = {\n constructorName: shape,\n markup: getMarkup(shape, options.selector),\n attrs: {\n [shape]: Object.assign({}, Base.bodyAttr),\n },\n };\n const base = options.parent || Base;\n return base.define(ObjectExt.merge(defaults, config, { shape }));\n}\n//# sourceMappingURL=util.js.map","import { createShape } from './util';\nexport const Rect = createShape('rect', {\n attrs: {\n body: {\n refWidth: '100%',\n refHeight: '100%',\n },\n },\n});\n//# sourceMappingURL=rect.js.map","import { Node } from '../../model/node';\nimport { Base } from '../base';\nexport const HeaderedRect = Node.define({\n shape: 'rect-headered',\n markup: [\n {\n tagName: 'rect',\n selector: 'body',\n },\n {\n tagName: 'rect',\n selector: 'header',\n },\n {\n tagName: 'text',\n selector: 'headerText',\n },\n {\n tagName: 'text',\n selector: 'bodyText',\n },\n ],\n attrs: {\n body: Object.assign(Object.assign({}, Base.bodyAttr), { refWidth: '100%', refHeight: '100%' }),\n header: Object.assign(Object.assign({}, Base.bodyAttr), { refWidth: '100%', height: 30, stroke: '#000000' }),\n headerText: Object.assign(Object.assign({}, Base.labelAttr), { refX: '50%', refY: 15, fontSize: 16 }),\n bodyText: Object.assign(Object.assign({}, Base.labelAttr), { refY2: 15 }),\n },\n});\n//# sourceMappingURL=rect-headered.js.map","import { createShape } from './util';\nexport const Circle = createShape('circle', {\n attrs: {\n body: {\n refCx: '50%',\n refCy: '50%',\n refR: '50%',\n },\n },\n});\n//# sourceMappingURL=circle.js.map","import { NumberExt } from '../../util';\nimport { Base } from '../base';\nconst CYLINDER_TILT = 10;\nexport const Cylinder = Base.define({\n shape: 'cylinder',\n overwrite: true,\n markup: [\n {\n tagName: 'path',\n selector: 'body',\n },\n {\n tagName: 'ellipse',\n selector: 'top',\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n body: Object.assign(Object.assign({}, Base.bodyAttr), { lateral: CYLINDER_TILT }),\n top: Object.assign(Object.assign({}, Base.bodyAttr), { refCx: '50%', refRx: '50%', cy: CYLINDER_TILT, ry: CYLINDER_TILT }),\n },\n attrHooks: {\n lateral: {\n set(t, { refBBox }) {\n const isPercentage = NumberExt.isPercentage(t);\n if (isPercentage) {\n // eslint-disable-next-line\n t = parseFloat(t) / 100;\n }\n const x = refBBox.x;\n const y = refBBox.y;\n const w = refBBox.width;\n const h = refBBox.height;\n // curve control point variables\n const rx = w / 2;\n const ry = isPercentage ? h * t : t;\n const kappa = 0.551784;\n const cx = kappa * rx;\n const cy = kappa * ry;\n // shape variables\n const xLeft = x;\n const xCenter = x + w / 2;\n const xRight = x + w;\n const ySideTop = y + ry;\n const yCurveTop = ySideTop - ry;\n const ySideBottom = y + h - ry;\n const yCurveBottom = y + h;\n // return calculated shape\n const data = [\n 'M',\n xLeft,\n ySideTop,\n 'L',\n xLeft,\n ySideBottom,\n 'C',\n x,\n ySideBottom + cy,\n xCenter - cx,\n yCurveBottom,\n xCenter,\n yCurveBottom,\n 'C',\n xCenter + cx,\n yCurveBottom,\n xRight,\n ySideBottom + cy,\n xRight,\n ySideBottom,\n 'L',\n xRight,\n ySideTop,\n 'C',\n xRight,\n ySideTop - cy,\n xCenter + cx,\n yCurveTop,\n xCenter,\n yCurveTop,\n 'C',\n xCenter - cx,\n yCurveTop,\n xLeft,\n ySideTop - cy,\n xLeft,\n ySideTop,\n 'Z',\n ];\n return { d: data.join(' ') };\n },\n },\n },\n knob: {\n enabled: true,\n position({ node }) {\n const lateral = node.attr('body/lateral');\n return { x: 0, y: lateral };\n },\n onMouseMove({ node, data, deltaY }) {\n if (deltaY !== 0) {\n const bbox = node.getBBox();\n const previous = node.attr('body/lateral');\n if (data.round == null) {\n data.round = previous;\n }\n const min = 0;\n const max = bbox.height / 2;\n const current = NumberExt.clamp(data.round + deltaY, min, max);\n if (current !== previous) {\n node.attr({\n body: { lateral: current },\n top: {\n cy: current,\n ry: current,\n },\n });\n }\n }\n },\n },\n});\n//# sourceMappingURL=cylinder.js.map","import { createShape } from './util';\nexport const Ellipse = createShape('ellipse', {\n attrs: {\n body: {\n refCx: '50%',\n refCy: '50%',\n refRx: '50%',\n refRy: '50%',\n },\n },\n});\n//# sourceMappingURL=ellipse.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Base } from '../base';\nimport { Point } from '../../geometry';\nimport { ObjectExt } from '../../util';\nexport class Poly extends Base {\n get points() {\n return this.getPoints();\n }\n set points(pts) {\n this.setPoints(pts);\n }\n getPoints() {\n return this.getAttrByPath('body/refPoints');\n }\n setPoints(points, options) {\n if (points == null) {\n this.removePoints();\n }\n else {\n this.setAttrByPath('body/refPoints', Poly.pointsToString(points), options);\n }\n return this;\n }\n removePoints() {\n this.removeAttrByPath('body/refPoints');\n return this;\n }\n}\n(function (Poly) {\n function pointsToString(points) {\n return typeof points === 'string'\n ? points\n : points\n .map((p) => {\n if (Array.isArray(p)) {\n return p.join(',');\n }\n if (Point.isPointLike(p)) {\n return `${p.x}, ${p.y}`;\n }\n return '';\n })\n .join(' ');\n }\n Poly.pointsToString = pointsToString;\n Poly.config({\n propHooks(metadata) {\n const { points } = metadata, others = __rest(metadata, [\"points\"]);\n if (points) {\n const data = pointsToString(points);\n if (data) {\n ObjectExt.setByPath(others, 'attrs/body/refPoints', data);\n }\n }\n return others;\n },\n });\n})(Poly || (Poly = {}));\n//# sourceMappingURL=poly.js.map","import { Poly } from './poly';\nimport { createShape } from './util';\nexport const Polygon = createShape('polygon', {}, { parent: Poly });\n//# sourceMappingURL=polygon.js.map","import { Poly } from './poly';\nimport { createShape } from './util';\nexport const Polyline = createShape('polyline', {}, { parent: Poly });\n//# sourceMappingURL=polyline.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt } from '../../util';\nimport { Base } from '../base';\nexport const Path = Base.define({\n shape: 'path',\n markup: [\n {\n tagName: 'rect',\n selector: 'bg',\n },\n {\n tagName: 'path',\n selector: 'body',\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n bg: {\n refWidth: '100%',\n refHeight: '100%',\n fill: 'none',\n stroke: 'none',\n pointerEvents: 'all',\n },\n body: {\n fill: 'none',\n stroke: '#000',\n strokeWidth: 2,\n },\n },\n propHooks(metadata) {\n const { path } = metadata, others = __rest(metadata, [\"path\"]);\n if (path) {\n ObjectExt.setByPath(others, 'attrs/body/refD', path);\n }\n return others;\n },\n});\n//# sourceMappingURL=path.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Platform, Dom, FunctionExt, ObjectExt } from '../../util';\nimport { Attr } from '../../registry';\nimport { Base } from '../base';\nexport const TextBlock = Base.define({\n shape: 'text-block',\n markup: [\n {\n tagName: 'rect',\n selector: 'body',\n },\n Platform.SUPPORT_FOREIGNOBJECT\n ? {\n tagName: 'foreignObject',\n selector: 'foreignObject',\n children: [\n {\n tagName: 'div',\n ns: Dom.ns.xhtml,\n selector: 'label',\n style: {\n width: '100%',\n height: '100%',\n position: 'static',\n backgroundColor: 'transparent',\n textAlign: 'center',\n margin: 0,\n padding: '0px 5px',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n },\n ],\n }\n : {\n tagName: 'text',\n selector: 'label',\n attrs: {\n textAnchor: 'middle',\n },\n },\n ],\n attrs: {\n body: Object.assign(Object.assign({}, Base.bodyAttr), { refWidth: '100%', refHeight: '100%' }),\n foreignObject: {\n refWidth: '100%',\n refHeight: '100%',\n },\n label: {\n style: {\n fontSize: 14,\n },\n },\n },\n propHooks(metadata) {\n const { text } = metadata, others = __rest(metadata, [\"text\"]);\n if (text) {\n ObjectExt.setByPath(others, 'attrs/label/text', text);\n }\n return others;\n },\n attrHooks: {\n text: {\n set(text, { cell, view, refBBox, elem, attrs }) {\n if (elem instanceof HTMLElement) {\n elem.textContent = text;\n }\n else {\n // No foreign object\n const style = attrs.style || {};\n const wrapValue = { text, width: -5, height: '100%' };\n const wrapAttrs = Object.assign({ textVerticalAnchor: 'middle' }, style);\n const textWrap = Attr.presets.textWrap;\n FunctionExt.call(textWrap.set, this, wrapValue, {\n cell,\n view,\n elem,\n refBBox,\n attrs: wrapAttrs,\n });\n return { fill: style.color || null };\n }\n },\n position(text, { refBBox, elem }) {\n if (elem instanceof SVGElement) {\n return refBBox.getCenter();\n }\n },\n },\n },\n});\n//# sourceMappingURL=text-block.js.map","import { getImageUrlHook } from '../basic/util';\nimport { createShape } from './util';\nexport const Image = createShape('image', {\n attrs: {\n image: {\n refWidth: '100%',\n refHeight: '100%',\n },\n },\n propHooks: getImageUrlHook(),\n}, {\n selector: 'image',\n});\n//# sourceMappingURL=image.js.map","import { getImageUrlHook } from '../basic/util';\nimport { createShape } from './util';\nexport const BorderedImage = createShape('image-bordered', {\n markup: [\n {\n tagName: 'rect',\n selector: 'background',\n attrs: {\n stroke: 'none',\n },\n },\n {\n tagName: 'image',\n selector: 'image',\n },\n {\n tagName: 'rect',\n selector: 'border',\n attrs: {\n fill: 'none',\n },\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n background: {\n refWidth: -1,\n refHeight: -1,\n x: 0.5,\n y: 0.5,\n fill: '#ffffff',\n },\n border: {\n refWidth: '100%',\n refHeight: '100%',\n stroke: '#333333',\n strokeWidth: 2,\n },\n image: {\n // xlinkHref: '[URL]'\n refWidth: -1,\n refHeight: -1,\n x: 0.5,\n y: 0.5,\n },\n },\n propHooks: getImageUrlHook(),\n});\n//# sourceMappingURL=image-bordered.js.map","import { getImageUrlHook } from '../basic/util';\nimport { createShape } from './util';\nexport const EmbeddedImage = createShape('image-embedded', {\n markup: [\n {\n tagName: 'rect',\n selector: 'body',\n },\n {\n tagName: 'image',\n selector: 'image',\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n body: {\n refWidth: '100%',\n refHeight: '100%',\n stroke: '#333333',\n fill: '#FFFFFF',\n strokeWidth: 2,\n },\n image: {\n // xlinkHref: '[URL]'\n refWidth: '30%',\n refHeight: -20,\n x: 10,\n y: 10,\n preserveAspectRatio: 'xMidYMin',\n },\n },\n propHooks: getImageUrlHook(),\n});\n//# sourceMappingURL=image-embedded.js.map","import { getImageUrlHook } from '../basic/util';\nimport { createShape } from './util';\nexport const InscribedImage = createShape('image-inscribed', {\n propHooks: getImageUrlHook(),\n markup: [\n {\n tagName: 'ellipse',\n selector: 'background',\n },\n {\n tagName: 'image',\n selector: 'image',\n },\n {\n tagName: 'ellipse',\n selector: 'border',\n attrs: {\n fill: 'none',\n },\n },\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n border: {\n refRx: '50%',\n refRy: '50%',\n refCx: '50%',\n refCy: '50%',\n stroke: '#333333',\n strokeWidth: 2,\n },\n background: {\n refRx: '50%',\n refRy: '50%',\n refCx: '50%',\n refCy: '50%',\n fill: '#ffffff',\n },\n image: {\n // The image corners touch the border when its size is Math.sqrt(2) / 2 = 0.707.. ~= 70%\n refWidth: '68%',\n refHeight: '68%',\n // The image offset is calculated as (100% - 68%) / 2\n refX: '16%',\n refY: '16%',\n preserveAspectRatio: 'xMidYMid',\n // xlinkHref: '[URL]'\n },\n // label: {\n // refX: '50%',\n // refY: '100%',\n // refY2: 10,\n // textAnchor: 'middle',\n // textVerticalAnchor: 'top',\n // },\n },\n});\n//# sourceMappingURL=image-inscribed.js.map","import { Edge as EdgeBase } from '../../model/edge';\nexport const Edge = EdgeBase.define({\n shape: 'edge',\n markup: [\n {\n tagName: 'path',\n selector: 'wrap',\n groupSelector: 'lines',\n attrs: {\n fill: 'none',\n cursor: 'pointer',\n stroke: 'transparent',\n strokeLinecap: 'round',\n },\n },\n {\n tagName: 'path',\n selector: 'line',\n groupSelector: 'lines',\n attrs: {\n fill: 'none',\n pointerEvents: 'none',\n },\n },\n ],\n attrs: {\n lines: {\n connection: true,\n strokeLinejoin: 'round',\n },\n wrap: {\n strokeWidth: 10,\n },\n line: {\n stroke: '#333',\n strokeWidth: 2,\n targetMarker: 'classic',\n },\n },\n});\n//# sourceMappingURL=edge.js.map","import { Edge } from '../../model/edge';\nexport const ShadowEdge = Edge.define({\n shape: 'shadow-edge',\n markup: [\n {\n tagName: 'path',\n selector: 'shadow',\n attrs: {\n fill: 'none',\n },\n },\n {\n tagName: 'path',\n selector: 'line',\n attrs: {\n fill: 'none',\n cursor: 'pointer',\n },\n },\n ],\n attrs: {\n line: {\n connection: true,\n stroke: '#FF0000',\n strokeWidth: 20,\n strokeLinejoin: 'round',\n targetMarker: {\n name: 'path',\n stroke: 'none',\n d: 'M 0 -10 -10 0 0 10 z',\n offsetX: -5,\n },\n sourceMarker: {\n name: 'path',\n stroke: 'none',\n d: 'M -10 -10 0 0 -10 10 0 10 0 -10 z',\n offsetX: -5,\n },\n },\n shadow: {\n connection: true,\n refX: 3,\n refY: 6,\n stroke: '#000000',\n strokeOpacity: 0.2,\n strokeWidth: 20,\n strokeLinejoin: 'round',\n targetMarker: {\n name: 'path',\n d: 'M 0 -10 -10 0 0 10 z',\n stroke: 'none',\n offsetX: -5,\n },\n sourceMarker: {\n name: 'path',\n stroke: 'none',\n d: 'M -10 -10 0 0 -10 10 0 10 0 -10 z',\n offsetX: -5,\n },\n },\n },\n});\n//# sourceMappingURL=edge-shadow.js.map","import { Edge } from '../../model/edge';\nexport const DoubleEdge = Edge.define({\n shape: 'double-edge',\n markup: [\n {\n tagName: 'path',\n selector: 'outline',\n attrs: {\n fill: 'none',\n },\n },\n {\n tagName: 'path',\n selector: 'line',\n attrs: {\n fill: 'none',\n cursor: 'pointer',\n },\n },\n ],\n attrs: {\n line: {\n connection: true,\n stroke: '#dddddd',\n strokeWidth: 4,\n strokeLinejoin: 'round',\n targetMarker: {\n tagName: 'path',\n stroke: '#000000',\n d: 'M 10 -3 10 -10 -2 0 10 10 10 3',\n },\n },\n outline: {\n connection: true,\n stroke: '#000000',\n strokeWidth: 6,\n strokeLinejoin: 'round',\n },\n },\n});\n//# sourceMappingURL=edge-doubled.js.map","import { Registry } from '../../registry';\nimport { Markup } from '../../view';\nimport { Node } from '../../model/node';\nimport { NodeView } from '../../view/node';\nimport { Base } from '../base';\nexport class HTML extends Base {\n get html() {\n return this.getHTML();\n }\n set html(val) {\n this.setHTML(val);\n }\n getHTML() {\n return this.store.get('html');\n }\n setHTML(html, options = {}) {\n if (html == null) {\n this.removeHTML(options);\n }\n else {\n this.store.set('html', html, options);\n }\n return this;\n }\n removeHTML(options = {}) {\n return this.store.remove('html', options);\n }\n}\n(function (HTML) {\n class View extends NodeView {\n init() {\n super.init();\n this.cell.on('change:*', () => {\n const shouldUpdate = this.graph.hook.shouldUpdateHTMLComponent(this.cell);\n if (shouldUpdate) {\n this.renderHTMLComponent();\n }\n });\n }\n confirmUpdate(flag) {\n const ret = super.confirmUpdate(flag);\n return this.handleAction(ret, View.action, () => this.renderHTMLComponent());\n }\n renderHTMLComponent() {\n const container = this.selectors.foContent;\n if (container) {\n const $wrap = this.$(container).empty();\n const component = this.graph.hook.getHTMLComponent(this.cell);\n if (component) {\n if (typeof component === 'string') {\n $wrap.html(component);\n }\n else {\n $wrap.append(component);\n }\n }\n }\n }\n }\n HTML.View = View;\n (function (View) {\n View.action = 'html';\n View.config({\n bootstrap: [View.action],\n actions: {\n html: View.action,\n },\n });\n NodeView.registry.register('html-view', View);\n })(View = HTML.View || (HTML.View = {}));\n})(HTML || (HTML = {}));\n(function (HTML) {\n HTML.config({\n view: 'html-view',\n markup: [\n {\n tagName: 'rect',\n selector: 'body',\n },\n Object.assign({}, Markup.getForeignObjectMarkup()),\n {\n tagName: 'text',\n selector: 'label',\n },\n ],\n attrs: {\n body: {\n fill: 'none',\n stroke: 'none',\n refWidth: '100%',\n refHeight: '100%',\n },\n fo: {\n refWidth: '100%',\n refHeight: '100%',\n },\n },\n });\n Node.registry.register('html', HTML);\n})(HTML || (HTML = {}));\n(function (HTML) {\n HTML.componentRegistry = Registry.create({\n type: 'html componnet',\n });\n})(HTML || (HTML = {}));\n//# sourceMappingURL=html.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Disablable } from '../../common';\nexport class AutoSave extends Disablable {\n constructor(options) {\n super();\n this.delay = 10;\n this.throttle = 2;\n this.threshold = 5;\n this.changeCount = 0;\n this.timestamp = 0;\n this.options = Object.assign(Object.assign({}, AutoSave.defaultOptions), options);\n this.graph.model.on('cell:change:*', this.onModelChanged, this);\n }\n get graph() {\n return this.options.graph;\n }\n onModelChanged() {\n if (this.disabled) {\n return;\n }\n const now = new Date().getTime();\n const dt = (now - this.timestamp) / 1000;\n if (dt > this.delay ||\n (this.changeCount >= this.threshold && dt > this.throttle)) {\n this.save();\n this.reset();\n }\n else {\n this.changeCount += 1;\n }\n }\n save() {\n this.trigger('save');\n }\n reset() {\n this.changeCount = 0;\n this.timestamp = new Date().getTime();\n }\n dispose() {\n this.graph.model.off('cell:change:*', this.onModelChanged, this);\n }\n}\n__decorate([\n Disablable.dispose()\n], AutoSave.prototype, \"dispose\", null);\n(function (AutoSave) {\n AutoSave.defaultOptions = {\n delay: 10,\n throttle: 2,\n threshold: 5,\n };\n})(AutoSave || (AutoSave = {}));\n//# sourceMappingURL=index.js.map","import { Disposable } from '../common';\nexport class Base extends Disposable {\n constructor(graph) {\n super();\n this.graph = graph;\n this.init();\n }\n get options() {\n return this.graph.options;\n }\n get model() {\n return this.graph.model;\n }\n get view() {\n return this.graph.view;\n }\n init() { }\n}\n//# sourceMappingURL=base.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport JQuery from 'jquery';\nimport { Dom, FunctionExt } from '../util';\nimport { Cell } from '../model';\nimport { Config } from '../global';\nimport { View, Markup } from '../view';\nexport class GraphView extends View {\n constructor(graph) {\n super();\n this.graph = graph;\n const { selectors, fragment } = Markup.parseJSONMarkup(GraphView.markup);\n this.background = selectors.background;\n this.grid = selectors.grid;\n this.svg = selectors.svg;\n this.defs = selectors.defs;\n this.viewport = selectors.viewport;\n this.primer = selectors.primer;\n this.stage = selectors.stage;\n this.decorator = selectors.decorator;\n this.overlay = selectors.overlay;\n this.container = this.options.container;\n this.restore = GraphView.snapshoot(this.container);\n this.$(this.container)\n .addClass(this.prefixClassName('graph'))\n .append(fragment);\n this.delegateEvents();\n }\n get model() {\n return this.graph.model;\n }\n get options() {\n return this.graph.options;\n }\n delegateEvents() {\n const ctor = this.constructor;\n super.delegateEvents(ctor.events);\n return this;\n }\n /**\n * Guard the specified event. If the event is not interesting, it\n * returns `true`, otherwise returns `false`.\n */\n guard(e, view) {\n // handled as `contextmenu` type\n if (e.type === 'mousedown' && e.button === 2) {\n return true;\n }\n if (this.options.guard && this.options.guard(e, view)) {\n return true;\n }\n if (e.data && e.data.guarded !== undefined) {\n return e.data.guarded;\n }\n if (view && view.cell && Cell.isCell(view.cell)) {\n return false;\n }\n if (this.svg === e.target ||\n this.container === e.target ||\n JQuery.contains(this.svg, e.target)) {\n return false;\n }\n return true;\n }\n findView(elem) {\n return this.graph.renderer.findViewByElem(elem);\n }\n onDblClick(evt) {\n if (this.options.preventDefaultDblClick) {\n evt.preventDefault();\n }\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n if (view) {\n view.onDblClick(e, localPoint.x, localPoint.y);\n }\n else {\n this.graph.trigger('blank:dblclick', {\n e,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n }\n onClick(evt) {\n if (this.getMouseMovedCount(evt) <= this.options.clickThreshold) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n if (view) {\n view.onClick(e, localPoint.x, localPoint.y);\n }\n else {\n this.graph.trigger('blank:click', {\n e,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n }\n }\n onContextMenu(evt) {\n if (this.options.preventDefaultContextMenu) {\n evt.preventDefault();\n }\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n if (view) {\n view.onContextMenu(e, localPoint.x, localPoint.y);\n }\n else {\n this.graph.trigger('blank:contextmenu', {\n e,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n }\n delegateDragEvents(e, view) {\n if (e.data == null) {\n e.data = {};\n }\n this.setEventData(e, {\n currentView: view || null,\n mouseMovedCount: 0,\n startPosition: {\n x: e.clientX,\n y: e.clientY,\n },\n });\n const ctor = this.constructor;\n this.delegateDocumentEvents(ctor.documentEvents, e.data);\n this.undelegateEvents();\n }\n getMouseMovedCount(e) {\n const data = this.getEventData(e);\n return data.mouseMovedCount || 0;\n }\n onMouseDown(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n if (this.options.preventDefaultMouseDown) {\n e.preventDefault();\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n if (view) {\n view.onMouseDown(e, localPoint.x, localPoint.y);\n }\n else {\n if (this.options.preventDefaultBlankAction) {\n e.preventDefault();\n }\n this.graph.trigger('blank:mousedown', {\n e,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n this.delegateDragEvents(e, view);\n }\n onMouseMove(evt) {\n const data = this.getEventData(evt);\n const startPosition = data.startPosition;\n if (startPosition &&\n startPosition.x === evt.clientX &&\n startPosition.y === evt.clientY) {\n return;\n }\n if (data.mouseMovedCount == null) {\n data.mouseMovedCount = 0;\n }\n data.mouseMovedCount += 1;\n const mouseMovedCount = data.mouseMovedCount;\n if (mouseMovedCount <= this.options.moveThreshold) {\n return;\n }\n const e = this.normalizeEvent(evt);\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n const view = data.currentView;\n if (view) {\n view.onMouseMove(e, localPoint.x, localPoint.y);\n }\n else {\n this.graph.trigger('blank:mousemove', {\n e,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n this.setEventData(e, data);\n }\n onMouseUp(e) {\n this.undelegateDocumentEvents();\n const normalized = this.normalizeEvent(e);\n const localPoint = this.graph.snapToGrid(normalized.clientX, normalized.clientY);\n const data = this.getEventData(e);\n const view = data.currentView;\n if (view) {\n view.onMouseUp(normalized, localPoint.x, localPoint.y);\n }\n else {\n this.graph.trigger('blank:mouseup', {\n e: normalized,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n if (!e.isPropagationStopped()) {\n this.onClick(JQuery.Event(e, {\n type: 'click',\n data: e.data,\n }));\n }\n e.stopImmediatePropagation();\n this.delegateEvents();\n }\n onMouseOver(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n if (view) {\n view.onMouseOver(e);\n }\n else {\n // prevent border of paper from triggering this\n if (this.container === e.target) {\n return;\n }\n this.graph.trigger('blank:mouseover', { e });\n }\n }\n onMouseOut(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n if (view) {\n view.onMouseOut(e);\n }\n else {\n if (this.container === e.target) {\n return;\n }\n this.graph.trigger('blank:mouseout', { e });\n }\n }\n onMouseEnter(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const relatedView = this.graph.renderer.findViewByElem(e.relatedTarget);\n if (view) {\n if (relatedView === view) {\n // mouse moved from tool to view\n return;\n }\n view.onMouseEnter(e);\n }\n else {\n if (relatedView) {\n return;\n }\n this.graph.trigger('graph:mouseenter', { e });\n }\n }\n onMouseLeave(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const relatedView = this.graph.renderer.findViewByElem(e.relatedTarget);\n if (view) {\n if (relatedView === view) {\n // mouse moved from view to tool\n return;\n }\n view.onMouseLeave(e);\n }\n else {\n if (relatedView) {\n return;\n }\n this.graph.trigger('graph:mouseleave', { e });\n }\n }\n onMouseWheel(evt) {\n const e = this.normalizeEvent(evt);\n const view = this.findView(e.target);\n if (this.guard(e, view)) {\n return;\n }\n const originalEvent = e.originalEvent;\n const localPoint = this.graph.snapToGrid(originalEvent.clientX, originalEvent.clientY);\n const delta = Math.max(-1, Math.min(1, originalEvent.wheelDelta || -originalEvent.detail));\n if (view) {\n view.onMouseWheel(e, localPoint.x, localPoint.y, delta);\n }\n else {\n this.graph.trigger('blank:mousewheel', {\n e,\n delta,\n x: localPoint.x,\n y: localPoint.y,\n });\n }\n }\n onCustomEvent(evt) {\n const elem = evt.currentTarget;\n const event = elem.getAttribute('event') || elem.getAttribute('data-event');\n if (event) {\n const view = this.findView(elem);\n if (view) {\n const e = this.normalizeEvent(evt);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n view.onCustomEvent(e, event, localPoint.x, localPoint.y);\n }\n }\n }\n handleMagnetEvent(evt, handler) {\n const magnetElem = evt.currentTarget;\n const magnetValue = magnetElem.getAttribute('magnet');\n if (magnetValue && magnetValue.toLowerCase() !== 'false') {\n const view = this.findView(magnetElem);\n if (view) {\n const e = this.normalizeEvent(evt);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n FunctionExt.call(handler, this.graph, view, e, magnetElem, localPoint.x, localPoint.y);\n }\n }\n }\n onMagnetMouseDown(e) {\n this.handleMagnetEvent(e, (view, e, magnet, x, y) => {\n view.onMagnetMouseDown(e, magnet, x, y);\n });\n }\n onMagnetDblClick(e) {\n this.handleMagnetEvent(e, (view, e, magnet, x, y) => {\n view.onMagnetDblClick(e, magnet, x, y);\n });\n }\n onMagnetContextMenu(e) {\n if (this.options.preventDefaultContextMenu) {\n e.preventDefault();\n }\n this.handleMagnetEvent(e, (view, e, magnet, x, y) => {\n view.onMagnetContextMenu(e, magnet, x, y);\n });\n }\n onLabelMouseDown(evt) {\n const labelNode = evt.currentTarget;\n const view = this.findView(labelNode);\n if (view) {\n const e = this.normalizeEvent(evt);\n if (this.guard(e, view)) {\n return;\n }\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n view.onLabelMouseDown(e, localPoint.x, localPoint.y);\n }\n }\n onImageDragStart() {\n // This is the only way to prevent image dragging in Firefox that works.\n // Setting -moz-user-select: none, draggable=\"false\" attribute or\n // user-drag: none didn't help.\n return false;\n }\n dispose() {\n this.undelegateEvents();\n this.undelegateDocumentEvents();\n this.restore();\n this.restore = () => { };\n }\n}\n__decorate([\n View.dispose()\n], GraphView.prototype, \"dispose\", null);\n(function (GraphView) {\n const prefixCls = `${Config.prefixCls}-graph`;\n GraphView.markup = [\n {\n ns: Dom.ns.xhtml,\n tagName: 'div',\n selector: 'background',\n className: `${prefixCls}-background`,\n },\n {\n ns: Dom.ns.xhtml,\n tagName: 'div',\n selector: 'grid',\n className: `${prefixCls}-grid`,\n },\n {\n ns: Dom.ns.svg,\n tagName: 'svg',\n selector: 'svg',\n className: `${prefixCls}-svg`,\n attrs: {\n width: '100%',\n height: '100%',\n 'xmlns:xlink': Dom.ns.xlink,\n },\n children: [\n {\n tagName: 'defs',\n selector: 'defs',\n },\n {\n tagName: 'g',\n selector: 'viewport',\n className: `${prefixCls}-svg-viewport`,\n children: [\n {\n tagName: 'g',\n selector: 'primer',\n className: `${prefixCls}-svg-primer`,\n },\n {\n tagName: 'g',\n selector: 'stage',\n className: `${prefixCls}-svg-stage`,\n },\n {\n tagName: 'g',\n selector: 'decorator',\n className: `${prefixCls}-svg-decorator`,\n },\n {\n tagName: 'g',\n selector: 'overlay',\n className: `${prefixCls}-svg-overlay`,\n },\n ],\n },\n ],\n },\n ];\n function snapshoot(elem) {\n const cloned = elem.cloneNode();\n elem.childNodes.forEach((child) => cloned.appendChild(child));\n return () => {\n // remove all children\n Dom.empty(elem);\n // remove all attributes\n while (elem.attributes.length > 0) {\n elem.removeAttribute(elem.attributes[0].name);\n }\n // restore attributes\n for (let i = 0, l = cloned.attributes.length; i < l; i += 1) {\n const attr = cloned.attributes[i];\n elem.setAttribute(attr.name, attr.value);\n }\n // restore children\n cloned.childNodes.forEach((child) => elem.appendChild(child));\n };\n }\n GraphView.snapshoot = snapshoot;\n})(GraphView || (GraphView = {}));\n(function (GraphView) {\n const prefixCls = Config.prefixCls;\n GraphView.events = {\n dblclick: 'onDblClick',\n contextmenu: 'onContextMenu',\n touchstart: 'onMouseDown',\n mousedown: 'onMouseDown',\n mouseover: 'onMouseOver',\n mouseout: 'onMouseOut',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousewheel: 'onMouseWheel',\n DOMMouseScroll: 'onMouseWheel',\n [`mouseenter .${prefixCls}-cell`]: 'onMouseEnter',\n [`mouseleave .${prefixCls}-cell`]: 'onMouseLeave',\n [`mouseenter .${prefixCls}-cell-tools`]: 'onMouseEnter',\n [`mouseleave .${prefixCls}-cell-tools`]: 'onMouseLeave',\n [`mousedown .${prefixCls}-cell [event]`]: 'onCustomEvent',\n [`touchstart .${prefixCls}-cell [event]`]: 'onCustomEvent',\n [`mousedown .${prefixCls}-cell [data-event]`]: 'onCustomEvent',\n [`touchstart .${prefixCls}-cell [data-event]`]: 'onCustomEvent',\n [`dblclick .${prefixCls}-cell [magnet]`]: 'onMagnetDblClick',\n [`contextmenu .${prefixCls}-cell [magnet]`]: 'onMagnetContextMenu',\n [`mousedown .${prefixCls}-cell [magnet]`]: 'onMagnetMouseDown',\n [`touchstart .${prefixCls}-cell [magnet]`]: 'onMagnetMouseDown',\n [`dblclick .${prefixCls}-cell [data-magnet]`]: 'onMagnetDblClick',\n [`contextmenu .${prefixCls}-cell [data-magnet]`]: 'onMagnetContextMenu',\n [`mousedown .${prefixCls}-cell [data-magnet]`]: 'onMagnetMouseDown',\n [`touchstart .${prefixCls}-cell [data-magnet]`]: 'onMagnetMouseDown',\n [`dragstart .${prefixCls}-cell image`]: 'onImageDragStart',\n [`mousedown .${prefixCls}-edge .${prefixCls}-edge-label`]: 'onLabelMouseDown',\n [`touchstart .${prefixCls}-edge .${prefixCls}-edge-label`]: 'onLabelMouseDown',\n };\n GraphView.documentEvents = {\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n };\n})(GraphView || (GraphView = {}));\n//# sourceMappingURL=view.js.map","export var Decorator;\n(function (Decorator) {\n function checkScroller(err, warning) {\n return (target, methodName, descriptor) => {\n const raw = descriptor.value;\n descriptor.value = function (...args) {\n const scroller = this.scroller.widget;\n if (scroller == null) {\n const msg = `Shoule enable scroller to use method '${methodName}'`;\n if (err !== false) {\n console.error(msg);\n throw new Error(msg);\n }\n if (warning !== false) {\n console.warn(msg);\n }\n return this;\n }\n return raw.call(this, ...args);\n };\n };\n }\n Decorator.checkScroller = checkScroller;\n})(Decorator || (Decorator = {}));\n//# sourceMappingURL=decorator.js.map","/* eslint-disable */\n/**\n * Auto generated file, do not modify it!\n */\nexport const content = `.x6-graph {\n position: relative;\n outline: none;\n}\n.x6-graph-background,\n.x6-graph-grid,\n.x6-graph-svg {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.x6-graph-background-stage,\n.x6-graph-grid-stage,\n.x6-graph-svg-stage {\n user-select: none;\n}\n.x6-graph.x6-graph-pannable {\n cursor: grab;\n cursor: -moz-grab;\n cursor: -webkit-grab;\n}\n.x6-graph.x6-graph-panning {\n cursor: grabbing;\n cursor: -moz-grabbing;\n cursor: -webkit-grabbing;\n user-select: none;\n}\n.x6-node {\n cursor: move;\n /* stylelint-disable-next-line */\n}\n.x6-node.x6-node-immovable {\n cursor: default;\n}\n.x6-node * {\n -webkit-user-drag: none;\n}\n.x6-node .scalable * {\n vector-effect: non-scaling-stroke;\n}\n.x6-node [magnet='true'] {\n cursor: crosshair;\n transition: opacity 0.3s;\n}\n.x6-node [magnet='true']:hover {\n opacity: 0.7;\n}\n.x6-node foreignObject {\n display: block;\n overflow: visible;\n background-color: transparent;\n}\n.x6-node foreignObject > body {\n position: static;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: visible;\n background-color: transparent;\n}\n.x6-edge .source-marker,\n.x6-edge .target-marker {\n vector-effect: non-scaling-stroke;\n}\n.x6-edge .connection {\n stroke-linejoin: round;\n fill: none;\n}\n.x6-edge .connection-wrap {\n cursor: move;\n opacity: 0;\n fill: none;\n stroke: #000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.x6-edge .connection-wrap:hover {\n opacity: 0.4;\n stroke-opacity: 0.4;\n}\n.x6-edge .vertices {\n cursor: move;\n opacity: 0;\n}\n.x6-edge .vertices .vertex {\n fill: #1abc9c;\n}\n.x6-edge .vertices .vertex :hover {\n fill: #34495e;\n stroke: none;\n}\n.x6-edge .vertices .vertex-remove {\n cursor: pointer;\n fill: #fff;\n}\n.x6-edge .vertices .vertex-remove-area {\n cursor: pointer;\n opacity: 0.1;\n}\n.x6-edge .vertices .vertex-group:hover .vertex-remove-area {\n opacity: 1;\n}\n.x6-edge .arrowheads {\n cursor: move;\n opacity: 0;\n}\n.x6-edge .arrowheads .arrowhead {\n fill: #1abc9c;\n}\n.x6-edge .arrowheads .arrowhead :hover {\n fill: #f39c12;\n stroke: none;\n}\n.x6-edge .tools {\n cursor: pointer;\n opacity: 0;\n}\n.x6-edge .tools .tool-options {\n display: none;\n}\n.x6-edge .tools .tool-remove circle {\n fill: #f00;\n}\n.x6-edge .tools .tool-remove path {\n fill: #fff;\n}\n.x6-edge:hover .vertices,\n.x6-edge:hover .arrowheads,\n.x6-edge:hover .tools {\n opacity: 1;\n}\n.x6-highlight-opacity {\n opacity: 0.3;\n}\n@keyframes halo-pie-visibility {\n 0% {\n visibility: hidden;\n }\n 100% {\n visibility: visible;\n }\n}\n@keyframes halo-pie-opening {\n 0% {\n transform: scale(0.4) rotate(-20deg);\n }\n 100% {\n transform: scale(1) rotate(0);\n }\n}\n.x6-widget-handle {\n position: absolute;\n width: 20px;\n height: 20px;\n background-color: transparent;\n background-repeat: no-repeat;\n background-position: 0 0;\n background-size: 20px 20px;\n cursor: pointer;\n user-select: none;\n pointer-events: auto;\n -webkit-user-drag: none;\n user-drag: none;\n /* stylelint-disable-line */\n}\n.x6-widget-handle.hidden {\n display: none;\n}\n.x6-widget-handle-selected {\n background-color: rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n}\n.x6-widget-handle-remove {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M15.386%2C3.365c-3.315-3.314-8.707-3.313-12.021%2C0c-3.314%2C3.315-3.314%2C8.706%2C0%2C12.02%20c3.314%2C3.314%2C8.707%2C3.314%2C12.021%2C0S18.699%2C6.68%2C15.386%2C3.365L15.386%2C3.365z%20M4.152%2C14.598C1.273%2C11.719%2C1.273%2C7.035%2C4.153%2C4.154%20c2.88-2.88%2C7.563-2.88%2C10.443%2C0c2.881%2C2.88%2C2.881%2C7.562%2C0%2C10.443C11.716%2C17.477%2C7.032%2C17.477%2C4.152%2C14.598L4.152%2C14.598z%22%2F%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M12.157%2C11.371L7.38%2C6.593C7.162%2C6.375%2C6.809%2C6.375%2C6.592%2C6.592c-0.218%2C0.219-0.218%2C0.572%2C0%2C0.79%20l4.776%2C4.776c0.218%2C0.219%2C0.571%2C0.219%2C0.79%2C0C12.375%2C11.941%2C12.375%2C11.588%2C12.157%2C11.371L12.157%2C11.371z%22%2F%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M11.369%2C6.593l-4.777%2C4.778c-0.217%2C0.217-0.217%2C0.568%2C0%2C0.787c0.219%2C0.219%2C0.571%2C0.217%2C0.788%2C0l4.777-4.777%20c0.218-0.218%2C0.218-0.571%2C0.001-0.789C11.939%2C6.375%2C11.587%2C6.375%2C11.369%2C6.593L11.369%2C6.593z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n cursor: pointer;\n}\n.x6-widget-handle-remove:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M15.386%2C3.365c-3.315-3.314-8.707-3.313-12.021%2C0c-3.314%2C3.315-3.314%2C8.706%2C0%2C12.02%20c3.314%2C3.314%2C8.707%2C3.314%2C12.021%2C0S18.699%2C6.68%2C15.386%2C3.365L15.386%2C3.365z%22%2F%3E%3Cpath%20fill%3D%22%23FFFFFF%22%20d%3D%22M12.157%2C11.371L7.38%2C6.593C7.162%2C6.375%2C6.809%2C6.375%2C6.592%2C6.592c-0.218%2C0.219-0.218%2C0.572%2C0%2C0.79%20l4.776%2C4.776c0.218%2C0.219%2C0.571%2C0.219%2C0.79%2C0C12.375%2C11.941%2C12.375%2C11.588%2C12.157%2C11.371L12.157%2C11.371z%22%2F%3E%3Cpath%20fill%3D%22%23FFFFFF%22%20d%3D%22M11.369%2C6.593l-4.777%2C4.778c-0.217%2C0.217-0.217%2C0.568%2C0%2C0.787c0.219%2C0.219%2C0.571%2C0.217%2C0.788%2C0l4.777-4.777%20c0.218-0.218%2C0.218-0.571%2C0.001-0.789C11.939%2C6.375%2C11.587%2C6.375%2C11.369%2C6.593L11.369%2C6.593z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-rotate {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M9.374%2C17.592c-4.176%2C0-7.57-3.401-7.57-7.575c0-4.175%2C3.395-7.574%2C7.57-7.574c0.28%2C0%2C0.56%2C0.018%2C0.837%2C0.05%20V1.268c0-0.158%2C0.099-0.3%2C0.239-0.36c0.151-0.058%2C0.315-0.026%2C0.428%2C0.086l2.683%2C2.688c0.152%2C0.154%2C0.152%2C0.399%2C0%2C0.553l-2.68%2C2.693%20c-0.115%2C0.112-0.279%2C0.147-0.431%2C0.087c-0.141-0.063-0.239-0.205-0.239-0.361V5.296C9.934%2C5.243%2C9.654%2C5.22%2C9.374%2C5.22%20c-2.646%2C0-4.796%2C2.152-4.796%2C4.797s2.154%2C4.798%2C4.796%2C4.798c2.645%2C0%2C4.798-2.153%2C4.798-4.798c0-0.214%2C0.174-0.391%2C0.391-0.391h1.991%20c0.217%2C0%2C0.394%2C0.177%2C0.394%2C0.391C16.947%2C14.19%2C13.549%2C17.592%2C9.374%2C17.592L9.374%2C17.592z%20M9.374%2C17.592%22%2F%3E%3C%2Fsvg%3E%20');\n cursor: move;\n}\n.x6-widget-handle-rotate:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FD6EB6%22%20d%3D%22M9.374%2C17.592c-4.176%2C0-7.57-3.401-7.57-7.575c0-4.175%2C3.395-7.574%2C7.57-7.574c0.28%2C0%2C0.56%2C0.018%2C0.837%2C0.05%20V1.268c0-0.158%2C0.099-0.3%2C0.239-0.36c0.151-0.058%2C0.315-0.026%2C0.428%2C0.086l2.683%2C2.688c0.152%2C0.154%2C0.152%2C0.399%2C0%2C0.553l-2.68%2C2.693%20c-0.115%2C0.112-0.279%2C0.147-0.431%2C0.087c-0.141-0.063-0.239-0.205-0.239-0.361V5.296C9.934%2C5.243%2C9.654%2C5.22%2C9.374%2C5.22%20c-2.646%2C0-4.796%2C2.152-4.796%2C4.797s2.154%2C4.798%2C4.796%2C4.798c2.645%2C0%2C4.798-2.153%2C4.798-4.798c0-0.214%2C0.174-0.391%2C0.391-0.391h1.991%20c0.217%2C0%2C0.394%2C0.177%2C0.394%2C0.391C16.947%2C14.19%2C13.549%2C17.592%2C9.374%2C17.592L9.374%2C17.592z%20M9.374%2C17.592%22%2F%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-resize {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3Csvg%20height%3D%2224px%22%20version%3D%221.1%22%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Asketch%3D%22http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch%2Fns%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Ctitle%2F%3E%3Cdesc%2F%3E%3Cdefs%2F%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20id%3D%22miu%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%3E%3Cg%20id%3D%22Artboard-1%22%20transform%3D%22translate(-251.000000%2C%20-443.000000)%22%3E%3Cg%20id%3D%22slice%22%20transform%3D%22translate(215.000000%2C%20119.000000)%22%2F%3E%3Cpath%20d%3D%22M252%2C448%20L256%2C448%20L256%2C444%20L252%2C444%20L252%2C448%20Z%20M257%2C448%20L269%2C448%20L269%2C446%20L257%2C446%20L257%2C448%20Z%20M257%2C464%20L269%2C464%20L269%2C462%20L257%2C462%20L257%2C464%20Z%20M270%2C444%20L270%2C448%20L274%2C448%20L274%2C444%20L270%2C444%20Z%20M252%2C462%20L252%2C466%20L256%2C466%20L256%2C462%20L252%2C462%20Z%20M270%2C462%20L270%2C466%20L274%2C466%20L274%2C462%20L270%2C462%20Z%20M254%2C461%20L256%2C461%20L256%2C449%20L254%2C449%20L254%2C461%20Z%20M270%2C461%20L272%2C461%20L272%2C449%20L270%2C449%20L270%2C461%20Z%22%20fill%3D%22%236A6C8A%22%20id%3D%22editor-crop-glyph%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E');\n cursor: se-resize;\n}\n.x6-widget-handle-resize:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3Csvg%20height%3D%2224px%22%20version%3D%221.1%22%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Asketch%3D%22http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch%2Fns%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Ctitle%2F%3E%3Cdesc%2F%3E%3Cdefs%2F%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20id%3D%22miu%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%3E%3Cg%20id%3D%22Artboard-1%22%20transform%3D%22translate(-251.000000%2C%20-443.000000)%22%3E%3Cg%20id%3D%22slice%22%20transform%3D%22translate(215.000000%2C%20119.000000)%22%2F%3E%3Cpath%20d%3D%22M252%2C448%20L256%2C448%20L256%2C444%20L252%2C444%20L252%2C448%20Z%20M257%2C448%20L269%2C448%20L269%2C446%20L257%2C446%20L257%2C448%20Z%20M257%2C464%20L269%2C464%20L269%2C462%20L257%2C462%20L257%2C464%20Z%20M270%2C444%20L270%2C448%20L274%2C448%20L274%2C444%20L270%2C444%20Z%20M252%2C462%20L252%2C466%20L256%2C466%20L256%2C462%20L252%2C462%20Z%20M270%2C462%20L270%2C466%20L274%2C466%20L274%2C462%20L270%2C462%20Z%20M254%2C461%20L256%2C461%20L256%2C449%20L254%2C449%20L254%2C461%20Z%20M270%2C461%20L272%2C461%20L272%2C449%20L270%2C449%20L270%2C461%20Z%22%20fill%3D%22%23FD6EB6%22%20id%3D%22editor-crop-glyph%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E');\n}\n.x6-widget-handle-clone {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M12.852%2C0.875h-9.27c-0.853%2C0-1.547%2C0.694-1.547%2C1.547v10.816h1.547V2.422h9.27V0.875z%20M15.172%2C3.965h-8.5%20c-0.849%2C0-1.547%2C0.698-1.547%2C1.547v10.816c0%2C0.849%2C0.698%2C1.547%2C1.547%2C1.547h8.5c0.85%2C0%2C1.543-0.698%2C1.543-1.547V5.512%20C16.715%2C4.663%2C16.021%2C3.965%2C15.172%2C3.965L15.172%2C3.965z%20M15.172%2C16.328h-8.5V5.512h8.5V16.328z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n cursor: move;\n}\n.x6-widget-handle-clone:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cpath%20fill%3D%22%23FD6EB6%22%20d%3D%22M12.852%2C0.875h-9.27c-0.853%2C0-1.547%2C0.694-1.547%2C1.547v10.816h1.547V2.422h9.27V0.875z%20M15.172%2C3.965h-8.5%20c-0.849%2C0-1.547%2C0.698-1.547%2C1.547v10.816c0%2C0.849%2C0.698%2C1.547%2C1.547%2C1.547h8.5c0.849%2C0%2C1.543-0.698%2C1.543-1.547V5.512%20C16.715%2C4.663%2C16.021%2C3.965%2C15.172%2C3.965L15.172%2C3.965z%20M15.172%2C16.328h-8.5V5.512h8.5V16.328z%20M15.172%2C16.328%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-link {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M9.884%2C9.838c0.54-0.551%2C1.005-0.955%2C1.384-1.201c0.463-0.308%2C0.749-0.352%2C0.887-0.352h1.34v1.367%20c0%2C0.104%2C0.061%2C0.2%2C0.154%2C0.242s0.204%2C0.027%2C0.284-0.038l3.168-2.669c0.06-0.051%2C0.096-0.125%2C0.096-0.203S17.16%2C6.83%2C17.101%2C6.781%20l-3.168-2.677c-0.08-0.067-0.19-0.081-0.284-0.038c-0.094%2C0.045-0.154%2C0.139-0.154%2C0.242v1.414h-1.343%20c-1.24%2C0.014-2.215%2C0.67-2.927%2C1.242c-0.797%2C0.65-1.533%2C1.447-2.245%2C2.217c-0.361%2C0.391-0.7%2C0.759-1.044%2C1.1%20c-0.541%2C0.549-1.011%2C0.951-1.395%2C1.199c-0.354%2C0.231-0.678%2C0.357-0.921%2C0.357h-1.8c-0.146%2C0-0.266%2C0.12-0.266%2C0.265v2.029%20c0%2C0.148%2C0.12%2C0.268%2C0.266%2C0.268h1.8l0%2C0c1.255-0.014%2C2.239-0.667%2C2.958-1.24c0.82-0.661%2C1.572-1.475%2C2.297-2.256%20C9.225%2C10.524%2C9.555%2C10.169%2C9.884%2C9.838z%22%2F%3E%3C%2Fsvg%3E%20');\n cursor: move;\n cursor: -moz-grabbing;\n cursor: -webkit-grabbing;\n}\n.x6-widget-handle-link:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FD6EB6%22%20d%3D%22M9.884%2C9.838c0.54-0.551%2C1.005-0.955%2C1.384-1.201c0.463-0.308%2C0.749-0.352%2C0.887-0.352h1.34v1.367%20c0%2C0.104%2C0.061%2C0.2%2C0.154%2C0.242s0.204%2C0.027%2C0.284-0.038l3.168-2.669c0.06-0.051%2C0.096-0.125%2C0.096-0.203S17.16%2C6.83%2C17.101%2C6.781%20l-3.168-2.677c-0.08-0.067-0.19-0.081-0.284-0.038c-0.094%2C0.045-0.154%2C0.139-0.154%2C0.242v1.414h-1.343%20c-1.24%2C0.014-2.215%2C0.67-2.927%2C1.242c-0.797%2C0.65-1.533%2C1.447-2.245%2C2.217c-0.361%2C0.391-0.7%2C0.759-1.044%2C1.1%20c-0.541%2C0.549-1.011%2C0.951-1.395%2C1.199c-0.354%2C0.231-0.678%2C0.357-0.921%2C0.357h-1.8c-0.146%2C0-0.266%2C0.12-0.266%2C0.265v2.029%20c0%2C0.148%2C0.12%2C0.268%2C0.266%2C0.268h1.8l0%2C0c1.255-0.014%2C2.239-0.667%2C2.958-1.24c0.82-0.661%2C1.572-1.475%2C2.297-2.256%20C9.225%2C10.524%2C9.555%2C10.169%2C9.884%2C9.838z%22%2F%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-fork {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cg%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%236A6C8A%22%20d%3D%22M13.307%2C11.593c-0.69%2C0-1.299%2C0.33-1.693%2C0.835l-4.136-2.387%20C7.552%2C9.82%2C7.602%2C9.589%2C7.602%2C9.344c0-0.25-0.051-0.487-0.129-0.71l4.097-2.364c0.393%2C0.536%2C1.022%2C0.888%2C1.737%2C0.888%20c1.193%2C0%2C2.16-0.967%2C2.16-2.159s-0.967-2.159-2.16-2.159c-1.191%2C0-2.158%2C0.967-2.158%2C2.159c0%2C0.076%2C0.014%2C0.149%2C0.021%2C0.223%20L6.848%2C7.716C6.469%2C7.39%2C5.982%2C7.185%2C5.442%2C7.185c-1.191%2C0-2.158%2C0.967-2.158%2C2.159s0.967%2C2.159%2C2.158%2C2.159%20c0.545%2C0%2C1.037-0.208%2C1.417-0.541l4.319%2C2.493c-0.014%2C0.098-0.029%2C0.194-0.029%2C0.296c0%2C1.193%2C0.967%2C2.159%2C2.158%2C2.159%20c1.193%2C0%2C2.16-0.966%2C2.16-2.159C15.467%2C12.559%2C14.5%2C11.593%2C13.307%2C11.593z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n cursor: move;\n}\n.x6-widget-handle-fork:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cg%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23FD6EB6%22%20d%3D%22M13.307%2C11.593c-0.69%2C0-1.299%2C0.33-1.693%2C0.835l-4.136-2.387%20c0.075-0.22%2C0.125-0.452%2C0.125-0.697c0-0.25-0.051-0.487-0.129-0.71l4.097-2.365c0.394%2C0.536%2C1.022%2C0.888%2C1.737%2C0.888%20c1.193%2C0%2C2.16-0.967%2C2.16-2.159s-0.967-2.159-2.16-2.159c-1.191%2C0-2.158%2C0.967-2.158%2C2.159c0%2C0.076%2C0.015%2C0.148%2C0.022%2C0.223%20L6.848%2C7.716C6.469%2C7.39%2C5.981%2C7.185%2C5.442%2C7.185c-1.191%2C0-2.158%2C0.967-2.158%2C2.159s0.967%2C2.159%2C2.158%2C2.159%20c0.545%2C0%2C1.037-0.208%2C1.417-0.541l4.319%2C2.493c-0.013%2C0.098-0.029%2C0.194-0.029%2C0.296c0%2C1.193%2C0.967%2C2.159%2C2.158%2C2.159%20c1.193%2C0%2C2.16-0.966%2C2.16-2.159C15.467%2C12.559%2C14.5%2C11.593%2C13.307%2C11.593z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-unlink {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cg%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M12.285%2C9.711l-2.104-0.302L9.243%2C8.568L6.669%2C7.095C6.948%2C6.6%2C6.995%2C6.026%2C6.845%2C5.474%20c-0.191-0.698-0.695-1.36-1.438-1.786C4.068%2C2.922%2C2.464%2C3.214%2C1.82%2C4.338C1.536%2C4.836%2C1.489%2C5.414%2C1.64%2C5.97%20c0.189%2C0.698%2C0.694%2C1.36%2C1.438%2C1.787c0.328%2C0.187%2C0.67%2C0.31%2C1.01%2C0.372c0.002%2C0%2C0.006%2C0.002%2C0.008%2C0.004%20c0.027%2C0.004%2C0.057%2C0.009%2C0.088%2C0.011c2.12%2C0.316%2C3.203%2C0.915%2C3.73%2C1.337c-0.527%2C0.424-1.61%2C1.021-3.731%2C1.339%20c-0.029%2C0.003-0.058%2C0.007-0.087%2C0.012c-0.002%2C0.002-0.004%2C0.002-0.007%2C0.003c-0.341%2C0.062-0.684%2C0.187-1.013%2C0.374%20c-0.74%2C0.425-1.246%2C1.089-1.437%2C1.787c-0.149%2C0.555-0.105%2C1.133%2C0.181%2C1.632c0.011%2C0.018%2C0.021%2C0.033%2C0.033%2C0.049l0.883%2C0.783%20c0.765%2C0.366%2C1.775%2C0.328%2C2.67-0.184c0.744-0.425%2C1.248-1.088%2C1.439-1.786c0.148-0.552%2C0.104-1.126-0.176-1.62l2.573-1.473%20c0.573%2C0.287%2C2.299%2C1.292%2C2.299%2C1.292s3.602%2C1.445%2C4.241%2C1.812c0.773%2C0.191%2C0.566-0.151%2C0.566-0.151L12.285%2C9.711z%20M5.571%2C6.482%20C5.279%2C6.993%2C4.425%2C7.076%2C3.705%2C6.664C3.282%2C6.424%2C2.966%2C6.039%2C2.856%2C5.64C2.81%2C5.464%2C2.778%2C5.203%2C2.917%2C4.963%20c0.291-0.51%2C1.146-0.593%2C1.866-0.182C5.21%2C5.027%2C5.521%2C5.4%2C5.632%2C5.807C5.679%2C5.98%2C5.708%2C6.242%2C5.571%2C6.482z%20M5.632%2C13.159%20c-0.111%2C0.406-0.422%2C0.778-0.848%2C1.025c-0.719%2C0.409-1.576%2C0.327-1.867-0.184c-0.137-0.239-0.106-0.499-0.06-0.676%20c0.108-0.398%2C0.426-0.781%2C0.847-1.022c0.72-0.412%2C1.574-0.329%2C1.866%2C0.181C5.708%2C12.723%2C5.679%2C12.983%2C5.632%2C13.159z%20M16.181%2C5.139%20c-0.448%2C0.258-4.435%2C1.9-4.435%2C1.9s-1.556%2C0.855-2.104%2C1.13l0.937%2C0.843l2.057-0.229l4.11-3.638%20C16.745%2C5.146%2C17.013%2C4.664%2C16.181%2C5.139z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-unlink:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2218.75px%22%20height%3D%2218.75px%22%20viewBox%3D%220%200%2018.75%2018.75%22%20enable-background%3D%22new%200%200%2018.75%2018.75%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%3E%3Cg%3E%3Cpath%20fill%3D%22%23FD6EB6%22%20d%3D%22M12.285%2C9.711l-2.104-0.302L9.243%2C8.568L6.669%2C7.095C6.948%2C6.6%2C6.995%2C6.026%2C6.845%2C5.474%20c-0.191-0.698-0.695-1.36-1.438-1.786C4.068%2C2.922%2C2.464%2C3.214%2C1.82%2C4.338C1.536%2C4.836%2C1.489%2C5.414%2C1.64%2C5.97%20c0.189%2C0.698%2C0.694%2C1.36%2C1.438%2C1.787c0.328%2C0.187%2C0.67%2C0.31%2C1.01%2C0.372c0.002%2C0%2C0.006%2C0.002%2C0.008%2C0.004%20c0.027%2C0.004%2C0.057%2C0.009%2C0.088%2C0.011c2.12%2C0.316%2C3.203%2C0.915%2C3.73%2C1.337c-0.527%2C0.424-1.61%2C1.021-3.731%2C1.339%20c-0.029%2C0.003-0.058%2C0.007-0.087%2C0.012c-0.002%2C0.002-0.004%2C0.002-0.007%2C0.003c-0.341%2C0.062-0.684%2C0.187-1.013%2C0.374%20c-0.74%2C0.425-1.246%2C1.089-1.437%2C1.787c-0.149%2C0.555-0.105%2C1.133%2C0.181%2C1.632c0.011%2C0.018%2C0.021%2C0.033%2C0.033%2C0.049l0.883%2C0.783%20c0.765%2C0.366%2C1.775%2C0.328%2C2.67-0.184c0.744-0.425%2C1.248-1.088%2C1.439-1.786c0.148-0.552%2C0.104-1.126-0.176-1.62l2.573-1.473%20c0.573%2C0.287%2C2.299%2C1.292%2C2.299%2C1.292s3.602%2C1.445%2C4.241%2C1.812c0.773%2C0.191%2C0.566-0.151%2C0.566-0.151L12.285%2C9.711z%20M5.571%2C6.482%20C5.279%2C6.993%2C4.425%2C7.076%2C3.705%2C6.664C3.282%2C6.424%2C2.966%2C6.039%2C2.856%2C5.64C2.81%2C5.464%2C2.778%2C5.203%2C2.917%2C4.963%20c0.291-0.51%2C1.146-0.593%2C1.866-0.182C5.21%2C5.027%2C5.521%2C5.4%2C5.632%2C5.807C5.679%2C5.98%2C5.708%2C6.242%2C5.571%2C6.482z%20M5.632%2C13.159%20c-0.111%2C0.406-0.422%2C0.778-0.848%2C1.025c-0.719%2C0.409-1.576%2C0.327-1.867-0.184c-0.137-0.239-0.106-0.499-0.06-0.676%20c0.108-0.398%2C0.426-0.781%2C0.847-1.022c0.72-0.412%2C1.574-0.329%2C1.866%2C0.181C5.708%2C12.723%2C5.679%2C12.983%2C5.632%2C13.159z%20M16.181%2C5.139%20c-0.448%2C0.258-4.435%2C1.9-4.435%2C1.9s-1.556%2C0.855-2.104%2C1.13l0.937%2C0.843l2.057-0.229l4.11-3.638%20C16.745%2C5.146%2C17.013%2C4.664%2C16.181%2C5.139z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%20');\n}\n.x6-widget-handle-direction {\n background-image: url(\"data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3C!DOCTYPE%20svg%20%20PUBLIC%20'-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN'%20%20'http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd'%3E%3Csvg%20id%3D%22Layer_1%22%20style%3D%22enable-background%3Anew%200%200%20512%20512%3B%22%20version%3D%221.1%22%20viewBox%3D%220%200%20512%20512%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%236A6C8A%3Bstroke%3A%236A6C8A%3Bstroke-width%3A30%7D%0A%09.dot%7Bfill%3A%236A6C8A%3B%7D%0A%3C%2Fstyle%3E%3Cg%3E%3Cg%20id%3D%22XMLID_475_%22%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M133.1%2C277.1c1.8%2C0%2C3.7-0.6%2C5.4-1.7c4.1-3%2C5-8.7%2C2-12.8c-3-4.1-8.7-5-12.8-2c0%2C0%2C0%2C0%2C0%2C0%20%20%20%20%20c-4.1%2C3-5%2C8.7-2%2C12.8C127.5%2C275.8%2C130.3%2C277.1%2C133.1%2C277.1z%22%20id%3D%22XMLID_489_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M138.5%2C359.6c-4.1-3-9.8-2.1-12.8%2C2c-3%2C4.1-2.1%2C9.8%2C2%2C12.8c1.6%2C1.2%2C3.5%2C1.7%2C5.4%2C1.7%20%20%20%20%20c2.8%2C0%2C5.6-1.3%2C7.4-3.7C143.5%2C368.3%2C142.6%2C362.6%2C138.5%2C359.6z%22%20id%3D%22XMLID_726_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M108.1%2C327.7c-4.8%2C1.6-7.4%2C6.7-5.9%2C11.5c1.3%2C3.9%2C4.8%2C6.3%2C8.7%2C6.3c0.9%2C0%2C1.9-0.1%2C2.8-0.4%20%20%20%20%20c4.8-1.6%2C7.4-6.7%2C5.9-11.5C118%2C328.8%2C112.9%2C326.2%2C108.1%2C327.7z%22%20id%3D%22XMLID_776_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M108.1%2C307.3c0.9%2C0.3%2C1.9%2C0.4%2C2.8%2C0.4c3.8%2C0%2C7.4-2.4%2C8.7-6.3c1.6-4.8-1.1-9.9-5.9-11.5%20%20%20%20%20c-4.8-1.6-9.9%2C1.1-11.5%2C5.9C100.7%2C300.6%2C103.3%2C305.7%2C108.1%2C307.3z%22%20id%3D%22XMLID_777_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M169.2%2C265.4c2.4%2C0%2C4.7-1%2C6.5-2.6c1.7-1.7%2C2.7-4.1%2C2.7-6.5c0-2.4-1-4.8-2.7-6.5%20%20%20%20%20c-1.7-1.7-4.1-2.7-6.5-2.7s-4.7%2C1-6.5%2C2.7c-1.7%2C1.7-2.7%2C4-2.7%2C6.5c0%2C2.4%2C1%2C4.7%2C2.7%2C6.5C164.4%2C264.4%2C166.8%2C265.4%2C169.2%2C265.4z%22%20id%3D%22XMLID_797_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M247.7%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C243.7%2C265.4%2C247.7%2C261.3%2C247.7%2C256.3z%22%20id%3D%22XMLID_798_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M213%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C208.9%2C265.4%2C213%2C261.3%2C213%2C256.3z%22%20id%3D%22XMLID_799_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M317.2%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C313.1%2C265.4%2C317.2%2C261.3%2C317.2%2C256.3z%22%20id%3D%22XMLID_800_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M282.5%2C256.3c0-5-4.1-9.1-9.1-9.1s-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20S282.5%2C261.3%2C282.5%2C256.3z%22%20id%3D%22XMLID_801_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M401.1%2C185.2c0.9%2C0%2C1.9-0.1%2C2.8-0.5c4.8-1.6%2C7.4-6.7%2C5.9-11.5c-1.6-4.8-6.7-7.4-11.5-5.8%20%20%20%20%20c-4.8%2C1.6-7.4%2C6.7-5.8%2C11.5C393.6%2C182.8%2C397.2%2C185.2%2C401.1%2C185.2z%22%20id%3D%22XMLID_802_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M403.9%2C205.2c-4.8-1.6-9.9%2C1-11.5%2C5.9l0%2C0c-1.6%2C4.8%2C1.1%2C9.9%2C5.9%2C11.5%20%20%20%20%20c0.9%2C0.3%2C1.9%2C0.5%2C2.8%2C0.5c3.9%2C0%2C7.4-2.5%2C8.7-6.3c0%2C0%2C0%2C0%2C0%2C0C411.3%2C211.9%2C408.7%2C206.8%2C403.9%2C205.2z%22%20id%3D%22XMLID_803_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M373.5%2C237.2L373.5%2C237.2c-4.1%2C3-5%2C8.7-2%2C12.8c1.8%2C2.4%2C4.6%2C3.7%2C7.4%2C3.7%20%20%20%20%20c1.8%2C0%2C3.7-0.6%2C5.4-1.8c4.1-3%2C4.9-8.7%2C2-12.8C383.3%2C235.1%2C377.6%2C234.2%2C373.5%2C237.2z%22%20id%3D%22XMLID_804_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M373.5%2C152.9c1.6%2C1.2%2C3.5%2C1.8%2C5.4%2C1.8c2.8%2C0%2C5.6-1.3%2C7.4-3.8c3-4.1%2C2.1-9.8-2-12.7%20%20%20%20%20c-4.1-3-9.8-2.1-12.7%2C2C368.5%2C144.2%2C369.4%2C149.9%2C373.5%2C152.9z%22%20id%3D%22XMLID_805_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M342.8%2C247.1c-2.4%2C0-4.8%2C1-6.5%2C2.7c-1.7%2C1.7-2.7%2C4-2.7%2C6.5c0%2C2.4%2C1%2C4.7%2C2.7%2C6.4%20%20%20%20%20c1.7%2C1.7%2C4%2C2.7%2C6.5%2C2.7c2.4%2C0%2C4.7-1%2C6.5-2.7c1.7-1.7%2C2.7-4%2C2.7-6.4c0-2.4-1-4.8-2.7-6.5C347.6%2C248.1%2C345.2%2C247.1%2C342.8%2C247.1z%22%20id%3D%22XMLID_806_%22%2F%3E%0A%3Cpath%20class%3D%22st0%22%20d%3D%22M342.8%2C124.7H206.6l36.4-36.4c3.6-3.6%2C3.6-9.3%2C0-12.9c-3.6-3.6-9.3-3.6-12.9%2C0l-51.5%2C51.5%20%20%20%20%20c-1.9%2C1.9-2.8%2C4.4-2.7%2C6.9c-0.1%2C2.5%2C0.7%2C5%2C2.7%2C6.9l51.5%2C51.5c1.8%2C1.8%2C4.1%2C2.7%2C6.5%2C2.7c2.3%2C0%2C4.7-0.9%2C6.5-2.7%20%20%20%20%20c3.6-3.6%2C3.6-9.3%2C0-12.9l-36.4-36.4h136.1c0%2C0%2C0.1%2C0%2C0.1%2C0c0.6%2C0%2C1.2-0.1%2C1.8-0.2c0.2%2C0%2C0.4-0.1%2C0.6-0.1c0.1%2C0%2C0.2%2C0%2C0.3-0.1%20%20%20%20%20c3.2-1%2C5.6-3.6%2C6.3-6.9c0.1-0.6%2C0.2-1.2%2C0.2-1.8c0-0.6-0.1-1.2-0.2-1.8C351%2C127.8%2C347.3%2C124.7%2C342.8%2C124.7z%22%20id%3D%22XMLID_807_%22%2F%3E%0A%3Cpath%20class%3D%22st0%22%20d%3D%22M322.1%2C371.3l-51.5-51.5c-3.6-3.6-9.3-3.6-12.9%2C0c-3.6%2C3.6-3.6%2C9.3%2C0%2C12.9l36.9%2C36.9H169.2%20%20%20%20%20c-2.8%2C0-5.4%2C1.3-7%2C3.3c-0.1%2C0.1-0.2%2C0.2-0.3%2C0.4c-0.1%2C0.1-0.2%2C0.2-0.2%2C0.3c-0.1%2C0.1-0.1%2C0.2-0.2%2C0.4c-0.1%2C0.1-0.2%2C0.3-0.2%2C0.4%20%20%20%20%20c0%2C0.1-0.1%2C0.2-0.1%2C0.2c-0.1%2C0.2-0.2%2C0.4-0.3%2C0.6c0%2C0%2C0%2C0%2C0%2C0.1c-0.4%2C1.1-0.7%2C2.2-0.7%2C3.4c0%2C1.5%2C0.4%2C2.9%2C1%2C4.2c0%2C0%2C0%2C0.1%2C0.1%2C0.1%20%20%20%20%20c0.1%2C0.1%2C0.1%2C0.2%2C0.2%2C0.3c0.4%2C0.7%2C0.9%2C1.3%2C1.4%2C1.8c0.4%2C0.4%2C0.7%2C0.7%2C1.2%2C1c0.1%2C0.1%2C0.1%2C0.1%2C0.2%2C0.2c0%2C0%2C0.1%2C0%2C0.1%2C0.1%20%20%20%20%20c1.4%2C0.9%2C3.1%2C1.5%2C5%2C1.5h124.4l-36%2C36c-3.6%2C3.6-3.6%2C9.3%2C0%2C12.9c1.8%2C1.8%2C4.1%2C2.7%2C6.5%2C2.7c2.3%2C0%2C4.7-0.9%2C6.5-2.7l51.5-51.5%20%20%20%20%20c1.9-1.9%2C2.8-4.4%2C2.7-6.9C324.8%2C375.7%2C324%2C373.2%2C322.1%2C371.3z%22%20id%3D%22XMLID_808_%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.x6-widget-handle-direction:hover {\n background-image: url(\"data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3C!DOCTYPE%20svg%20%20PUBLIC%20'-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN'%20%20'http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd'%3E%3Csvg%20id%3D%22Layer_1%22%20style%3D%22enable-background%3Anew%200%200%20512%20512%3B%22%20version%3D%221.1%22%20viewBox%3D%220%200%20512%20512%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%23FD6EB6%3Bstroke%3A%23FD6EB6%3Bstroke-width%3A30%7D%0A%09.dot%7Bfill%3A%23FD6EB6%3B%7D%0A%3C%2Fstyle%3E%3Cg%3E%3Cg%20id%3D%22XMLID_475_%22%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M133.1%2C277.1c1.8%2C0%2C3.7-0.6%2C5.4-1.7c4.1-3%2C5-8.7%2C2-12.8c-3-4.1-8.7-5-12.8-2c0%2C0%2C0%2C0%2C0%2C0%20%20%20%20%20c-4.1%2C3-5%2C8.7-2%2C12.8C127.5%2C275.8%2C130.3%2C277.1%2C133.1%2C277.1z%22%20id%3D%22XMLID_489_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M138.5%2C359.6c-4.1-3-9.8-2.1-12.8%2C2c-3%2C4.1-2.1%2C9.8%2C2%2C12.8c1.6%2C1.2%2C3.5%2C1.7%2C5.4%2C1.7%20%20%20%20%20c2.8%2C0%2C5.6-1.3%2C7.4-3.7C143.5%2C368.3%2C142.6%2C362.6%2C138.5%2C359.6z%22%20id%3D%22XMLID_726_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M108.1%2C327.7c-4.8%2C1.6-7.4%2C6.7-5.9%2C11.5c1.3%2C3.9%2C4.8%2C6.3%2C8.7%2C6.3c0.9%2C0%2C1.9-0.1%2C2.8-0.4%20%20%20%20%20c4.8-1.6%2C7.4-6.7%2C5.9-11.5C118%2C328.8%2C112.9%2C326.2%2C108.1%2C327.7z%22%20id%3D%22XMLID_776_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M108.1%2C307.3c0.9%2C0.3%2C1.9%2C0.4%2C2.8%2C0.4c3.8%2C0%2C7.4-2.4%2C8.7-6.3c1.6-4.8-1.1-9.9-5.9-11.5%20%20%20%20%20c-4.8-1.6-9.9%2C1.1-11.5%2C5.9C100.7%2C300.6%2C103.3%2C305.7%2C108.1%2C307.3z%22%20id%3D%22XMLID_777_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M169.2%2C265.4c2.4%2C0%2C4.7-1%2C6.5-2.6c1.7-1.7%2C2.7-4.1%2C2.7-6.5c0-2.4-1-4.8-2.7-6.5%20%20%20%20%20c-1.7-1.7-4.1-2.7-6.5-2.7s-4.7%2C1-6.5%2C2.7c-1.7%2C1.7-2.7%2C4-2.7%2C6.5c0%2C2.4%2C1%2C4.7%2C2.7%2C6.5C164.4%2C264.4%2C166.8%2C265.4%2C169.2%2C265.4z%22%20id%3D%22XMLID_797_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M247.7%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C243.7%2C265.4%2C247.7%2C261.3%2C247.7%2C256.3z%22%20id%3D%22XMLID_798_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M213%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C208.9%2C265.4%2C213%2C261.3%2C213%2C256.3z%22%20id%3D%22XMLID_799_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M317.2%2C256.3c0-5-4.1-9.1-9.1-9.1c-5%2C0-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20C313.1%2C265.4%2C317.2%2C261.3%2C317.2%2C256.3z%22%20id%3D%22XMLID_800_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M282.5%2C256.3c0-5-4.1-9.1-9.1-9.1s-9.1%2C4.1-9.1%2C9.1c0%2C5%2C4.1%2C9.1%2C9.1%2C9.1%20%20%20%20%20S282.5%2C261.3%2C282.5%2C256.3z%22%20id%3D%22XMLID_801_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M401.1%2C185.2c0.9%2C0%2C1.9-0.1%2C2.8-0.5c4.8-1.6%2C7.4-6.7%2C5.9-11.5c-1.6-4.8-6.7-7.4-11.5-5.8%20%20%20%20%20c-4.8%2C1.6-7.4%2C6.7-5.8%2C11.5C393.6%2C182.8%2C397.2%2C185.2%2C401.1%2C185.2z%22%20id%3D%22XMLID_802_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M403.9%2C205.2c-4.8-1.6-9.9%2C1-11.5%2C5.9l0%2C0c-1.6%2C4.8%2C1.1%2C9.9%2C5.9%2C11.5%20%20%20%20%20c0.9%2C0.3%2C1.9%2C0.5%2C2.8%2C0.5c3.9%2C0%2C7.4-2.5%2C8.7-6.3c0%2C0%2C0%2C0%2C0%2C0C411.3%2C211.9%2C408.7%2C206.8%2C403.9%2C205.2z%22%20id%3D%22XMLID_803_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M373.5%2C237.2L373.5%2C237.2c-4.1%2C3-5%2C8.7-2%2C12.8c1.8%2C2.4%2C4.6%2C3.7%2C7.4%2C3.7%20%20%20%20%20c1.8%2C0%2C3.7-0.6%2C5.4-1.8c4.1-3%2C4.9-8.7%2C2-12.8C383.3%2C235.1%2C377.6%2C234.2%2C373.5%2C237.2z%22%20id%3D%22XMLID_804_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M373.5%2C152.9c1.6%2C1.2%2C3.5%2C1.8%2C5.4%2C1.8c2.8%2C0%2C5.6-1.3%2C7.4-3.8c3-4.1%2C2.1-9.8-2-12.7%20%20%20%20%20c-4.1-3-9.8-2.1-12.7%2C2C368.5%2C144.2%2C369.4%2C149.9%2C373.5%2C152.9z%22%20id%3D%22XMLID_805_%22%2F%3E%0A%3Cpath%20class%3D%22dot%22%20d%3D%22M342.8%2C247.1c-2.4%2C0-4.8%2C1-6.5%2C2.7c-1.7%2C1.7-2.7%2C4-2.7%2C6.5c0%2C2.4%2C1%2C4.7%2C2.7%2C6.4%20%20%20%20%20c1.7%2C1.7%2C4%2C2.7%2C6.5%2C2.7c2.4%2C0%2C4.7-1%2C6.5-2.7c1.7-1.7%2C2.7-4%2C2.7-6.4c0-2.4-1-4.8-2.7-6.5C347.6%2C248.1%2C345.2%2C247.1%2C342.8%2C247.1z%22%20id%3D%22XMLID_806_%22%2F%3E%0A%3Cpath%20class%3D%22st0%22%20d%3D%22M342.8%2C124.7H206.6l36.4-36.4c3.6-3.6%2C3.6-9.3%2C0-12.9c-3.6-3.6-9.3-3.6-12.9%2C0l-51.5%2C51.5%20%20%20%20%20c-1.9%2C1.9-2.8%2C4.4-2.7%2C6.9c-0.1%2C2.5%2C0.7%2C5%2C2.7%2C6.9l51.5%2C51.5c1.8%2C1.8%2C4.1%2C2.7%2C6.5%2C2.7c2.3%2C0%2C4.7-0.9%2C6.5-2.7%20%20%20%20%20c3.6-3.6%2C3.6-9.3%2C0-12.9l-36.4-36.4h136.1c0%2C0%2C0.1%2C0%2C0.1%2C0c0.6%2C0%2C1.2-0.1%2C1.8-0.2c0.2%2C0%2C0.4-0.1%2C0.6-0.1c0.1%2C0%2C0.2%2C0%2C0.3-0.1%20%20%20%20%20c3.2-1%2C5.6-3.6%2C6.3-6.9c0.1-0.6%2C0.2-1.2%2C0.2-1.8c0-0.6-0.1-1.2-0.2-1.8C351%2C127.8%2C347.3%2C124.7%2C342.8%2C124.7z%22%20id%3D%22XMLID_807_%22%2F%3E%0A%3Cpath%20class%3D%22st0%22%20d%3D%22M322.1%2C371.3l-51.5-51.5c-3.6-3.6-9.3-3.6-12.9%2C0c-3.6%2C3.6-3.6%2C9.3%2C0%2C12.9l36.9%2C36.9H169.2%20%20%20%20%20c-2.8%2C0-5.4%2C1.3-7%2C3.3c-0.1%2C0.1-0.2%2C0.2-0.3%2C0.4c-0.1%2C0.1-0.2%2C0.2-0.2%2C0.3c-0.1%2C0.1-0.1%2C0.2-0.2%2C0.4c-0.1%2C0.1-0.2%2C0.3-0.2%2C0.4%20%20%20%20%20c0%2C0.1-0.1%2C0.2-0.1%2C0.2c-0.1%2C0.2-0.2%2C0.4-0.3%2C0.6c0%2C0%2C0%2C0%2C0%2C0.1c-0.4%2C1.1-0.7%2C2.2-0.7%2C3.4c0%2C1.5%2C0.4%2C2.9%2C1%2C4.2c0%2C0%2C0%2C0.1%2C0.1%2C0.1%20%20%20%20%20c0.1%2C0.1%2C0.1%2C0.2%2C0.2%2C0.3c0.4%2C0.7%2C0.9%2C1.3%2C1.4%2C1.8c0.4%2C0.4%2C0.7%2C0.7%2C1.2%2C1c0.1%2C0.1%2C0.1%2C0.1%2C0.2%2C0.2c0%2C0%2C0.1%2C0%2C0.1%2C0.1%20%20%20%20%20c1.4%2C0.9%2C3.1%2C1.5%2C5%2C1.5h124.4l-36%2C36c-3.6%2C3.6-3.6%2C9.3%2C0%2C12.9c1.8%2C1.8%2C4.1%2C2.7%2C6.5%2C2.7c2.3%2C0%2C4.7-0.9%2C6.5-2.7l51.5-51.5%20%20%20%20%20c1.9-1.9%2C2.8-4.4%2C2.7-6.9C324.8%2C375.7%2C324%2C373.2%2C322.1%2C371.3z%22%20id%3D%22XMLID_808_%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.x6-widget-handle-surround .x6-widget-handle-animate .x6-widget-handle {\n transition: background-size 80ms, width 80ms, height 80ms, top 150ms, left 150ms, bottom 150ms, right 150ms;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-se {\n right: -25px;\n bottom: -25px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-nw {\n top: -21px;\n left: -25px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-n {\n top: -22px;\n left: 50%;\n margin-left: -10px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-e {\n top: -webkit-calc(40%);\n top: calc(50% - 10px);\n right: -25px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-ne {\n top: -21px;\n right: -25px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-w {\n top: 50%;\n left: -25px;\n margin-top: -10px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-sw {\n bottom: -25px;\n left: -25px;\n}\n.x6-widget-handle-surround .x6-widget-handle-pos-s {\n bottom: -24px;\n left: 50%;\n margin-left: -10px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle {\n width: 15px;\n height: 15px;\n font-size: 15px;\n background-size: 15px 15px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-se {\n right: -19px;\n bottom: -19px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-nw {\n top: -19px;\n left: -19px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-n {\n top: -19px;\n margin-left: -7.5px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-e {\n top: -webkit-calc(42%);\n top: calc(50% - 8px);\n right: -19px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-ne {\n top: -19px;\n right: -19px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-w {\n left: -19px;\n margin-top: -8px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-sw {\n bottom: -19px;\n left: -19px;\n}\n.x6-widget-handle-surround .x6-widget-handle-small .x6-widget-handle-pos-s {\n bottom: -19px;\n margin-left: -7.5px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle {\n width: 10px;\n height: 10px;\n font-size: 10px;\n background-size: 10px 10px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-se {\n right: -15px;\n bottom: -13px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-nw {\n top: -13px;\n left: -15px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-n {\n top: -13px;\n margin-left: -5px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-e {\n top: -webkit-calc(45%);\n top: calc(50% - 5px);\n right: -15px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-ne {\n top: -13px;\n right: -15px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-w {\n left: -15px;\n margin-top: -5px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-sw {\n bottom: -13px;\n left: -15px;\n}\n.x6-widget-handle-surround .x6-widget-handle-tiny .x6-widget-handle-pos-s {\n bottom: -13px;\n margin-left: -5px;\n}\n.x6-widget-handle-toolbar {\n position: absolute;\n top: -50px;\n display: table-row;\n padding: 7px 5px;\n}\n.x6-widget-handle-toolbar::after {\n position: absolute;\n top: 100%;\n left: 10px;\n width: 0;\n height: 0;\n margin-top: 4px;\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n content: '';\n}\n.x6-widget-handle-toolbar .x6-widget-handle {\n position: relative;\n display: table-cell;\n min-width: 20px;\n margin: 0 2px;\n background-position: 3px 3px;\n background-size: 16px 16px;\n}\n.x6-widget-handle-toolbar .x6-widget-handle::after {\n position: absolute;\n bottom: -11px;\n width: 100%;\n content: '';\n}\n.x6-widget-handle-pie {\n position: absolute;\n top: -webkit-calc(0%);\n top: calc(50% - 50px);\n right: -50px;\n z-index: 1;\n display: none;\n width: 100px;\n height: 100px;\n margin: -2px -2px 0 0;\n border-radius: 50%;\n cursor: default;\n pointer-events: visiblePainted;\n}\n.x6-widget-handle-pie .x6-widget-handle {\n width: 1px;\n height: auto;\n pointer-events: visiblePainted;\n}\n.x6-widget-handle-pie-slice-svg {\n width: 100%;\n height: 100%;\n overflow: visible !important;\n}\n.x6-widget-handle-pie-slice-img,\n.x6-widget-handle-pie-slice-txt {\n display: none;\n pointer-events: none;\n}\n.x6-widget-handle-pie[data-pie-toggle-position='e'] {\n top: calc(50% - 50px);\n right: -50px;\n left: auto;\n}\n.x6-widget-handle-pie[data-pie-toggle-position='w'] {\n top: calc(50% - 50px);\n right: auto;\n left: -52px;\n}\n.x6-widget-handle-pie[data-pie-toggle-position='n'] {\n top: -50px;\n right: auto;\n bottom: auto;\n left: calc(50% - 52px);\n}\n.x6-widget-handle-pie[data-pie-toggle-position='s'] {\n top: auto;\n right: auto;\n bottom: -52px;\n left: calc(50% - 52px);\n}\n.x6-widget-handle-pie-opened {\n display: block;\n animation: halo-pie-visibility 0.1s, halo-pie-opening 0.1s;\n animation-timing-function: step-end, ease;\n animation-delay: 0s, 0.1s;\n}\n.x6-widget-handle-pie-toggle {\n position: absolute;\n top: -webkit-calc(35%);\n top: calc(50% - 15px);\n right: -15px;\n z-index: 2;\n display: block;\n box-sizing: border-box;\n width: 30px;\n height: 30px;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 20px 20px;\n border-radius: 50%;\n cursor: pointer;\n user-select: none;\n pointer-events: visiblePainted;\n -webkit-user-drag: none;\n user-drag: none;\n /* stylelint-disable-line */\n}\n.x6-widget-handle-pie-toggle-pos-e {\n top: -webkit-calc(35%);\n top: calc(50% - 15px);\n right: -15px;\n bottom: auto;\n left: auto;\n}\n.x6-widget-handle-pie-toggle-pos-w {\n top: -webkit-calc(35%);\n top: calc(50% - 15px);\n right: auto;\n bottom: auto;\n left: -15px;\n}\n.x6-widget-handle-pie-toggle-pos-n {\n top: -15px;\n right: auto;\n bottom: auto;\n left: -webkit-calc(35%);\n left: calc(50% - 15px);\n}\n.x6-widget-handle-pie-toggle-pos-s {\n top: auto;\n right: auto;\n bottom: -15px;\n left: -webkit-calc(35%);\n left: calc(50% - 15px);\n}\n.x6-widget-handle-pie-toggle-opened {\n transition: 0.1s background-image;\n}\n.x6-widget-handle-toolbar {\n position: static;\n display: inline-block;\n margin-top: -50px;\n margin-left: 45px;\n white-space: nowrap;\n vertical-align: top;\n background-color: #f5f5f5;\n border-bottom: 3px solid #333;\n border-radius: 5px;\n box-shadow: 0 1px 2px #222;\n}\n.x6-widget-handle-toolbar::after {\n top: -12px;\n left: 55px;\n margin-top: 0;\n border-top: 6px solid #333;\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n}\n.x6-widget-handle-toolbar .x6-widget-handle {\n display: inline-block;\n vertical-align: top;\n}\n.x6-widget-handle-toolbar .x6-widget-handle:hover::after {\n border-bottom: 4px solid #fc6cb8;\n}\n.x6-widget-handle-toolbar .x6-widget-handle-rotate {\n position: absolute;\n top: 100%;\n right: 100%;\n margin-top: 3px;\n margin-right: 6px;\n}\n.x6-widget-handle-toolbar .x6-widget-handle-remove:hover::after,\n.x6-widget-handle-toolbar .x6-widget-handle-rotate:hover::after {\n border-bottom: none;\n}\n.x6-widget-handle-toolbar .x6-widget-handle + .x6-widget-handle {\n margin-left: 4px;\n}\n.x6-widget-handle-pie {\n box-sizing: content-box;\n background-color: #f5f5f5;\n border: 2px solid #404040;\n}\n.x6-widget-handle-pie-slice {\n fill: transparent;\n stroke: #e9e9e9;\n stroke-width: 1;\n}\n.x6-widget-handle-pie-slice:hover {\n fill: #fff;\n}\n.x6-widget-handle-pie-slice-img {\n display: block;\n}\n.x6-widget-handle-selected .x6-widget-handle-pie-slice {\n fill: #fff;\n}\n.x6-widget-handle-pie-toggle {\n background-color: #f6f6f6;\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20height%3D%2216px%22%20id%3D%22Layer_1%22%20style%3D%22enable-background%3Anew%200%200%2016%2016%3B%22%20version%3D%221.1%22%20viewBox%3D%220%200%2016%2016%22%20width%3D%2216px%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cpath%20fill%3D%22%236A6C8A%22%20d%3D%22M15%2C6h-5V1c0-0.55-0.45-1-1-1H7C6.45%2C0%2C6%2C0.45%2C6%2C1v5H1C0.45%2C6%2C0%2C6.45%2C0%2C7v2c0%2C0.55%2C0.45%2C1%2C1%2C1h5v5c0%2C0.55%2C0.45%2C1%2C1%2C1h2%20c0.55%2C0%2C1-0.45%2C1-1v-5h5c0.55%2C0%2C1-0.45%2C1-1V7C16%2C6.45%2C15.55%2C6%2C15%2C6z%22%2F%3E%3C%2Fsvg%3E');\n background-size: 16px 16px;\n border: 2px solid #3b425f;\n}\n.x6-widget-handle-pie-toggle:hover {\n background-color: #fff;\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20height%3D%2216px%22%20id%3D%22Layer_1%22%20style%3D%22enable-background%3Anew%200%200%2016%2016%3B%22%20version%3D%221.1%22%20viewBox%3D%220%200%2016%2016%22%20width%3D%2216px%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cpath%20fill%3D%22%23FD6EB6%22%20d%3D%22M15%2C6h-5V1c0-0.55-0.45-1-1-1H7C6.45%2C0%2C6%2C0.45%2C6%2C1v5H1C0.45%2C6%2C0%2C6.45%2C0%2C7v2c0%2C0.55%2C0.45%2C1%2C1%2C1h5v5c0%2C0.55%2C0.45%2C1%2C1%2C1h2%20c0.55%2C0%2C1-0.45%2C1-1v-5h5c0.55%2C0%2C1-0.45%2C1-1V7C16%2C6.45%2C15.55%2C6%2C15%2C6z%22%2F%3E%3C%2Fsvg%3E');\n border-color: #fd6eb6;\n}\n.x6-widget-handle-pie-toggle-opened {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%3Csvg%20xmlns%3Adc%3D%22http%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%22%20xmlns%3Acc%3D%22http%3A%2F%2Fcreativecommons.org%2Fns%23%22%20xmlns%3Ardf%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%22%20xmlns%3Asvg%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20id%3D%22Layer_1%22%20xml%3Aspace%3D%22preserve%22%3E%3Cmetadata%20id%3D%22metadata9%22%3E%3Crdf%3ARDF%3E%3Ccc%3AWork%20rdf%3Aabout%3D%22%22%3E%3Cdc%3Aformat%3Eimage%2Fsvg%2Bxml%3C%2Fdc%3Aformat%3E%3Cdc%3Atype%20rdf%3Aresource%3D%22http%3A%2F%2Fpurl.org%2Fdc%2Fdcmitype%2FStillImage%22%20%2F%3E%3Cdc%3Atitle%3E%3C%2Fdc%3Atitle%3E%3C%2Fcc%3AWork%3E%3C%2Frdf%3ARDF%3E%3C%2Fmetadata%3E%3Cdefs%20id%3D%22defs7%22%20%2F%3E%3Cpath%20d%3D%22M%2015%2C6%2010%2C6%20C%201.0301983%2C6.00505%2015.002631%2C6.011353%206%2C6%20L%201%2C6%20C%200.45%2C6%200%2C6.45%200%2C7%20l%200%2C2%20c%200%2C0.55%200.45%2C1%201%2C1%20l%205%2C0%20c%208.988585%2C-0.019732%20-5.02893401%2C-0.018728%204%2C0%20l%205%2C0%20c%200.55%2C0%201%2C-0.45%201%2C-1%20L%2016%2C7%20C%2016%2C6.45%2015.55%2C6%2015%2C6%20z%22%20id%3D%22path3%22%20style%3D%22fill%3A%236a6c8a%22%20%2F%3E%3C%2Fsvg%3E');\n}\n.x6-widget-handle-pie-toggle-opened:hover {\n background-image: url('data:image/svg+xml;charset=utf8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%3Csvg%20xmlns%3Adc%3D%22http%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%22%20xmlns%3Acc%3D%22http%3A%2F%2Fcreativecommons.org%2Fns%23%22%20xmlns%3Ardf%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%22%20xmlns%3Asvg%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20id%3D%22Layer_1%22%20xml%3Aspace%3D%22preserve%22%3E%3Cmetadata%20id%3D%22metadata9%22%3E%3Crdf%3ARDF%3E%3Ccc%3AWork%20rdf%3Aabout%3D%22%22%3E%3Cdc%3Aformat%3Eimage%2Fsvg%2Bxml%3C%2Fdc%3Aformat%3E%3Cdc%3Atype%20rdf%3Aresource%3D%22http%3A%2F%2Fpurl.org%2Fdc%2Fdcmitype%2FStillImage%22%20%2F%3E%3Cdc%3Atitle%3E%3C%2Fdc%3Atitle%3E%3C%2Fcc%3AWork%3E%3C%2Frdf%3ARDF%3E%3C%2Fmetadata%3E%3Cdefs%20id%3D%22defs7%22%20%2F%3E%3Cpath%20d%3D%22M%2015%2C6%2010%2C6%20C%201.0301983%2C6.00505%2015.002631%2C6.011353%206%2C6%20L%201%2C6%20C%200.45%2C6%200%2C6.45%200%2C7%20l%200%2C2%20c%200%2C0.55%200.45%2C1%201%2C1%20l%205%2C0%20c%208.988585%2C-0.019732%20-5.02893401%2C-0.018728%204%2C0%20l%205%2C0%20c%200.55%2C0%201%2C-0.45%201%2C-1%20L%2016%2C7%20C%2016%2C6.45%2015.55%2C6%2015%2C6%20z%22%20id%3D%22path3%22%20style%3D%22fill%3A%23FD6EB6%22%20%2F%3E%3C%2Fsvg%3E');\n}\n.x6-widget-dnd {\n position: absolute;\n top: -10000px;\n left: -10000px;\n z-index: 999999;\n display: none;\n cursor: move;\n opacity: 0.7;\n pointer-events: 'cursor';\n}\n.x6-widget-dnd.dragging {\n display: inline-block;\n}\n.x6-widget-dnd.dragging * {\n pointer-events: none !important;\n}\n.x6-widget-dnd .x6-graph {\n background: transparent;\n box-shadow: none;\n}\n.x6-widget-halo {\n position: absolute;\n pointer-events: none;\n}\n.x6-widget-halo-content {\n position: absolute;\n top: 100%;\n padding: 6px;\n font-size: 10px;\n line-height: 14px;\n text-align: center;\n border-radius: 6px;\n}\n.x6-widget-halo-handles + .x6-widget-halo-content {\n right: -20px;\n left: -20px;\n margin-top: 30px;\n}\n.x6-widget-halo-handles.x6-widget-handle-small + .x6-widget-halo-content {\n margin-top: 25px;\n}\n.x6-widget-halo-handles.x6-widget-handle-small + .x6-widget-halo-content {\n margin-top: 20px;\n}\n.x6-widget-halo-handles.x6-widget-handle-pie + .x6-widget-halo-content {\n right: 0;\n left: 0;\n margin-top: 10px;\n}\n.x6-widget-halo-content {\n color: #fff;\n background-color: #6a6b8a;\n}\n.x6-widget-halo.type-node .x6-widget-handle-toolbar .x6-widget-handle-remove {\n position: absolute;\n right: 100%;\n bottom: 100%;\n margin-right: 6px;\n margin-bottom: 3px;\n}\n.x6-widget-halo.type-edge .x6-widget-handle-surround .x6-widget-handle-remove {\n background-color: #fff;\n border-radius: 50%;\n}\n.x6-widget-halo.type-edge .x6-widget-handle-toolbar {\n margin-top: -60px;\n margin-left: -18px;\n}\n.x6-widget-halo.type-edge .x6-widget-handle-toolbar::after {\n top: -22px;\n left: -9px;\n}\n.x6-widget-minimap {\n position: relative;\n display: table-cell;\n box-sizing: border-box;\n overflow: hidden;\n text-align: center;\n vertical-align: middle;\n background-color: #fff;\n user-select: none;\n}\n.x6-widget-minimap .x6-graph {\n display: inline-block;\n box-shadow: 0 0 4px 0 #eee;\n cursor: pointer;\n}\n.x6-widget-minimap .x6-graph > svg {\n pointer-events: none;\n shape-rendering: optimizeSpeed;\n}\n.x6-widget-minimap .x6-graph .x6-node * {\n /* stylelint-disable-next-line */\n vector-effect: initial;\n}\n.x6-widget-minimap-viewport {\n position: absolute;\n box-sizing: content-box !important;\n margin: -2px 0 0 -2px;\n border: 2px solid #31d0c6;\n cursor: move;\n}\n.x6-widget-minimap-viewport-zoom {\n position: absolute;\n right: 0;\n bottom: 0;\n box-sizing: border-box;\n width: 12px;\n height: 12px;\n margin: 0 -6px -6px 0;\n background-color: #fff;\n border: 2px solid #31d0c6;\n border-radius: 50%;\n cursor: nwse-resize;\n}\n.x6-graph-scroller {\n position: relative;\n box-sizing: border-box;\n overflow: scroll;\n outline: none;\n}\n.x6-graph-scroller-content {\n position: relative;\n}\n.x6-graph-scroller-background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.x6-graph-scroller .x6-graph {\n position: absolute;\n display: inline-block;\n margin: 0;\n box-shadow: none;\n}\n.x6-graph-scroller .x6-graph > svg {\n display: block;\n}\n.x6-graph-scroller.x6-graph-scroller-paged .x6-graph {\n box-shadow: 0 0 4px 0 #eee;\n}\n.x6-graph-scroller.x6-graph-scroller-pannable[data-panning='false'] {\n cursor: grab;\n cursor: -moz-grab;\n cursor: -webkit-grab;\n}\n.x6-graph-scroller.x6-graph-scroller-pannable[data-panning='true'] {\n cursor: grabbing;\n cursor: -moz-grabbing;\n cursor: -webkit-grabbing;\n user-select: none;\n}\n.x6-graph-pagebreak {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.x6-graph-pagebreak-vertical {\n position: absolute;\n top: 0;\n bottom: 0;\n box-sizing: border-box;\n width: 1px;\n border-left: 1px dashed #bdbdbd;\n}\n.x6-graph-pagebreak-horizontal {\n position: absolute;\n right: 0;\n left: 0;\n box-sizing: border-box;\n height: 1px;\n border-top: 1px dashed #bdbdbd;\n}\n.x6-widget-selection {\n position: absolute;\n display: none;\n width: 0;\n height: 0;\n touch-action: none;\n}\n.x6-widget-selection-rubberband {\n display: block;\n overflow: visible;\n opacity: 0.3;\n}\n.x6-widget-selection-selected {\n display: block;\n}\n.x6-widget-selection-box {\n cursor: move;\n}\n.x6-widget-selection-inner[data-selection-length='0'],\n.x6-widget-selection-inner[data-selection-length='1'] {\n display: none;\n}\n.x6-widget-selection-content {\n position: absolute;\n top: 100%;\n right: -20px;\n left: -20px;\n margin-top: 30px;\n padding: 6px;\n line-height: 14px;\n text-align: center;\n border-radius: 6px;\n}\n.x6-widget-selection-content:empty {\n display: none;\n}\n.x6-widget-selection-rubberband {\n background-color: #3498db;\n border: 2px solid #2980b9;\n}\n.x6-widget-selection-box {\n box-sizing: content-box !important;\n margin-top: -4px;\n margin-left: -4px;\n padding-right: 4px;\n padding-bottom: 4px;\n border: 2px dashed #feb663;\n box-shadow: 2px 2px 5px #d3d3d3;\n}\n.x6-widget-selection-inner {\n box-sizing: content-box !important;\n margin-top: -8px;\n margin-left: -8px;\n padding-right: 12px;\n padding-bottom: 12px;\n border: 2px solid #feb663;\n box-shadow: 2px 2px 5px #d3d3d3;\n}\n.x6-widget-selection-content {\n color: #fff;\n font-size: 10px;\n background-color: #6a6b8a;\n}\n.x6-widget-snapline {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n}\n.x6-widget-snapline-vertical,\n.x6-widget-snapline-horizontal {\n position: absolute;\n opacity: 1;\n pointer-events: none;\n}\n.x6-widget-snapline-horizontal {\n border-bottom: 1px solid #2ecc71;\n}\n.x6-widget-snapline-vertical {\n border-right: 1px solid #2ecc71;\n}\n.x6-widget-stencil {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.x6-widget-stencil::after {\n position: absolute;\n top: 0;\n display: block;\n width: 100%;\n height: 20px;\n padding: 8px 0;\n line-height: 20px;\n text-align: center;\n opacity: 0;\n transition: top 0.1s linear, opacity 0.1s linear;\n content: ' ';\n pointer-events: none;\n}\n.x6-widget-stencil-content {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n height: auto;\n overflow-x: hidden;\n overflow-y: auto;\n}\n.x6-widget-stencil .x6-node [magnet]:not([magnet='passive']) {\n pointer-events: none;\n}\n.x6-widget-stencil-group {\n padding: 0;\n padding-bottom: 8px;\n overflow: hidden;\n user-select: none;\n}\n.x6-widget-stencil-group.collapsed {\n height: auto;\n padding-bottom: 0;\n}\n.x6-widget-stencil-group-title {\n position: relative;\n margin-top: 0;\n margin-bottom: 0;\n padding: 4px;\n cursor: pointer;\n}\n.x6-widget-stencil-title,\n.x6-widget-stencil-group > .x6-widget-stencil-group-title {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n user-select: none;\n}\n.x6-widget-stencil .unmatched {\n opacity: 0.3;\n}\n.x6-widget-stencil .x6-node.unmatched {\n display: none;\n}\n.x6-widget-stencil-group.unmatched {\n display: none;\n}\n.x6-widget-stencil-search-text {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n width: 100%;\n height: 30px;\n max-height: 30px;\n line-height: 30px;\n outline: 0;\n}\n.x6-widget-stencil.not-found::after {\n opacity: 1;\n content: attr(data-not-found-text);\n}\n.x6-widget-stencil.not-found.searchable::after {\n top: 30px;\n}\n.x6-widget-stencil.not-found.searchable.collapsable::after {\n top: 50px;\n}\n.x6-widget-stencil {\n color: #333;\n background: #f5f5f5;\n}\n.x6-widget-stencil-content {\n position: absolute;\n}\n.x6-widget-stencil.collapsable > .x6-widget-stencil-content {\n top: 32px;\n}\n.x6-widget-stencil.searchable > .x6-widget-stencil-content {\n top: 80px;\n}\n.x6-widget-stencil.not-found::after {\n position: absolute;\n}\n.x6-widget-stencil.not-found.searchable.collapsable::after {\n top: 80px;\n}\n.x6-widget-stencil.not-found.searchable::after {\n top: 60px;\n}\n.x6-widget-stencil-group {\n height: auto;\n margin-bottom: 1px;\n padding: 0;\n transition: none;\n}\n.x6-widget-stencil-group .x6-graph {\n background: transparent;\n box-shadow: none;\n}\n.x6-widget-stencil-group.collapsed {\n height: auto;\n max-height: 31px;\n}\n.x6-widget-stencil-title,\n.x6-widget-stencil-group > .x6-widget-stencil-group-title {\n position: relative;\n left: 0;\n box-sizing: border-box;\n width: 100%;\n height: 32px;\n padding: 0 5px 0 8px;\n color: #666;\n font-weight: 700;\n font-size: 12px;\n line-height: 32px;\n cursor: default;\n transition: all 0.3;\n}\n.x6-widget-stencil-title:hover,\n.x6-widget-stencil-group > .x6-widget-stencil-group-title:hover {\n color: #444;\n}\n.x6-widget-stencil-title {\n background: #e9e9e9;\n}\n.x6-widget-stencil-group > .x6-widget-stencil-group-title {\n background: #ededed;\n}\n.x6-widget-stencil.collapsable > .x6-widget-stencil-title,\n.x6-widget-stencil-group.collapsable > .x6-widget-stencil-group-title {\n padding-left: 32px;\n cursor: pointer;\n}\n.x6-widget-stencil.collapsable > .x6-widget-stencil-title::before,\n.x6-widget-stencil-group.collapsable > .x6-widget-stencil-group-title::before {\n position: absolute;\n top: 6px;\n left: 8px;\n display: block;\n width: 18px;\n height: 18px;\n margin: 0;\n padding: 0;\n background-color: transparent;\n background-repeat: no-repeat;\n background-position: 0 0;\n border: none;\n content: ' ';\n}\n.x6-widget-stencil.collapsable > .x6-widget-stencil-title::before,\n.x6-widget-stencil-group.collapsable > .x6-widget-stencil-group-title::before {\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIj48cGF0aCBkPSJNOS4zNzUuNUM0LjY4Ny41Ljg3NSA0LjMxMy44NzUgOWMwIDQuNjg4IDMuODEyIDguNSA4LjUgOC41IDQuNjg3IDAgOC41LTMuODEyIDguNS04LjUgMC00LjY4Ny0zLjgxMy04LjUtOC41LTguNXptMCAxNS44ODZDNS4zMDMgMTYuMzg2IDEuOTkgMTMuMDcyIDEuOTkgOXMzLjMxMi03LjM4NSA3LjM4NS03LjM4NVMxNi43NiA0LjkyOCAxNi43NiA5YzAgNC4wNzItMy4zMTMgNy4zODYtNy4zODUgNy4zODZ6Ii8+PHBhdGggZD0iTTEyLjc1MyA4LjQ0M0g1Ljk5N2EuNTU4LjU1OCAwIDAwMCAxLjExNmg2Ljc1NmEuNTU4LjU1OCAwIDAwMC0xLjExNnoiLz48L2c+PC9zdmc+');\n opacity: 0.4;\n transition: all 0.3s;\n}\n.x6-widget-stencil.collapsable > .x6-widget-stencil-title:hover::before,\n.x6-widget-stencil-group.collapsable > .x6-widget-stencil-group-title:hover::before {\n opacity: 0.6;\n}\n.x6-widget-stencil.collapsable.collapsed > .x6-widget-stencil-title::before,\n.x6-widget-stencil-group.collapsable.collapsed > .x6-widget-stencil-group-title::before {\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIj48cGF0aCBkPSJNOS4zNzUuNUM0LjY4Ny41Ljg3NSA0LjMxMy44NzUgOWMwIDQuNjg4IDMuODEyIDguNSA4LjUgOC41IDQuNjg3IDAgOC41LTMuODEyIDguNS04LjUgMC00LjY4Ny0zLjgxMy04LjUtOC41LTguNXptMCAxNS44ODZDNS4zMDMgMTYuMzg2IDEuOTkgMTMuMDcyIDEuOTkgOXMzLjMxMi03LjM4NSA3LjM4NS03LjM4NVMxNi43NiA0LjkyOCAxNi43NiA5YzAgNC4wNzItMy4zMTMgNy4zODYtNy4zODUgNy4zODZ6Ii8+PHBhdGggZD0iTTEyLjc1MyA4LjQ0M0g1Ljk5N2EuNTU4LjU1OCAwIDAwMCAxLjExNmg2Ljc1NmEuNTU4LjU1OCAwIDAwMC0xLjExNnoiLz48cGF0aCBkPSJNOC44MTcgNS42MjN2Ni43NTZhLjU1OC41NTggMCAwMDEuMTE2IDBWNS42MjNhLjU1OC41NTggMCAxMC0xLjExNiAweiIvPjwvZz48L3N2Zz4=');\n opacity: 0.4;\n}\n.x6-widget-stencil.collapsable.collapsed > .x6-widget-stencil-title:hover::before,\n.x6-widget-stencil-group.collapsable.collapsed > .x6-widget-stencil-group-title:hover::before {\n opacity: 0.6;\n}\n.x6-widget-stencil input[type='search'] {\n -webkit-appearance: textfield;\n}\n.x6-widget-stencil input[type='search']::-webkit-search-cancel-button,\n.x6-widget-stencil input[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n.x6-widget-stencil-search-text {\n display: block;\n width: 90%;\n margin: 8px 5%;\n padding-left: 8px;\n color: #333;\n background: #fff;\n border: 1px solid #e9e9e9;\n border-radius: 12px;\n outline: 0;\n}\n.x6-widget-stencil-search-text:focus {\n outline: 0;\n}\n.x6-widget-stencil::after {\n color: #808080;\n font-weight: 600;\n font-size: 12px;\n background: 0 0;\n}\n.x6-widget-transform {\n position: absolute;\n box-sizing: content-box !important;\n margin: -5px 0 0 -5px;\n padding: 4px;\n border: 1px dashed #000;\n border-radius: 5px;\n user-select: none;\n pointer-events: none;\n}\n.x6-widget-transform > div {\n position: absolute;\n box-sizing: border-box;\n background-color: #fff;\n border: 1px solid #000;\n transition: background-color 0.2s;\n pointer-events: auto;\n -webkit-user-drag: none;\n user-drag: none;\n /* stylelint-disable-line */\n}\n.x6-widget-transform > div:hover {\n background-color: #d3d3d3;\n}\n.x6-widget-transform-cursor-n {\n cursor: n-resize;\n}\n.x6-widget-transform-cursor-s {\n cursor: s-resize;\n}\n.x6-widget-transform-cursor-e {\n cursor: e-resize;\n}\n.x6-widget-transform-cursor-w {\n cursor: w-resize;\n}\n.x6-widget-transform-cursor-ne {\n cursor: ne-resize;\n}\n.x6-widget-transform-cursor-nw {\n cursor: nw-resize;\n}\n.x6-widget-transform-cursor-se {\n cursor: se-resize;\n}\n.x6-widget-transform-cursor-sw {\n cursor: sw-resize;\n}\n.x6-widget-transform-resize {\n width: 10px;\n height: 10px;\n border-radius: 6px;\n}\n.x6-widget-transform-resize[data-position='top-left'] {\n top: -5px;\n left: -5px;\n}\n.x6-widget-transform-resize[data-position='top-right'] {\n top: -5px;\n right: -5px;\n}\n.x6-widget-transform-resize[data-position='bottom-left'] {\n bottom: -5px;\n left: -5px;\n}\n.x6-widget-transform-resize[data-position='bottom-right'] {\n right: -5px;\n bottom: -5px;\n}\n.x6-widget-transform-resize[data-position='top'] {\n top: -5px;\n left: 50%;\n margin-left: -5px;\n}\n.x6-widget-transform-resize[data-position='bottom'] {\n bottom: -5px;\n left: 50%;\n margin-left: -5px;\n}\n.x6-widget-transform-resize[data-position='left'] {\n top: 50%;\n left: -5px;\n margin-top: -5px;\n}\n.x6-widget-transform-resize[data-position='right'] {\n top: 50%;\n right: -5px;\n margin-top: -5px;\n}\n.x6-widget-transform.prevent-aspect-ratio .x6-widget-transform-resize[data-position='top'],\n.x6-widget-transform.prevent-aspect-ratio .x6-widget-transform-resize[data-position='bottom'],\n.x6-widget-transform.prevent-aspect-ratio .x6-widget-transform-resize[data-position='left'],\n.x6-widget-transform.prevent-aspect-ratio .x6-widget-transform-resize[data-position='right'] {\n display: none;\n}\n.x6-widget-transform.no-orth-resize .x6-widget-transform-resize[data-position='bottom'],\n.x6-widget-transform.no-orth-resize .x6-widget-transform-resize[data-position='left'],\n.x6-widget-transform.no-orth-resize .x6-widget-transform-resize[data-position='right'],\n.x6-widget-transform.no-orth-resize .x6-widget-transform-resize[data-position='top'] {\n display: none;\n}\n.x6-widget-transform.no-resize .x6-widget-transform-resize {\n display: none;\n}\n.x6-widget-transform-rotate {\n top: -20px;\n left: -20px;\n width: 12px;\n height: 12px;\n border-radius: 6px;\n cursor: crosshair;\n}\n.x6-widget-transform.no-rotate .x6-widget-transform-rotate {\n display: none;\n}\n.x6-widget-transform-active {\n border-color: transparent;\n pointer-events: all;\n}\n.x6-widget-transform-active > div {\n display: none;\n}\n.x6-widget-transform-active > .x6-widget-transform-active-handle {\n display: block;\n background-color: #808080;\n}\n.x6-widget-knob {\n position: absolute;\n box-sizing: border-box;\n width: 16px;\n height: 16px;\n margin-top: -8px;\n margin-left: -8px;\n cursor: pointer;\n user-select: none;\n}\n.x6-widget-knob::before,\n.x6-widget-knob::after {\n position: absolute;\n transform: rotate(45deg);\n content: '';\n}\n.x6-widget-knob::before {\n top: 4px;\n left: 4px;\n box-sizing: border-box;\n width: 8px;\n height: 8px;\n background-color: #fff;\n}\n.x6-widget-knob::after {\n top: 5px;\n left: 5px;\n box-sizing: border-box;\n width: 6px;\n height: 6px;\n background-color: #fca000;\n}\n.x6-graph-print {\n position: relative;\n}\n.x6-graph-print .x6-graph-print-ready {\n display: none;\n}\n.x6-graph-print .x6-graph-print-preview {\n overflow: hidden !important;\n background: #fff !important;\n}\n@media print {\n html,\n html > body.x6-graph-printing {\n position: relative !important;\n width: 100% !important;\n height: 100% !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n html > body.x6-graph-printing > * {\n display: none !important;\n }\n html > body.x6-graph-printing > .x6-graph-print {\n display: block !important;\n }\n .x6-graph-print {\n top: 0 !important;\n left: 0 !important;\n margin: 0 !important;\n padding: 0 !important;\n overflow: hidden !important;\n page-break-after: always;\n background: #fff !important;\n }\n .x6-graph-print .x6-graph-print-ready {\n display: none;\n }\n}\n.x6-cell-tool-editor {\n position: relative;\n display: inline-block;\n min-height: 1em;\n margin: 0;\n padding: 0;\n line-height: 1;\n white-space: normal;\n text-align: center;\n vertical-align: top;\n overflow-wrap: normal;\n outline: none;\n transform-origin: 0 0;\n -webkit-user-drag: none;\n}\n.x6-edge-tool-editor {\n border: 1px solid #275fc5;\n border-radius: 2px;\n}\n`;\n//# sourceMappingURL=raw.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Config } from '../global/config';\nimport { content } from '../style/raw';\nimport { Platform } from '../util';\nimport { Base } from './base';\nexport class CSSManager extends Base {\n init() {\n if (Config.autoInsertCSS) {\n CSSManager.ensure();\n }\n }\n dispose() {\n CSSManager.clean();\n }\n}\n__decorate([\n CSSManager.dispose()\n], CSSManager.prototype, \"dispose\", null);\n(function (CSSManager) {\n let styleElement;\n let counter = 0;\n function ensure() {\n counter += 1;\n if (counter > 1)\n return;\n if (!Platform.isApplyingHMR()) {\n styleElement = document.createElement('style');\n styleElement.setAttribute('type', 'text/css');\n styleElement.textContent = content;\n const head = document.querySelector('head');\n if (head) {\n head.insertBefore(styleElement, head.firstChild);\n }\n }\n }\n CSSManager.ensure = ensure;\n function clean() {\n counter -= 1;\n if (counter > 0)\n return;\n if (styleElement && styleElement.parentNode) {\n styleElement.parentNode.removeChild(styleElement);\n }\n styleElement = null;\n }\n CSSManager.clean = clean;\n})(CSSManager || (CSSManager = {}));\n//# sourceMappingURL=css.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Dom, Vector } from '../../util';\nimport { View } from '../../view/view';\nimport { Point, Angle } from '../../geometry';\nexport class Handle {\n get handleClassName() {\n return ClassNames.handle;\n }\n get pie() {\n return Object.assign(Object.assign({}, Handle.defaultPieOptions), this.handleOptions.pie);\n }\n initHandles() {\n this.handles = [];\n if (this.handleOptions.handles) {\n this.handleOptions.handles.forEach((handle) => this.addHandle(handle));\n }\n if (this.handleOptions.type === 'pie') {\n if (this.pie.toggles) {\n const className = ClassNames.pieToggle;\n this.$pieToggles = {};\n this.pie.toggles.forEach((item) => {\n const $elem = this.$('<div/>');\n this.applyAttrs($elem, item.attrs);\n $elem\n .addClass(className)\n .addClass(`${className}-pos-${item.position || 'e'}`)\n .attr('data-name', item.name)\n .appendTo(this.container);\n this.$pieToggles[item.name] = $elem;\n });\n }\n this.setPieIcons();\n }\n if (this.$handleContainer) {\n const type = this.handleOptions.type || 'surround';\n this.$handleContainer\n .addClass(ClassNames.wrap)\n .addClass(ClassNames.animate)\n .addClass(`${ClassNames.handle}-${type}`);\n }\n this.delegateEvents({\n [`mousedown .${ClassNames.handle}`]: 'onHandleMouseDown',\n [`touchstart .${ClassNames.handle}`]: 'onHandleMouseDown',\n [`mousedown .${ClassNames.pieToggle}`]: 'onPieToggleMouseDown',\n [`touchstart .${ClassNames.pieToggle}`]: 'onPieToggleMouseDown',\n });\n }\n onHandleMouseDown(evt) {\n const action = this.$(evt.currentTarget)\n .closest(`.${ClassNames.handle}`)\n .attr('data-action');\n if (action) {\n evt.preventDefault();\n evt.stopPropagation();\n this.setEventData(evt, {\n action,\n clientX: evt.clientX,\n clientY: evt.clientY,\n startX: evt.clientX,\n startY: evt.clientY,\n });\n if (evt.type === 'mousedown' && evt.button === 2) {\n this.triggerHandleAction(action, 'contextmenu', evt);\n }\n else {\n this.triggerHandleAction(action, 'mousedown', evt);\n this.delegateDocumentEvents({\n mousemove: 'onHandleMouseMove',\n touchmove: 'onHandleMouseMove',\n mouseup: 'onHandleMouseUp',\n touchend: 'onHandleMouseUp',\n touchcancel: 'onHandleMouseUp',\n }, evt.data);\n }\n }\n }\n onHandleMouseMove(evt) {\n const data = this.getEventData(evt);\n const action = data.action;\n if (action) {\n this.triggerHandleAction(action, 'mousemove', evt);\n }\n }\n onHandleMouseUp(evt) {\n const data = this.getEventData(evt);\n const action = data.action;\n if (action) {\n this.triggerHandleAction(action, 'mouseup', evt);\n this.undelegateDocumentEvents();\n }\n }\n triggerHandleAction(action, eventName, evt, args) {\n evt.preventDefault();\n evt.stopPropagation();\n const e = this.normalizeEvent(evt);\n const data = this.getEventData(e);\n const local = this.graph.snapToGrid(e.clientX, e.clientY);\n const origin = this.graph.snapToGrid(data.clientX, data.clientY);\n const dx = local.x - origin.x;\n const dy = local.y - origin.y;\n this.trigger(`action:${action}:${eventName}`, Object.assign({ e,\n dx,\n dy, x: local.x, y: local.y, offsetX: evt.clientX - data.startX, offsetY: evt.clientY - data.startY }, args));\n data.clientX = evt.clientX;\n data.clientY = evt.clientY;\n }\n onPieToggleMouseDown(evt) {\n evt.stopPropagation();\n const name = this.$(evt.target)\n .closest(`.${ClassNames.pieToggle}`)\n .attr('data-name');\n if (!this.isOpen(name)) {\n if (this.isOpen()) {\n this.toggleState();\n }\n }\n this.toggleState(name);\n }\n setPieIcons() {\n if (this.handleOptions.type === 'pie') {\n this.$handleContainer.find(`.${ClassNames.handle}`).each((_, elem) => {\n const $elem = this.$(elem);\n const action = $elem.attr('data-action');\n const className = ClassNames.pieSlice;\n const handle = this.getHandle(action);\n if (!handle || !handle.icon) {\n const contect = window\n .getComputedStyle(elem, ':before')\n .getPropertyValue('content');\n if (contect && contect !== 'none') {\n const $icons = $elem.find(`.${className}-txt`);\n if ($icons.length) {\n Vector.create($icons[0]).text(contect.replace(/['\"]/g, ''));\n }\n }\n const bgImg = $elem.css('background-image');\n if (bgImg) {\n const matches = bgImg.match(/url\\(['\"]?([^'\"]+)['\"]?\\)/);\n if (matches) {\n const href = matches[1];\n const $imgs = $elem.find(`.${className}-img`);\n if ($imgs.length > 0) {\n Vector.create($imgs[0]).attr('xlink:href', href);\n }\n }\n }\n }\n });\n }\n }\n getHandleIdx(name) {\n return this.handles.findIndex((item) => item.name === name);\n }\n hasHandle(name) {\n return this.getHandleIdx(name) >= 0;\n }\n getHandle(name) {\n return this.handles.find((item) => item.name === name);\n }\n renderHandle(handle) {\n const $handle = this.$('<div/>')\n .addClass(`${ClassNames.handle} ${ClassNames.handle}-${handle.name}`)\n .attr('data-action', handle.name)\n .prop('draggable', false);\n if (this.handleOptions.type === 'pie') {\n const index = this.getHandleIdx(handle.name);\n const pie = this.pie;\n const outerRadius = pie.outerRadius;\n const innerRadius = pie.innerRadius;\n const offset = (outerRadius + innerRadius) / 2;\n const ratio = new Point(outerRadius, outerRadius);\n const delta = Angle.toRad(pie.sliceAngle);\n const curRad = index * delta + Angle.toRad(pie.startAngle);\n const nextRad = curRad + delta;\n const pathData = Dom.createSlicePathData(innerRadius, outerRadius, curRad, nextRad);\n const vSvg = Vector.create('svg').addClass(`${ClassNames.pieSlice}-svg`);\n const vPath = Vector.create('path')\n .addClass(ClassNames.pieSlice)\n .attr('d', pathData)\n .translate(outerRadius, outerRadius);\n const pos = Point.fromPolar(offset, -curRad - delta / 2, ratio).toJSON();\n const iconSize = pie.iconSize;\n const vImg = Vector.create('image')\n .attr(pos)\n .addClass(`${ClassNames.pieSlice}-img`);\n pos.y = pos.y + iconSize - 2;\n const vText = Vector.create('text', { 'font-size': iconSize })\n .attr(pos)\n .addClass(`${ClassNames.pieSlice}-txt`);\n vImg.attr({\n width: iconSize,\n height: iconSize,\n });\n vImg.translate(-iconSize / 2, -iconSize / 2);\n vText.translate(-iconSize / 2, -iconSize / 2);\n vSvg.append([vPath, vImg, vText]);\n $handle.append(vSvg.node);\n }\n else {\n $handle.addClass(`${ClassNames.handle}-pos-${handle.position}`);\n if (handle.content) {\n if (typeof handle.content === 'string') {\n $handle.html(handle.content);\n }\n else {\n $handle.append(handle.content);\n }\n }\n }\n this.updateHandleIcon($handle, handle.icon);\n this.applyAttrs($handle, handle.attrs);\n return $handle;\n }\n addHandle(handle) {\n if (!this.hasHandle(handle.name)) {\n this.handles.push(handle);\n const events = handle.events;\n if (events) {\n Object.keys(events).forEach((action) => {\n const callback = events[action];\n const name = `action:${handle.name}:${action}`;\n if (typeof callback === 'string') {\n this.on(name, this[callback], this);\n }\n else {\n this.on(name, callback);\n }\n });\n }\n if (this.$handleContainer) {\n this.$handleContainer.append(this.renderHandle(handle));\n }\n }\n return this;\n }\n addHandles(handles) {\n handles.forEach((handle) => this.addHandle(handle));\n return this;\n }\n removeHandles() {\n while (this.handles.length) {\n this.removeHandle(this.handles[0].name);\n }\n return this;\n }\n removeHandle(name) {\n const index = this.getHandleIdx(name);\n const handle = this.handles[index];\n if (handle) {\n if (handle.events) {\n Object.keys(handle.events).forEach((event) => {\n this.off(`action:${name}:${event}`);\n });\n }\n this.getHandleElem(name).remove();\n this.handles.splice(index, 1);\n }\n return this;\n }\n changeHandle(name, newHandle) {\n const handle = this.getHandle(name);\n if (handle) {\n this.removeHandle(name);\n this.addHandle(Object.assign(Object.assign({}, handle), newHandle));\n }\n return this;\n }\n toggleHandle(name, selected) {\n const handle = this.getHandle(name);\n if (handle) {\n const $handle = this.getHandleElem(name);\n const className = `${ClassNames.handle}-selected`;\n if (selected === undefined) {\n selected = !$handle.hasClass(className); // eslint-disable-line\n }\n $handle.toggleClass(className, selected);\n const icon = selected ? handle.iconSelected : handle.icon;\n if (icon) {\n this.updateHandleIcon($handle, icon);\n }\n }\n return this;\n }\n selectHandle(name) {\n return this.toggleHandle(name, true);\n }\n deselectHandle(name) {\n return this.toggleHandle(name, false);\n }\n deselectAllHandles() {\n this.handles.forEach((handle) => this.deselectHandle(handle.name));\n return this;\n }\n getHandleElem(name) {\n return this.$handleContainer.find(`.${ClassNames.handle}-${name}`);\n }\n updateHandleIcon($handle, icon) {\n if (this.handleOptions.type === 'pie') {\n const $icons = $handle.find(`.${ClassNames.pieSliceImg}`);\n this.$($icons[0]).attr('xlink:href', icon || '');\n }\n else {\n $handle.css('background-image', icon ? `url(${icon})` : '');\n }\n }\n isRendered() {\n return this.$handleContainer != null;\n }\n isOpen(name) {\n if (this.isRendered()) {\n return name\n ? this.$pieToggles[name].hasClass(ClassNames.pieToggleOpened)\n : this.$handleContainer.hasClass(`${ClassNames.pieOpended}`);\n }\n return false;\n }\n toggleState(name) {\n if (this.isRendered()) {\n const $handleContainer = this.$handleContainer;\n Object.keys(this.$pieToggles).forEach((key) => {\n const $toggle = this.$pieToggles[key];\n $toggle.removeClass(ClassNames.pieToggleOpened);\n });\n if (this.isOpen()) {\n this.trigger('pie:close', { name });\n $handleContainer.removeClass(ClassNames.pieOpended);\n }\n else {\n this.trigger('pie:open', { name });\n if (name) {\n const toggles = this.pie.toggles;\n const toggle = toggles && toggles.find((i) => i.name === name);\n if (toggle) {\n $handleContainer.attr({\n 'data-pie-toggle-name': toggle.name,\n 'data-pie-toggle-position': toggle.position,\n });\n }\n this.$pieToggles[name].addClass(ClassNames.pieToggleOpened);\n }\n $handleContainer.addClass(ClassNames.pieOpended);\n }\n }\n }\n applyAttrs(elem, attrs) {\n if (attrs) {\n const $elem = View.$(elem);\n Object.keys(attrs).forEach((selector) => {\n const $element = $elem.find(selector).addBack().filter(selector);\n const _a = attrs[selector], { class: cls } = _a, attr = __rest(_a, [\"class\"]);\n if (cls) {\n $element.addClass(cls);\n }\n $element.attr(attr);\n });\n }\n }\n}\n(function (Handle) {\n Handle.defaultPieOptions = {\n innerRadius: 20,\n outerRadius: 50,\n sliceAngle: 45,\n startAngle: 0,\n iconSize: 14,\n toggles: [\n {\n name: 'default',\n position: 'e',\n },\n ],\n };\n})(Handle || (Handle = {}));\nvar ClassNames;\n(function (ClassNames) {\n ClassNames.handle = View.prototype.prefixClassName('widget-handle');\n ClassNames.wrap = `${ClassNames.handle}-wrap`;\n ClassNames.animate = `${ClassNames.handle}-animate`;\n ClassNames.pieOpended = `${ClassNames.handle}-pie-opened`;\n ClassNames.pieToggle = `${ClassNames.handle}-pie-toggle`;\n ClassNames.pieToggleOpened = `${ClassNames.handle}-pie-toggle-opened`;\n ClassNames.pieSlice = `${ClassNames.handle}-pie-slice`;\n ClassNames.pieSliceImg = `${ClassNames.handle}-pie-slice-img`;\n})(ClassNames || (ClassNames = {}));\n//# sourceMappingURL=handle.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { View } from '../../view';\nexport class Widget extends View {\n constructor(options) {\n super();\n const _a = options, { view, cell, node, edge, graph } = _a, localOptions = __rest(_a, [\"view\", \"cell\", \"node\", \"edge\", \"graph\"]);\n if (view) {\n this.view = view;\n this.cell = view.cell;\n this.graph = view.graph;\n this.model = this.graph.model;\n }\n else if ((cell || edge || node) && graph) {\n this.cell = node || edge || cell;\n this.view = graph.renderer.findViewByCell(this.cell);\n this.graph = graph;\n this.model = this.graph.model;\n }\n const ctor = this.constructor;\n if (options.clearAll !== false) {\n ctor.removeInstances(this.graph);\n }\n ctor.register(this);\n this.init(localOptions);\n }\n static ensureCache() {\n if (!this.instanceCache.has(this)) {\n this.instanceCache.set(this, {});\n }\n return this.instanceCache.get(this);\n }\n static register(instance, graph) {\n if (graph == null) {\n // eslint-disable-next-line\n graph = instance.graph;\n }\n const dic = this.ensureCache();\n let cache = dic[graph.view.cid];\n if (cache == null) {\n cache = dic[graph.view.cid] = {};\n }\n cache[instance.cid] = instance;\n }\n static unregister(instance, graph) {\n if (graph == null) {\n // eslint-disable-next-line\n graph = instance.graph;\n }\n const dic = this.ensureCache();\n if (dic[graph.view.cid]) {\n delete dic[graph.view.cid][instance.cid];\n }\n }\n static removeInstances(graph) {\n const dic = this.ensureCache();\n const cache = dic[graph.view.cid];\n if (cache) {\n Object.keys(cache).forEach((cid) => {\n const instance = cache[cid];\n if (instance) {\n instance.remove();\n }\n });\n }\n }\n static getInstances(graph) {\n const dic = this.ensureCache();\n return dic[graph.view.cid] || {};\n }\n init(options) { } // eslint-disable-line\n render() {\n return this;\n }\n startListening() {\n if (this.options.clearOnBlankMouseDown !== false) {\n this.graph.on('blank:mousedown', this.remove, this);\n }\n }\n stopListening() {\n if (this.options.clearOnBlankMouseDown !== false) {\n this.graph.off('blank:mousedown', this.remove, this);\n }\n }\n remove() {\n this.stopListening();\n const ctor = this.constructor;\n ctor.unregister(this);\n return super.remove();\n }\n dispose() {\n this.remove();\n }\n}\n// #region static\nWidget.instanceCache = new WeakMap();\n__decorate([\n View.dispose()\n], Widget.prototype, \"dispose\", null);\n//# sourceMappingURL=widget.js.map","import { Widget } from '../common';\nimport { Dom } from '../../util';\nimport { Angle, Point } from '../../geometry';\nexport class Knob extends Widget {\n get node() {\n return this.cell;\n }\n get metadata() {\n const meta = this.cell.prop('knob');\n if (Array.isArray(meta)) {\n if (this.options.index != null) {\n return meta[this.options.index];\n }\n return null;\n }\n return meta;\n }\n init(options) {\n this.options = Object.assign({}, options);\n this.render();\n this.startListening();\n }\n startListening() {\n this.delegateEvents({\n mousedown: 'onMouseDown',\n touchstart: 'onMouseDown',\n });\n this.model.on('*', this.update, this);\n this.graph.on('scale', this.update, this);\n this.graph.on('translate', this.update, this);\n this.model.on('reseted', this.remove, this);\n this.node.on('removed', this.remove, this);\n this.view.on('node:resize:mousedown', this.onTransform, this);\n this.view.on('node:rotate:mousedown', this.onTransform, this);\n this.view.on('node:resize:mouseup', this.onTransformed, this);\n this.view.on('node:rotate:mouseup', this.onTransformed, this);\n this.view.on('cell:knob:mousedown', this.onKnobMouseDown, this);\n this.view.on('cell:knob:mouseup', this.onKnobMouseUp, this);\n super.startListening();\n }\n stopListening() {\n this.undelegateEvents();\n this.model.off('*', this.update, this);\n this.graph.off('scale', this.update, this);\n this.graph.off('translate', this.update, this);\n this.model.off('reseted', this.remove, this);\n this.node.off('removed', this.remove, this);\n this.view.off('node:resize:mousedown', this.onTransform, this);\n this.view.off('node:rotate:mousedown', this.onTransform, this);\n this.view.off('node:resize:mouseup', this.onTransformed, this);\n this.view.off('node:rotate:mouseup', this.onTransformed, this);\n this.view.off('cell:knob:mousedown', this.onKnobMouseDown, this);\n this.view.off('cell:knob:mouseup', this.onKnobMouseUp, this);\n super.stopListening();\n }\n render() {\n this.container = document.createElement('div');\n Dom.addClass(this.container, this.prefixClassName('widget-knob'));\n if (this.options.className) {\n Dom.addClass(this.container, this.options.className);\n }\n this.view.addClass(Private.KNOB);\n this.graph.container.appendChild(this.container);\n this.update();\n return this;\n }\n remove() {\n this.view.removeClass(Private.KNOB);\n return super.remove();\n }\n update() {\n if (this.metadata) {\n const { update, position } = this.metadata;\n const args = {\n knob: this,\n cell: this.cell,\n node: this.node,\n };\n if (position) {\n const pos = position.call(this.graph, Object.assign({}, args));\n if (pos) {\n const ctm = this.graph.matrix();\n const bbox = this.node.getBBox();\n const angle = Angle.normalize(this.node.getAngle());\n const local = Point.create(pos);\n if (angle !== 0) {\n local.rotate(-angle, { x: bbox.width / 2, y: bbox.height / 2 });\n }\n local.translate(bbox).scale(ctm.a, ctm.d).translate(ctm.e, ctm.f);\n this.container.style.left = `${local.x}px`;\n this.container.style.top = `${local.y}px`;\n }\n }\n if (update) {\n update.call(this.graph, Object.assign({}, args));\n }\n }\n }\n hide() {\n this.container.style.display = 'none';\n }\n show() {\n this.container.style.display = '';\n }\n onTransform() {\n this.hide();\n }\n onTransformed() {\n this.show();\n }\n onKnobMouseDown({ knob }) {\n if (this.cid !== knob.cid) {\n this.hide();\n }\n }\n onKnobMouseUp() {\n this.show();\n }\n notify(name, evt) {\n if (this.view) {\n const e = this.view.normalizeEvent(evt);\n const localPoint = this.graph.snapToGrid(e.clientX, e.clientY);\n this.view.notify(`cell:${name}`, {\n e,\n view: this.view,\n node: this.node,\n cell: this.cell,\n x: localPoint.x,\n y: localPoint.y,\n knob: this,\n });\n if (this.cell.isNode()) {\n this.view.notify(`node:${name}`, {\n e,\n view: this.view,\n node: this.node,\n cell: this.cell,\n x: localPoint.x,\n y: localPoint.y,\n knob: this,\n });\n }\n else if (this.cell.isEdge()) {\n this.view.notify(`edge:${name}`, {\n e,\n view: this.view,\n edge: this.cell,\n cell: this.cell,\n x: localPoint.x,\n y: localPoint.y,\n knob: this,\n });\n }\n }\n }\n onMouseDown(e) {\n e.stopPropagation();\n this.setEventData(e, {\n knobbing: false,\n originX: e.clientX,\n originY: e.clientY,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n this.graph.view.undelegateEvents();\n this.delegateDocumentEvents(Private.documentEvents, e.data);\n if (this.metadata && this.metadata.onMouseDown) {\n this.metadata.onMouseDown.call(this.graph, {\n e,\n data: this.getEventData(e),\n knob: this,\n cell: this.cell,\n node: this.node,\n });\n }\n this.notify('knob:mousedown', e);\n }\n onMouseMove(e) {\n const data = this.getEventData(e);\n const view = this.graph.findViewByCell(this.node);\n if (!data.knobbing) {\n data.knobbing = true;\n if (view) {\n view.addClass(Private.KNOBBING);\n this.notify('knob', e);\n }\n this.model.startBatch('knob', { cid: this.cid });\n }\n data.clientX = e.clientX;\n data.clientY = e.clientY;\n if (this.metadata && this.metadata.onMouseMove) {\n const ctm = this.graph.matrix();\n const dx = (e.clientX - data.originX) / ctm.a;\n const dy = (e.clientY - data.originY) / ctm.d;\n const angle = this.node.getAngle();\n const delta = new Point(dx, dy).rotate(angle);\n this.metadata.onMouseMove.call(this.graph, {\n e,\n data,\n deltaX: delta.x,\n deltaY: delta.y,\n knob: this,\n cell: this.cell,\n node: this.node,\n });\n }\n this.notify('knobbing', e);\n this.notify('knob:mousemove', e);\n }\n onMouseUp(e) {\n this.undelegateDocumentEvents();\n this.graph.view.delegateEvents();\n const data = this.getEventData(e);\n const view = this.graph.findViewByCell(this.node);\n if (data.knobbing) {\n if (view) {\n view.removeClass(Private.KNOBBING);\n }\n if (this.metadata && this.metadata.onMouseUp) {\n this.metadata.onMouseUp.call(this.graph, {\n e,\n data,\n knob: this,\n cell: this.cell,\n node: this.node,\n });\n }\n this.model.stopBatch('knob', { cid: this.cid });\n this.notify('knobbed', e);\n }\n this.notify('knob:mouseup', e);\n }\n}\nvar Private;\n(function (Private) {\n Private.KNOB = 'has-widget-knob';\n Private.KNOBBING = 'node-knobbing';\n Private.documentEvents = {\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n };\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { FunctionExt } from '../../util';\nimport { View } from '../../view/view';\nimport { Graph } from '../../graph/graph';\nimport { Point } from '../../geometry';\nvar ClassName;\n(function (ClassName) {\n ClassName.root = 'widget-minimap';\n ClassName.viewport = `${ClassName.root}-viewport`;\n ClassName.zoom = `${ClassName.viewport}-zoom`;\n})(ClassName || (ClassName = {}));\nexport class MiniMap extends View {\n constructor(options) {\n super();\n this.options = Object.assign(Object.assign({}, Util.defaultOptions), options);\n this.updateViewport = FunctionExt.debounce(this.updateViewport.bind(this), 0);\n this.container = document.createElement('div');\n this.$container = this.$(this.container).addClass(this.prefixClassName(ClassName.root));\n const graphContainer = document.createElement('div');\n this.container.appendChild(graphContainer);\n this.$viewport = this.$('<div>').addClass(this.prefixClassName(ClassName.viewport));\n if (this.options.scalable) {\n this.zoomHandle = this.$('<div>')\n .addClass(this.prefixClassName(ClassName.zoom))\n .appendTo(this.$viewport)\n .get(0);\n }\n this.$container.append(this.$viewport).css({\n width: this.options.width,\n height: this.options.height,\n padding: this.options.padding,\n });\n if (this.options.container) {\n this.options.container.appendChild(this.container);\n }\n this.sourceGraph = this.graph;\n const targetGraphOptions = Object.assign(Object.assign({}, this.options.graphOptions), { container: graphContainer, model: this.sourceGraph.model, frozen: true, async: this.sourceGraph.isAsync(), interacting: false, grid: false, background: false, rotating: false, resizing: false, embedding: false, selecting: false, snapline: false, clipboard: false, history: false, scroller: false });\n this.targetGraph = this.options.createGraph\n ? this.options.createGraph(targetGraphOptions)\n : new Graph(targetGraphOptions);\n this.targetGraph.renderer.unfreeze();\n this.updatePaper(this.sourceGraph.options.width, this.sourceGraph.options.height);\n this.startListening();\n }\n get graph() {\n return this.options.graph;\n }\n get scroller() {\n return this.graph.scroller.widget;\n }\n get graphContainer() {\n if (this.scroller) {\n return this.scroller.container;\n }\n return this.graph.container;\n }\n get $graphContainer() {\n if (this.scroller) {\n return this.scroller.$container;\n }\n return this.$(this.graph.container);\n }\n startListening() {\n if (this.scroller) {\n this.$graphContainer.on(`scroll${this.getEventNamespace()}`, this.updateViewport);\n }\n else {\n this.sourceGraph.on('translate', this.onSourceGraphTransform, this);\n this.sourceGraph.on('scale', this.onSourceGraphTransform, this);\n }\n this.sourceGraph.on('resize', this.updatePaper, this);\n this.delegateEvents({\n mousedown: 'startAction',\n touchstart: 'startAction',\n [`mousedown .${this.prefixClassName('graph')}`]: 'scrollTo',\n [`touchstart .${this.prefixClassName('graph')}`]: 'scrollTo',\n });\n }\n stopListening() {\n if (this.scroller) {\n this.$graphContainer.off(this.getEventNamespace());\n }\n else {\n this.sourceGraph.off('translate', this.onSourceGraphTransform, this);\n this.sourceGraph.off('scale', this.onSourceGraphTransform, this);\n }\n this.sourceGraph.off('resize', this.updatePaper, this);\n this.undelegateEvents();\n }\n onRemove() {\n this.targetGraph.view.remove();\n this.stopListening();\n this.targetGraph.dispose();\n }\n onSourceGraphTransform() {\n if (!this.targetGraphTransforming) {\n this.updatePaper(this.sourceGraph.options.width, this.sourceGraph.options.height);\n }\n else {\n this.updateViewport();\n }\n }\n updatePaper(w, h) {\n let width;\n let height;\n if (typeof w === 'object') {\n width = w.width;\n height = w.height;\n }\n else {\n width = w;\n height = h;\n }\n const origin = this.sourceGraph.options;\n const scale = this.sourceGraph.transform.getScale();\n const maxWidth = this.options.width - 2 * this.options.padding;\n const maxHeight = this.options.height - 2 * this.options.padding;\n width /= scale.sx; // eslint-disable-line\n height /= scale.sy; // eslint-disable-line\n this.ratio = Math.min(maxWidth / width, maxHeight / height);\n const ratio = this.ratio;\n const x = (origin.x * ratio) / scale.sx;\n const y = (origin.y * ratio) / scale.sy;\n width *= ratio; // eslint-disable-line\n height *= ratio; // eslint-disable-line\n this.targetGraph.resizeGraph(width, height);\n this.targetGraph.translate(x, y);\n this.targetGraph.scale(ratio, ratio);\n this.updateViewport();\n return this;\n }\n updateViewport() {\n const ratio = this.ratio;\n const scale = this.sourceGraph.transform.getScale();\n let origin = null;\n if (this.scroller) {\n origin = this.scroller.clientToLocalPoint(0, 0);\n }\n else {\n const ctm = this.sourceGraph.matrix();\n origin = new Point(-ctm.e / ctm.a, -ctm.f / ctm.d);\n }\n const position = this.$(this.targetGraph.container).position();\n const translation = this.targetGraph.translate();\n translation.ty = translation.ty || 0;\n this.geometry = {\n top: position.top + origin.y * ratio + translation.ty,\n left: position.left + origin.x * ratio + translation.tx,\n width: (this.$graphContainer.innerWidth() * ratio) / scale.sx,\n height: (this.$graphContainer.innerHeight() * ratio) / scale.sy,\n };\n this.$viewport.css(this.geometry);\n }\n startAction(evt) {\n const e = this.normalizeEvent(evt);\n const action = e.target === this.zoomHandle ? 'zooming' : 'panning';\n const { tx, ty } = this.sourceGraph.translate();\n const eventData = {\n action,\n clientX: e.clientX,\n clientY: e.clientY,\n scrollLeft: this.graphContainer.scrollLeft,\n scrollTop: this.graphContainer.scrollTop,\n zoom: this.sourceGraph.zoom(),\n scale: this.sourceGraph.transform.getScale(),\n geometry: this.geometry,\n translateX: tx,\n translateY: ty,\n };\n this.targetGraphTransforming = true;\n this.delegateDocumentEvents(Util.documentEvents, eventData);\n }\n doAction(evt) {\n const e = this.normalizeEvent(evt);\n const clientX = e.clientX;\n const clientY = e.clientY;\n const data = e.data;\n switch (data.action) {\n case 'panning': {\n const scale = this.sourceGraph.transform.getScale();\n const rx = (clientX - data.clientX) * scale.sx;\n const ry = (clientY - data.clientY) * scale.sy;\n if (this.scroller) {\n this.graphContainer.scrollLeft = data.scrollLeft + rx / this.ratio;\n this.graphContainer.scrollTop = data.scrollTop + ry / this.ratio;\n }\n else {\n this.sourceGraph.translate(data.translateX - rx / this.ratio, data.translateY - ry / this.ratio);\n }\n break;\n }\n case 'zooming': {\n const startScale = data.scale;\n const startGeometry = data.geometry;\n const delta = 1 + (data.clientX - clientX) / startGeometry.width / startScale.sx;\n if (data.frameId) {\n cancelAnimationFrame(data.frameId);\n }\n data.frameId = requestAnimationFrame(() => {\n this.sourceGraph.zoom(delta * data.zoom, {\n absolute: true,\n minScale: this.options.minScale,\n maxScale: this.options.maxScale,\n });\n });\n break;\n }\n default:\n break;\n }\n }\n stopAction() {\n this.undelegateDocumentEvents();\n this.targetGraphTransforming = false;\n }\n scrollTo(evt) {\n const e = this.normalizeEvent(evt);\n let x;\n let y;\n const ts = this.targetGraph.translate();\n ts.ty = ts.ty || 0;\n if (e.offsetX == null) {\n const offset = this.$(this.targetGraph.container).offset();\n x = e.pageX - offset.left;\n y = e.pageY - offset.top;\n }\n else {\n x = e.offsetX;\n y = e.offsetY;\n }\n const cx = (x - ts.tx) / this.ratio;\n const cy = (y - ts.ty) / this.ratio;\n this.sourceGraph.centerPoint(cx, cy);\n }\n dispose() {\n this.remove();\n }\n}\n__decorate([\n View.dispose()\n], MiniMap.prototype, \"dispose\", null);\nvar Util;\n(function (Util) {\n Util.defaultOptions = {\n width: 300,\n height: 200,\n padding: 10,\n scalable: true,\n minScale: 0.01,\n maxScale: 16,\n graphOptions: {},\n createGraph: (options) => new Graph(options),\n };\n Util.documentEvents = {\n mousemove: 'doAction',\n touchmove: 'doAction',\n mouseup: 'stopAction',\n touchend: 'stopAction',\n };\n})(Util || (Util = {}));\n//# sourceMappingURL=index.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ArrayExt, FunctionExt } from '../../util';\nimport { Rectangle, Angle } from '../../geometry';\nimport { View } from '../../view/view';\nexport class Snapline extends View {\n constructor(options) {\n super();\n const { graph } = options, others = __rest(options, [\"graph\"]);\n this.graph = graph;\n this.options = Object.assign({ tolerance: 10 }, others);\n this.render();\n this.parseFilter();\n if (!this.disabled) {\n this.startListening();\n }\n }\n get model() {\n return this.graph.model;\n }\n get containerClassName() {\n return this.prefixClassName('widget-snapline');\n }\n get verticalClassName() {\n return `${this.containerClassName}-vertical`;\n }\n get horizontalClassName() {\n return `${this.containerClassName}-horizontal`;\n }\n get disabled() {\n return (this.options.enabled !== true ||\n this.graph.options.snapline.enabled !== true);\n }\n enable() {\n if (this.disabled) {\n this.options.enabled = true;\n this.graph.options.snapline.enabled = true;\n this.startListening();\n }\n }\n disable() {\n if (!this.disabled) {\n this.options.enabled = false;\n this.graph.options.snapline.enabled = false;\n this.stopListening();\n }\n }\n setFilter(filter) {\n this.options.filter = filter;\n this.parseFilter();\n }\n render() {\n this.container = document.createElement('div');\n this.$container = this.$(this.container);\n this.$horizontal = this.$(document.createElement('div')).addClass(this.horizontalClassName);\n this.$vertical = this.$(document.createElement('div')).addClass(this.verticalClassName);\n this.$container\n .hide()\n .addClass(this.containerClassName)\n .append([this.$horizontal, this.$vertical]);\n if (this.options.className) {\n this.$container.addClass(this.options.className);\n }\n }\n startListening() {\n this.stopListening();\n this.graph.on('node:mousedown', this.captureCursorOffset, this);\n this.graph.on('node:mousemove', this.snapOnMoving, this);\n this.model.on('batch:stop', this.onBatchStop, this);\n this.delegateDocumentEvents({\n mouseup: 'hide',\n touchend: 'hide',\n });\n }\n stopListening() {\n this.graph.off('node:mousedown', this.captureCursorOffset, this);\n this.graph.off('node:mousemove', this.snapOnMoving, this);\n this.model.off('batch:stop', this.onBatchStop, this);\n this.undelegateDocumentEvents();\n }\n parseFilter() {\n this.filterShapes = {};\n this.filterCells = {};\n this.filterFunction = null;\n const filter = this.options.filter;\n if (Array.isArray(filter)) {\n filter.forEach((item) => {\n if (typeof item === 'string') {\n this.filterShapes[item] = true;\n }\n else {\n this.filterCells[item.id] = true;\n }\n });\n }\n else if (typeof filter === 'function') {\n this.filterFunction = filter;\n }\n }\n onBatchStop({ name, data }) {\n if (name === 'resize') {\n this.snapOnResizing(data.cell, data);\n }\n }\n captureCursorOffset({ view, x, y }) {\n const targetView = view.getDelegatedView();\n if (targetView && this.isNodeMovable(targetView)) {\n const pos = view.cell.getPosition();\n this.offset = {\n x: x - pos.x,\n y: y - pos.y,\n };\n }\n }\n isNodeMovable(view) {\n return view && view.cell.isNode() && view.can('nodeMovable');\n }\n snapOnResizing(node, options) {\n if (this.options.resizing &&\n !options.snapped &&\n options.ui &&\n options.direction &&\n options.trueDirection) {\n const view = this.graph.renderer.findViewByCell(node);\n if (view && view.cell.isNode()) {\n const nodeBbox = node.getBBox();\n const nodeBBoxRotated = nodeBbox.bbox(node.getAngle());\n const nodeTopLeft = nodeBBoxRotated.getTopLeft();\n const nodeBottomRight = nodeBBoxRotated.getBottomRight();\n const angle = Angle.normalize(node.getAngle());\n const tolerance = this.options.tolerance || 0;\n let verticalLeft;\n let verticalTop;\n let verticalHeight;\n let horizontalTop;\n let horizontalLeft;\n let horizontalWidth;\n const snapOrigin = {\n vertical: 0,\n horizontal: 0,\n };\n const direction = options.direction;\n const trueDirection = options.trueDirection;\n const relativeDirection = options.relativeDirection;\n if (trueDirection.indexOf('right') !== -1) {\n snapOrigin.vertical = nodeBottomRight.x;\n }\n else {\n snapOrigin.vertical = nodeTopLeft.x;\n }\n if (trueDirection.indexOf('bottom') !== -1) {\n snapOrigin.horizontal = nodeBottomRight.y;\n }\n else {\n snapOrigin.horizontal = nodeTopLeft.y;\n }\n this.model.getNodes().some((cell) => {\n if (this.isIgnored(node, cell)) {\n return false;\n }\n const snapBBox = cell.getBBox().bbox(cell.getAngle());\n const snapTopLeft = snapBBox.getTopLeft();\n const snapBottomRight = snapBBox.getBottomRight();\n const groups = {\n vertical: [snapTopLeft.x, snapBottomRight.x],\n horizontal: [snapTopLeft.y, snapBottomRight.y],\n };\n const distances = {};\n Object.keys(groups).forEach((k) => {\n const key = k;\n const list = groups[key]\n .map((value) => ({\n position: value,\n distance: Math.abs(value - snapOrigin[key]),\n }))\n .filter((item) => item.distance <= tolerance);\n distances[key] = ArrayExt.sortBy(list, (item) => item.distance);\n });\n if (verticalLeft == null && distances.vertical.length > 0) {\n verticalLeft = distances.vertical[0].position;\n verticalTop = Math.min(nodeBBoxRotated.y, snapBBox.y);\n verticalHeight =\n Math.max(nodeBottomRight.y, snapBottomRight.y) - verticalTop;\n }\n if (horizontalTop == null && distances.horizontal.length > 0) {\n horizontalTop = distances.horizontal[0].position;\n horizontalLeft = Math.min(nodeBBoxRotated.x, snapBBox.x);\n horizontalWidth =\n Math.max(nodeBottomRight.x, snapBottomRight.x) - horizontalLeft;\n }\n return verticalLeft != null && horizontalTop != null;\n });\n this.hide();\n let dx = 0;\n let dy = 0;\n if (horizontalTop != null || verticalLeft != null) {\n if (verticalLeft != null) {\n dx =\n trueDirection.indexOf('right') !== -1\n ? verticalLeft - nodeBottomRight.x\n : nodeTopLeft.x - verticalLeft;\n }\n if (horizontalTop != null) {\n dy =\n trueDirection.indexOf('bottom') !== -1\n ? horizontalTop - nodeBottomRight.y\n : nodeTopLeft.y - horizontalTop;\n }\n }\n let dWidth = 0;\n let dHeight = 0;\n if (angle % 90 === 0) {\n if (angle === 90 || angle === 270) {\n dWidth = dy;\n dHeight = dx;\n }\n else {\n dWidth = dx;\n dHeight = dy;\n }\n }\n else {\n const quadrant = angle >= 0 && angle < 90\n ? 1\n : angle >= 90 && angle < 180\n ? 4\n : angle >= 180 && angle < 270\n ? 3\n : 2;\n if (horizontalTop != null && verticalLeft != null) {\n if (dx < dy) {\n dy = 0;\n horizontalTop = undefined;\n }\n else {\n dx = 0;\n verticalLeft = undefined;\n }\n }\n const rad = Angle.toRad(angle % 90);\n if (dx) {\n dWidth = quadrant === 3 ? dx / Math.cos(rad) : dx / Math.sin(rad);\n }\n if (dy) {\n dHeight = quadrant === 3 ? dy / Math.cos(rad) : dy / Math.sin(rad);\n }\n const quadrant13 = quadrant === 1 || quadrant === 3;\n switch (relativeDirection) {\n case 'top':\n case 'bottom':\n dHeight = dy\n ? dy / (quadrant13 ? Math.cos(rad) : Math.sin(rad))\n : dx / (quadrant13 ? Math.sin(rad) : Math.cos(rad));\n break;\n case 'left':\n case 'right':\n dWidth = dx\n ? dx / (quadrant13 ? Math.cos(rad) : Math.sin(rad))\n : dy / (quadrant13 ? Math.sin(rad) : Math.cos(rad));\n break;\n default:\n break;\n }\n }\n switch (relativeDirection) {\n case 'top':\n case 'bottom':\n dWidth = 0;\n break;\n case 'left':\n case 'right':\n dHeight = 0;\n break;\n default:\n break;\n }\n const gridSize = this.graph.getGridSize();\n let newWidth = Math.max(nodeBbox.width + dWidth, gridSize);\n let newHeight = Math.max(nodeBbox.height + dHeight, gridSize);\n if (options.minWidth && options.minWidth > gridSize) {\n newWidth = Math.max(newWidth, options.minWidth);\n }\n if (options.minHeight && options.minHeight > gridSize) {\n newHeight = Math.max(newHeight, options.minHeight);\n }\n if (options.maxWidth) {\n newWidth = Math.min(newWidth, options.maxWidth);\n }\n if (options.maxHeight) {\n newHeight = Math.min(newHeight, options.maxHeight);\n }\n if (options.preserveAspectRatio) {\n if (dHeight < dWidth) {\n newHeight = newWidth * (nodeBbox.height / nodeBbox.width);\n }\n else {\n newWidth = newHeight * (nodeBbox.width / nodeBbox.height);\n }\n }\n if (newWidth !== nodeBbox.width || newHeight !== nodeBbox.height) {\n node.resize(newWidth, newHeight, {\n direction,\n relativeDirection,\n trueDirection,\n snapped: true,\n snaplines: this.cid,\n restrict: this.graph.hook.getRestrictArea(view),\n });\n if (verticalHeight) {\n verticalHeight += newHeight - nodeBbox.height;\n }\n if (horizontalWidth) {\n horizontalWidth += newWidth - nodeBbox.width;\n }\n }\n const newRotatedBBox = node.getBBox().bbox(angle);\n if (verticalLeft &&\n Math.abs(newRotatedBBox.x - verticalLeft) > 1 &&\n Math.abs(newRotatedBBox.width + newRotatedBBox.x - verticalLeft) > 1) {\n verticalLeft = undefined;\n }\n if (horizontalTop &&\n Math.abs(newRotatedBBox.y - horizontalTop) > 1 &&\n Math.abs(newRotatedBBox.height + newRotatedBBox.y - horizontalTop) > 1) {\n horizontalTop = undefined;\n }\n this.update({\n verticalLeft,\n verticalTop,\n verticalHeight,\n horizontalTop,\n horizontalLeft,\n horizontalWidth,\n });\n }\n }\n }\n snapOnMoving({ view, e, x, y }) {\n const targetView = view.getEventData(e).delegatedView || view;\n if (!this.isNodeMovable(targetView)) {\n return;\n }\n const node = targetView.cell;\n const size = node.getSize();\n const position = node.getPosition();\n const cellBBox = new Rectangle(x - this.offset.x, y - this.offset.y, size.width, size.height);\n const angle = node.getAngle();\n const nodeCenter = cellBBox.getCenter();\n const nodeBBoxRotated = cellBBox.bbox(angle);\n const nodeTopLeft = nodeBBoxRotated.getTopLeft();\n const nodeBottomRight = nodeBBoxRotated.getBottomRight();\n const distance = this.options.tolerance || 0;\n let verticalLeft;\n let verticalTop;\n let verticalHeight;\n let horizontalTop;\n let horizontalLeft;\n let horizontalWidth;\n let verticalFix = 0;\n let horizontalFix = 0;\n this.model.getNodes().some((targetNode) => {\n if (this.isIgnored(node, targetNode)) {\n return false;\n }\n const snapBBox = targetNode.getBBox().bbox(targetNode.getAngle());\n const snapCenter = snapBBox.getCenter();\n const snapTopLeft = snapBBox.getTopLeft();\n const snapBottomRight = snapBBox.getBottomRight();\n if (verticalLeft == null) {\n if (Math.abs(snapCenter.x - nodeCenter.x) < distance) {\n verticalLeft = snapCenter.x;\n verticalFix = 0.5;\n }\n else if (Math.abs(snapTopLeft.x - nodeTopLeft.x) < distance) {\n verticalLeft = snapTopLeft.x;\n verticalFix = 0;\n }\n else if (Math.abs(snapTopLeft.x - nodeBottomRight.x) < distance) {\n verticalLeft = snapTopLeft.x;\n verticalFix = 1;\n }\n else if (Math.abs(snapBottomRight.x - nodeBottomRight.x) < distance) {\n verticalLeft = snapBottomRight.x;\n verticalFix = 1;\n }\n else if (Math.abs(snapBottomRight.x - nodeTopLeft.x) < distance) {\n verticalLeft = snapBottomRight.x;\n }\n if (verticalLeft != null) {\n verticalTop = Math.min(nodeBBoxRotated.y, snapBBox.y);\n verticalHeight =\n Math.max(nodeBottomRight.y, snapBottomRight.y) - verticalTop;\n }\n }\n if (horizontalTop == null) {\n if (Math.abs(snapCenter.y - nodeCenter.y) < distance) {\n horizontalTop = snapCenter.y;\n horizontalFix = 0.5;\n }\n else if (Math.abs(snapTopLeft.y - nodeTopLeft.y) < distance) {\n horizontalTop = snapTopLeft.y;\n }\n else if (Math.abs(snapTopLeft.y - nodeBottomRight.y) < distance) {\n horizontalTop = snapTopLeft.y;\n horizontalFix = 1;\n }\n else if (Math.abs(snapBottomRight.y - nodeBottomRight.y) < distance) {\n horizontalTop = snapBottomRight.y;\n horizontalFix = 1;\n }\n else if (Math.abs(snapBottomRight.y - nodeTopLeft.y) < distance) {\n horizontalTop = snapBottomRight.y;\n }\n if (horizontalTop != null) {\n horizontalLeft = Math.min(nodeBBoxRotated.x, snapBBox.x);\n horizontalWidth =\n Math.max(nodeBottomRight.x, snapBottomRight.x) - horizontalLeft;\n }\n }\n return verticalLeft != null && horizontalTop != null;\n });\n this.hide();\n if (horizontalTop != null || verticalLeft != null) {\n if (horizontalTop != null) {\n nodeBBoxRotated.y =\n horizontalTop - horizontalFix * nodeBBoxRotated.height;\n }\n if (verticalLeft != null) {\n nodeBBoxRotated.x = verticalLeft - verticalFix * nodeBBoxRotated.width;\n }\n const newCenter = nodeBBoxRotated.getCenter();\n const newX = newCenter.x - cellBBox.width / 2;\n const newY = newCenter.y - cellBBox.height / 2;\n const dx = newX - position.x;\n const dy = newY - position.y;\n if (dx !== 0 || dy !== 0) {\n node.translate(dx, dy, {\n snapped: true,\n restrict: this.graph.hook.getRestrictArea(targetView),\n });\n if (horizontalWidth) {\n horizontalWidth += dx;\n }\n if (verticalHeight) {\n verticalHeight += dy;\n }\n }\n this.update({\n verticalLeft,\n verticalTop,\n verticalHeight,\n horizontalTop,\n horizontalLeft,\n horizontalWidth,\n });\n }\n }\n isIgnored(snapNode, targetNode) {\n return (targetNode.id === snapNode.id ||\n targetNode.isDescendantOf(snapNode) ||\n this.filterShapes[targetNode.shape] ||\n this.filterCells[targetNode.id] ||\n (this.filterFunction &&\n FunctionExt.call(this.filterFunction, this.graph, targetNode)));\n }\n update(metadata) {\n const ctm = this.graph.matrix();\n const sx = ctm.a;\n const sy = ctm.d;\n const tx = ctm.e;\n const ty = ctm.f;\n const sharp = this.options.sharp;\n const hasScroller = this.graph.scroller.widget != null;\n if (metadata.horizontalTop) {\n this.$horizontal\n .css({\n top: metadata.horizontalTop * sy + ty,\n left: sharp\n ? metadata.horizontalLeft * sx + tx\n : hasScroller\n ? '-300%'\n : 0,\n width: sharp\n ? metadata.horizontalWidth * sx\n : hasScroller\n ? '700%'\n : '100%',\n })\n .show();\n }\n else {\n this.$horizontal.hide();\n }\n if (metadata.verticalLeft) {\n this.$vertical\n .css({\n left: metadata.verticalLeft * sx + tx,\n top: sharp\n ? metadata.verticalTop * sy + ty\n : hasScroller\n ? '-300%'\n : 0,\n height: sharp\n ? metadata.verticalHeight * sy\n : hasScroller\n ? '700%'\n : '100%',\n })\n .show();\n }\n else {\n this.$vertical.hide();\n }\n this.show();\n }\n resetTimer() {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n show() {\n this.$container.show();\n this.resetTimer();\n if (this.container.parentNode == null) {\n this.graph.container.appendChild(this.container);\n }\n return this;\n }\n hide() {\n this.$container.hide();\n this.resetTimer();\n const clean = this.options.clean;\n const delay = typeof clean === 'number' ? clean : clean !== false ? 3000 : 0;\n if (delay > 0) {\n this.timer = window.setTimeout(() => {\n this.unmount();\n }, delay);\n }\n return this;\n }\n onRemove() {\n this.stopListening();\n this.hide();\n }\n dispose() {\n this.remove();\n }\n}\n__decorate([\n View.dispose()\n], Snapline.prototype, \"dispose\", null);\n//# sourceMappingURL=index.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Dom, FunctionExt } from '../util';\nimport { Rectangle } from '../geometry';\nimport { Cell } from '../model';\nimport { View, CellView } from '../view';\nimport { Base } from './base';\nexport class Renderer extends Base {\n init() {\n this.resetUpdates();\n this.startListening();\n // Renders existing cells in the model.\n this.resetViews(this.model.getCells());\n // Starts rendering loop.\n if (!this.isFrozen() && this.isAsync()) {\n this.updateViewsAsync();\n }\n }\n startListening() {\n this.model.on('sorted', this.onSortModel, this);\n this.model.on('reseted', this.onModelReseted, this);\n this.model.on('batch:stop', this.onBatchStop, this);\n this.model.on('cell:added', this.onCellAdded, this);\n this.model.on('cell:removed', this.onCellRemoved, this);\n this.model.on('cell:change:zIndex', this.onCellZIndexChanged, this);\n this.model.on('cell:change:visible', this.onCellVisibleChanged, this);\n }\n stopListening() {\n this.model.off('sorted', this.onSortModel, this);\n this.model.off('reseted', this.onModelReseted, this);\n this.model.off('batch:stop', this.onBatchStop, this);\n this.model.off('cell:added', this.onCellAdded, this);\n this.model.off('cell:removed', this.onCellRemoved, this);\n this.model.off('cell:change:zIndex', this.onCellZIndexChanged, this);\n this.model.off('cell:change:visible', this.onCellVisibleChanged, this);\n }\n resetUpdates() {\n this.updates = {\n priorities: [{}, {}, {}],\n mounted: {},\n mountedCids: [],\n unmounted: {},\n unmountedCids: [],\n count: 0,\n sort: false,\n frozen: false,\n freezeKey: null,\n animationId: null,\n };\n }\n onSortModel() {\n if (this.model.hasActiveBatch(Renderer.SORT_DELAYING_BATCHES)) {\n return;\n }\n this.sortViews();\n }\n onModelReseted({ options }) {\n this.removeZPivots();\n this.resetViews(this.model.getCells(), options);\n }\n onBatchStop({ name, data }) {\n if (this.isFrozen()) {\n return;\n }\n const model = this.model;\n if (!this.isAsync()) {\n const updateDelayingBatches = Renderer.UPDATE_DELAYING_BATCHES;\n if (updateDelayingBatches.includes(name) &&\n !model.hasActiveBatch(updateDelayingBatches)) {\n this.updateViews(data);\n }\n }\n const sortDelayingBatches = Renderer.SORT_DELAYING_BATCHES;\n if (sortDelayingBatches.includes(name) &&\n !model.hasActiveBatch(sortDelayingBatches)) {\n this.sortViews();\n }\n }\n onCellAdded({ cell, options }) {\n const position = options.position;\n if (this.isAsync() || typeof position !== 'number') {\n this.renderView(cell, options);\n }\n else {\n if (options.maxPosition === position) {\n this.freeze({ key: 'addCells' });\n }\n this.renderView(cell, options);\n if (position === 0) {\n this.unfreeze({ key: 'addCells' });\n }\n }\n }\n onCellRemoved({ cell, options }) {\n const view = this.findViewByCell(cell);\n if (view) {\n this.requestViewUpdate(view, Renderer.FLAG_REMOVE, view.priority, options);\n }\n }\n onCellZIndexChanged({ cell, options, }) {\n if (this.options.sorting === 'approx') {\n const view = this.findViewByCell(cell);\n if (view) {\n this.requestViewUpdate(view, Renderer.FLAG_INSERT, view.priority, options);\n }\n }\n }\n onCellVisibleChanged({ cell, current: visible, options, }) {\n // Hide connected edges before cell\n if (!visible) {\n this.processEdgeOnTerminalVisibleChanged(cell, false);\n }\n const view = this.findViewByCell(cell);\n if (!visible && view) {\n this.removeView(cell);\n }\n else if (visible && view == null) {\n this.renderView(cell, options);\n }\n // Show connected edges after cell rendered\n if (visible) {\n this.processEdgeOnTerminalVisibleChanged(cell, true);\n }\n }\n processEdgeOnTerminalVisibleChanged(node, visible) {\n const getOpposite = (edge, currentTerminal) => {\n const sourceId = edge.getSourceCellId();\n if (sourceId !== currentTerminal.id) {\n return edge.getSourceCell();\n }\n const targetId = edge.getTargetCellId();\n if (targetId !== currentTerminal.id) {\n return edge.getTargetCell();\n }\n return null;\n };\n this.model.getConnectedEdges(node).forEach((edge) => {\n const opposite = getOpposite(edge, node);\n if (opposite == null || opposite.isVisible()) {\n visible ? edge.show() : edge.hide();\n }\n });\n }\n isEdgeTerminalVisible(edge, terminal) {\n const cellId = terminal === 'source' ? edge.getSourceCellId() : edge.getTargetCellId();\n const cell = cellId ? this.model.getCell(cellId) : null;\n if (cell && !cell.isVisible()) {\n return false;\n }\n return true;\n }\n requestConnectedEdgesUpdate(view, options = {}) {\n if (CellView.isCellView(view)) {\n const cell = view.cell;\n const edges = this.model.getConnectedEdges(cell);\n for (let j = 0, n = edges.length; j < n; j += 1) {\n const edge = edges[j];\n const edgeView = this.findViewByCell(edge);\n if (!edgeView) {\n continue;\n }\n const flagLabels = ['update'];\n if (edge.getTargetCell() === cell) {\n flagLabels.push('target');\n }\n if (edge.getSourceCell() === cell) {\n flagLabels.push('source');\n }\n this.scheduleViewUpdate(edgeView, edgeView.getFlag(flagLabels), edgeView.priority, options);\n }\n }\n }\n forcePostponedViewUpdate(view, flag) {\n if (!view || !CellView.isCellView(view)) {\n return false;\n }\n const cell = view.cell;\n if (cell.isNode()) {\n return false;\n }\n const edgeView = view;\n if (cell.isEdge() && (flag & view.getFlag(['source', 'target'])) === 0) {\n // EdgeView is waiting for the source/target cellView to be rendered.\n // This can happen when the cells are not in the viewport.\n let sourceFlag = 0;\n const sourceView = this.findViewByCell(cell.getSourceCell());\n if (sourceView && !this.isViewMounted(sourceView)) {\n sourceFlag = this.dumpView(sourceView);\n edgeView.updateTerminalMagnet('source');\n }\n let targetFlag = 0;\n const targetView = this.findViewByCell(cell.getTargetCell());\n if (targetView && !this.isViewMounted(targetView)) {\n targetFlag = this.dumpView(targetView);\n edgeView.updateTerminalMagnet('target');\n }\n if (sourceFlag === 0 && targetFlag === 0) {\n // If leftover flag is 0, all view updates were done.\n return !this.dumpView(edgeView);\n }\n }\n return false;\n }\n scheduleViewUpdate(view, flag, priority, options = {}) {\n const cid = view.cid;\n const updates = this.updates;\n let cache = updates.priorities[priority];\n if (!cache) {\n cache = updates.priorities[priority] = {};\n }\n const currentFlag = cache[cid] || 0;\n if ((currentFlag & flag) === flag) {\n return;\n }\n if (!currentFlag) {\n updates.count += 1;\n }\n if (flag & Renderer.FLAG_REMOVE && currentFlag & Renderer.FLAG_INSERT) {\n // When a view is removed we need to remove the\n // insert flag as this is a reinsert.\n cache[cid] ^= Renderer.FLAG_INSERT;\n }\n else if (flag & Renderer.FLAG_INSERT &&\n currentFlag & Renderer.FLAG_REMOVE) {\n // When a view is added we need to remove the remove\n // flag as this is view was previously removed.\n cache[cid] ^= Renderer.FLAG_REMOVE;\n }\n cache[cid] |= flag;\n this.graph.hook.onViewUpdated(view, flag, options);\n }\n requestViewUpdate(view, flag, priority, options = {}) {\n this.scheduleViewUpdate(view, flag, priority, options);\n const isAsync = this.isAsync();\n if (this.isFrozen() ||\n (isAsync && options.async !== false) ||\n this.model.hasActiveBatch(Renderer.UPDATE_DELAYING_BATCHES)) {\n return;\n }\n const stats = this.updateViews(options);\n if (isAsync) {\n this.graph.trigger('render:done', { stats, options });\n }\n }\n /**\n * Adds view into the DOM and update it.\n */\n dumpView(view, options = {}) {\n if (view == null) {\n return 0;\n }\n const cid = view.cid;\n const updates = this.updates;\n const cache = updates.priorities[view.priority];\n const flag = this.registerMountedView(view) | cache[cid];\n delete cache[cid];\n if (!flag) {\n return 0;\n }\n return this.updateView(view, flag, options);\n }\n /**\n * Adds all views into the DOM and update them.\n */\n dumpViews(options = {}) {\n this.checkView(options);\n this.updateViews(options);\n }\n /**\n * Ensure the view associated with the cell is attached\n * to the DOM and updated.\n */\n requireView(cell, options = {}) {\n const view = this.findViewByCell(cell);\n if (view == null) {\n return null;\n }\n this.dumpView(view, options);\n return view;\n }\n updateView(view, flag, options = {}) {\n if (view == null) {\n return 0;\n }\n if (CellView.isCellView(view)) {\n if (flag & Renderer.FLAG_REMOVE) {\n this.removeView(view.cell);\n return 0;\n }\n if (flag & Renderer.FLAG_INSERT) {\n this.insertView(view);\n flag ^= Renderer.FLAG_INSERT; // eslint-disable-line\n }\n }\n if (!flag) {\n return 0;\n }\n return view.confirmUpdate(flag, options);\n }\n updateViews(options = {}) {\n let result;\n let batchCount = 0;\n let updatedCount = 0;\n let priority = Renderer.MIN_PRIORITY;\n do {\n result = this.updateViewsBatch(options);\n batchCount += 1;\n updatedCount += result.updatedCount;\n priority = Math.min(result.priority, priority);\n } while (!result.empty);\n return {\n priority,\n batchCount,\n updatedCount,\n };\n }\n updateViewsBatch(options = {}) {\n const updates = this.updates;\n const priorities = updates.priorities;\n const batchSize = options.batchSize || Renderer.UPDATE_BATCH_SIZE;\n let empty = true;\n let priority = Renderer.MIN_PRIORITY;\n let mountedCount = 0;\n let unmountedCount = 0;\n let updatedCount = 0;\n let postponedCount = 0;\n let checkView = options.checkView || this.options.checkView;\n if (typeof checkView !== 'function') {\n checkView = null;\n }\n // eslint-disable-next-line\n main: for (let p = 0, n = priorities.length; p < n; p += 1) {\n const cache = priorities[p];\n // eslint-disable-next-line\n for (const cid in cache) {\n if (updatedCount >= batchSize) {\n empty = false; // goto next batch\n break main; // eslint-disable-line no-labels\n }\n const view = View.views[cid];\n if (!view) {\n delete cache[cid];\n continue;\n }\n let currentFlag = cache[cid];\n // Do not check a view for viewport if we are about to remove the view.\n if ((currentFlag & Renderer.FLAG_REMOVE) === 0) {\n const isUnmounted = cid in updates.unmounted;\n if (checkView &&\n !FunctionExt.call(checkView, this.graph, {\n view: view,\n unmounted: isUnmounted,\n })) {\n // Unmount view\n if (!isUnmounted) {\n this.registerUnmountedView(view);\n view.unmount();\n }\n updates.unmounted[cid] |= currentFlag;\n delete cache[cid];\n unmountedCount += 1;\n continue;\n }\n // Mount view\n if (isUnmounted) {\n currentFlag |= Renderer.FLAG_INSERT;\n mountedCount += 1;\n }\n currentFlag |= this.registerMountedView(view);\n }\n const cellView = view;\n let leftoverFlag = this.updateView(view, currentFlag, options);\n if (leftoverFlag > 0) {\n const cell = cellView.cell;\n if (cell && cell.isEdge()) {\n // remove edge view when source cell is invisible\n if (cellView.hasAction(leftoverFlag, 'source') &&\n !this.isEdgeTerminalVisible(cell, 'source')) {\n leftoverFlag = cellView.removeAction(leftoverFlag, 'source');\n leftoverFlag |= Renderer.FLAG_REMOVE;\n }\n // remove edge view when target cell is invisible\n if (cellView.hasAction(leftoverFlag, 'target') &&\n !this.isEdgeTerminalVisible(cell, 'target')) {\n leftoverFlag = cellView.removeAction(leftoverFlag, 'target');\n leftoverFlag |= Renderer.FLAG_REMOVE;\n }\n }\n }\n if (leftoverFlag > 0) {\n // update has not finished\n cache[cid] = leftoverFlag;\n if (!this.graph.hook.onViewPostponed(cellView, leftoverFlag, options) ||\n cache[cid]) {\n postponedCount += 1;\n empty = false;\n continue;\n }\n }\n if (priority > p) {\n priority = p;\n }\n updatedCount += 1;\n delete cache[cid];\n }\n }\n return {\n empty,\n priority,\n mountedCount,\n unmountedCount,\n updatedCount,\n postponedCount,\n };\n }\n updateViewsAsync(options = {}, data = {\n processed: 0,\n priority: Renderer.MIN_PRIORITY,\n }) {\n const updates = this.updates;\n const animationId = updates.animationId;\n if (animationId) {\n Dom.cancelAnimationFrame(animationId);\n if (data.processed === 0) {\n const beforeFn = options.before;\n if (typeof beforeFn === 'function') {\n FunctionExt.call(beforeFn, this.graph, this.graph);\n }\n }\n const stats = this.updateViewsBatch(options);\n const checkout = this.checkViewImpl({\n checkView: options.checkView,\n mountedBatchSize: Renderer.MOUNT_BATCH_SIZE - stats.mountedCount,\n unmountedBatchSize: Renderer.MOUNT_BATCH_SIZE - stats.unmountedCount,\n });\n let processed = data.processed;\n const total = updates.count;\n const mountedCount = checkout.mountedCount;\n const unmountedCount = checkout.unmountedCount;\n if (stats.updatedCount > 0) {\n // Some updates have been just processed\n processed += stats.updatedCount + stats.unmountedCount;\n data.priority = Math.min(stats.priority, data.priority);\n if (stats.empty && mountedCount === 0) {\n stats.priority = data.priority;\n stats.mountedCount += mountedCount;\n stats.unmountedCount += unmountedCount;\n this.graph.trigger('render:done', { stats, options });\n data.processed = 0;\n updates.count = 0;\n }\n else {\n data.processed = processed;\n }\n }\n // Progress callback\n const progressFn = options.progress;\n if (total && typeof progressFn === 'function') {\n FunctionExt.call(progressFn, this.graph, {\n total,\n done: stats.empty,\n current: processed,\n });\n }\n // The current frame could have been canceled in a callback\n if (updates.animationId !== animationId) {\n return;\n }\n }\n updates.animationId = Dom.requestAnimationFrame(() => {\n this.updateViewsAsync(options, data);\n });\n }\n registerMountedView(view) {\n const cid = view.cid;\n const updates = this.updates;\n if (cid in updates.mounted) {\n return 0;\n }\n updates.mounted[cid] = true;\n updates.mountedCids.push(cid);\n const flag = updates.unmounted[cid] || 0;\n delete updates.unmounted[cid];\n return flag;\n }\n registerUnmountedView(view) {\n const cid = view.cid;\n const updates = this.updates;\n if (cid in updates.unmounted) {\n return 0;\n }\n updates.unmounted[cid] |= Renderer.FLAG_INSERT;\n const flag = updates.unmounted[cid];\n updates.unmountedCids.push(cid);\n delete updates.mounted[cid];\n return flag;\n }\n isViewMounted(view) {\n if (view == null) {\n return false;\n }\n const cid = view.cid;\n return cid in this.updates.mounted;\n }\n getMountedViews() {\n return Object.keys(this.updates.mounted).map((cid) => CellView.views[cid]);\n }\n getUnmountedViews() {\n return Object.keys(this.updates.unmounted).map((cid) => CellView.views[cid]);\n }\n checkMountedViews(viewportFn, batchSize) {\n let unmountCount = 0;\n if (typeof viewportFn !== 'function') {\n return unmountCount;\n }\n const updates = this.updates;\n const mounted = updates.mounted;\n const mountedCids = updates.mountedCids;\n const size = batchSize == null\n ? mountedCids.length\n : Math.min(mountedCids.length, batchSize);\n for (let i = 0; i < size; i += 1) {\n const cid = mountedCids[i];\n if (!(cid in mounted)) {\n continue;\n }\n const view = CellView.views[cid];\n if (view == null) {\n continue;\n }\n const shouldMount = FunctionExt.call(viewportFn, this.graph, {\n view: view,\n unmounted: true,\n });\n if (shouldMount) {\n // Push at the end of all mounted ids\n mountedCids.push(cid);\n continue;\n }\n unmountCount += 1;\n const flag = this.registerUnmountedView(view);\n if (flag) {\n view.unmount();\n }\n }\n // Get rid of views, that have been unmounted\n mountedCids.splice(0, size);\n return unmountCount;\n }\n checkUnmountedViews(checkView, batchSize) {\n let mountCount = 0;\n if (typeof checkView !== 'function') {\n checkView = null; // eslint-disable-line\n }\n const updates = this.updates;\n const unmounted = updates.unmounted;\n const unmountedCids = updates.unmountedCids;\n const size = batchSize == null\n ? unmountedCids.length\n : Math.min(unmountedCids.length, batchSize);\n for (let i = 0; i < size; i += 1) {\n const cid = unmountedCids[i];\n if (!(cid in unmounted)) {\n continue;\n }\n const view = CellView.views[cid];\n if (view == null) {\n continue;\n }\n if (checkView &&\n !FunctionExt.call(checkView, this.graph, { view, unmounted: false })) {\n unmountedCids.push(cid);\n continue;\n }\n mountCount += 1;\n const flag = this.registerMountedView(view);\n if (flag) {\n this.scheduleViewUpdate(view, flag, view.priority, {\n mounting: true,\n });\n }\n }\n // Get rid of views, that have been mounted\n unmountedCids.splice(0, size);\n return mountCount;\n }\n checkViewImpl(options = {\n mountedBatchSize: Number.MAX_SAFE_INTEGER,\n unmountedBatchSize: Number.MAX_SAFE_INTEGER,\n }) {\n const checkView = options.checkView || this.options.checkView;\n const unmountedCount = this.checkMountedViews(checkView, options.unmountedBatchSize);\n const mountedCount = this.checkUnmountedViews(checkView, \n // Do not check views, that have been just unmounted\n // and pushed at the end of the cids array\n unmountedCount > 0\n ? Math.min(this.updates.unmountedCids.length - unmountedCount, options.mountedBatchSize)\n : options.mountedBatchSize);\n return { mountedCount, unmountedCount };\n }\n /**\n * Determine every view in the graph should be attached/detached.\n */\n checkView(options = {}) {\n return this.checkViewImpl(options);\n }\n isFrozen() {\n return !!this.options.frozen;\n }\n /**\n * Freeze the graph then the graph does not automatically re-render upon\n * changes in the graph. This is useful when adding large numbers of cells.\n */\n freeze(options = {}) {\n const key = options.key;\n const updates = this.updates;\n const frozen = this.options.frozen;\n const freezeKey = updates.freezeKey;\n if (key && key !== freezeKey) {\n if (frozen && freezeKey) {\n // key passed, but the graph is already freezed with another key\n return;\n }\n updates.frozen = frozen;\n updates.freezeKey = key;\n }\n this.options.frozen = true;\n const animationId = updates.animationId;\n updates.animationId = null;\n if (this.isAsync() && animationId != null) {\n Dom.cancelAnimationFrame(animationId);\n }\n this.graph.trigger('freeze', { key });\n }\n unfreeze(options = {}) {\n const key = options.key;\n const updates = this.updates;\n const freezeKey = updates.freezeKey;\n // key passed, but the graph is already freezed with another key\n if (key && freezeKey && key !== freezeKey) {\n return;\n }\n updates.freezeKey = null;\n // key passed, but the graph is already freezed\n if (key && key === freezeKey && updates.frozen) {\n return;\n }\n const callback = () => {\n this.options.frozen = updates.frozen = false;\n if (updates.sort) {\n this.sortViews();\n updates.sort = false;\n }\n const afterFn = options.after;\n if (afterFn) {\n FunctionExt.call(afterFn, this.graph, this.graph);\n }\n this.graph.trigger('unfreeze', { key });\n };\n if (this.isAsync()) {\n this.freeze();\n const onProgress = options.progress;\n this.updateViewsAsync(Object.assign(Object.assign({}, options), { progress: ({ done, current, total }) => {\n if (onProgress) {\n FunctionExt.call(onProgress, this.graph, { done, current, total });\n }\n // sort views after async render\n if (done) {\n callback();\n }\n } }));\n }\n else {\n this.updateViews(options);\n callback();\n }\n }\n isAsync() {\n return !!this.options.async;\n }\n setAsync(async) {\n this.options.async = async;\n }\n onRemove() {\n this.freeze();\n this.removeViews();\n }\n resetViews(cells = [], options = {}) {\n this.resetUpdates();\n this.removeViews();\n this.freeze({ key: 'reset' });\n for (let i = 0, n = cells.length; i < n; i += 1) {\n this.renderView(cells[i], options);\n }\n this.unfreeze({ key: 'reset' });\n this.sortViews();\n }\n removeView(cell) {\n const view = this.views[cell.id];\n if (view) {\n const cid = view.cid;\n const updates = this.updates;\n const mounted = updates.mounted;\n const unmounted = updates.unmounted;\n view.remove();\n delete this.views[cell.id];\n delete mounted[cid];\n delete unmounted[cid];\n }\n return view;\n }\n removeViews() {\n if (this.views) {\n Object.keys(this.views).forEach((id) => {\n const view = this.views[id];\n if (view) {\n this.removeView(view.cell);\n }\n });\n }\n this.views = {};\n }\n renderView(cell, options = {}) {\n const id = cell.id;\n const views = this.views;\n let flag = 0;\n let view = views[id];\n if (!cell.isVisible()) {\n return;\n }\n if (cell.isEdge()) {\n if (!this.isEdgeTerminalVisible(cell, 'source') ||\n !this.isEdgeTerminalVisible(cell, 'target')) {\n return;\n }\n }\n if (view) {\n flag = Renderer.FLAG_INSERT;\n }\n else {\n const tmp = this.graph.hook.createCellView(cell);\n if (tmp) {\n view = views[cell.id] = tmp;\n view.graph = this.graph;\n flag = this.registerUnmountedView(view) | view.getBootstrapFlag();\n }\n }\n if (view) {\n this.requestViewUpdate(view, flag, view.priority, options);\n }\n }\n isExactSorting() {\n return this.options.sorting === 'exact';\n }\n sortViews() {\n if (!this.isExactSorting()) {\n return;\n }\n if (this.isFrozen()) {\n // sort views once unfrozen\n this.updates.sort = true;\n return;\n }\n this.sortViewsExact();\n }\n sortElements(elems, comparator) {\n // Highly inspired by the jquery.sortElements plugin by Padolsey.\n // See http://james.padolsey.com/javascript/sorting-elements-with-jquery/.\n const placements = elems.map((elem) => {\n const parentNode = elem.parentNode;\n // Since the element itself will change position, we have\n // to have some way of storing it's original position in\n // the DOM. The easiest way is to have a 'flag' node:\n const nextSibling = parentNode.insertBefore(document.createTextNode(''), elem.nextSibling);\n return (targetNode) => {\n if (parentNode === targetNode) {\n throw new Error(\"You can't sort elements if any one is a descendant of another.\");\n }\n // Insert before flag\n parentNode.insertBefore(targetNode, nextSibling);\n // Remove flag\n parentNode.removeChild(nextSibling);\n };\n });\n elems.sort(comparator).forEach((elem, index) => placements[index](elem));\n }\n sortViewsExact() {\n // const elems = this.view.stage.querySelectorAll('[data-cell-id]')\n // const length = elems.length\n // const cells = []\n // for (let i = 0; i < length; i++) {\n // const cell = this.model.getCell(elems[i].getAttribute('data-cell-id') || '')\n // cells.push({\n // id: cell.id,\n // zIndex: cell.getZIndex() || 0,\n // elem: elems[i],\n // })\n // }\n // const sortedCells = [...cells].sort((cell1, cell2) => cell1.zIndex - cell2.zIndex)\n // const moves = ArrayExt.diff(cells, sortedCells, 'zIndex').moves\n // if (moves && moves.length) {\n // moves.forEach((move) => {\n // if (move.type) {\n // const elem = move.item.elem as Element\n // const parentNode = elem.parentNode\n // const index = move.index\n // if (parentNode) {\n // if (index === length - 1) {\n // parentNode.appendChild(elem)\n // } else if (index < length - 1) {\n // parentNode.insertBefore(elem, elems[index + 1])\n // }\n // }\n // }\n // })\n // }\n // Run insertion sort algorithm in order to efficiently sort DOM\n // elements according to their associated cell `zIndex` attribute.\n const elems = this.view\n .$(this.view.stage)\n .children('[data-cell-id]')\n .toArray();\n const model = this.model;\n this.sortElements(elems, (a, b) => {\n const cellA = model.getCell(a.getAttribute('data-cell-id') || '');\n const cellB = model.getCell(b.getAttribute('data-cell-id') || '');\n const z1 = cellA.getZIndex() || 0;\n const z2 = cellB.getZIndex() || 0;\n return z1 === z2 ? 0 : z1 < z2 ? -1 : 1;\n });\n }\n addZPivot(zIndex = 0) {\n if (this.zPivots == null) {\n this.zPivots = {};\n }\n const pivots = this.zPivots;\n let pivot = pivots[zIndex];\n if (pivot) {\n return pivot;\n }\n pivot = pivots[zIndex] = document.createComment(`z-index:${zIndex + 1}`);\n let neighborZ = -Infinity;\n // eslint-disable-next-line\n for (const key in pivots) {\n const currentZ = +key;\n if (currentZ < zIndex && currentZ > neighborZ) {\n neighborZ = currentZ;\n if (neighborZ === zIndex - 1) {\n continue;\n }\n }\n }\n const layer = this.view.stage;\n if (neighborZ !== -Infinity) {\n const neighborPivot = pivots[neighborZ];\n layer.insertBefore(pivot, neighborPivot.nextSibling);\n }\n else {\n layer.insertBefore(pivot, layer.firstChild);\n }\n return pivot;\n }\n removeZPivots() {\n if (this.zPivots) {\n Object.keys(this.zPivots).forEach((z) => {\n const elem = this.zPivots[z];\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n });\n }\n this.zPivots = {};\n }\n insertView(view) {\n const stage = this.view.stage;\n switch (this.options.sorting) {\n case 'approx': {\n const zIndex = view.cell.getZIndex();\n const pivot = this.addZPivot(zIndex);\n stage.insertBefore(view.container, pivot);\n break;\n }\n case 'exact':\n default:\n stage.appendChild(view.container);\n break;\n }\n }\n findViewByCell(cell) {\n if (cell == null) {\n return null;\n }\n const id = Cell.isCell(cell) ? cell.id : cell;\n return this.views[id];\n }\n findViewByElem(elem) {\n if (elem == null) {\n return null;\n }\n const target = typeof elem === 'string'\n ? this.view.stage.querySelector(elem)\n : elem instanceof Element\n ? elem\n : elem[0];\n if (target) {\n const id = this.view.findAttr('data-cell-id', target);\n if (id) {\n return this.views[id];\n }\n }\n return null;\n }\n findViewsFromPoint(p) {\n const ref = { x: p.x, y: p.y };\n return this.model\n .getCells()\n .map((cell) => this.findViewByCell(cell))\n .filter((view) => {\n if (view != null) {\n return Dom.getBBox(view.container, {\n target: this.view.stage,\n }).containsPoint(ref);\n }\n return false;\n });\n }\n findEdgeViewsInArea(rect, options = {}) {\n const area = Rectangle.create(rect);\n return this.model\n .getEdges()\n .map((edge) => this.findViewByCell(edge))\n .filter((view) => {\n if (view) {\n const bbox = Dom.getBBox(view.container, {\n target: this.view.stage,\n });\n if (bbox.width === 0) {\n bbox.inflate(1, 0);\n }\n else if (bbox.height === 0) {\n bbox.inflate(0, 1);\n }\n return options.strict\n ? area.containsRect(bbox)\n : area.isIntersectWithRect(bbox);\n }\n return false;\n });\n }\n findViewsInArea(rect, options = {}) {\n const area = Rectangle.create(rect);\n return this.model\n .getNodes()\n .map((node) => this.findViewByCell(node))\n .filter((view) => {\n if (view) {\n const bbox = Dom.getBBox(view.container, {\n target: this.view.stage,\n });\n return options.strict\n ? area.containsRect(bbox)\n : area.isIntersectWithRect(bbox);\n }\n return false;\n });\n }\n dispose() {\n this.resetUpdates();\n this.stopListening();\n }\n}\n__decorate([\n Base.dispose()\n], Renderer.prototype, \"dispose\", null);\n(function (Renderer) {\n Renderer.FLAG_INSERT = 1 << 30;\n Renderer.FLAG_REMOVE = 1 << 29;\n Renderer.MOUNT_BATCH_SIZE = 1000;\n Renderer.UPDATE_BATCH_SIZE = 1000;\n Renderer.MIN_PRIORITY = 2;\n Renderer.SORT_DELAYING_BATCHES = [\n 'add',\n 'to-front',\n 'to-back',\n ];\n Renderer.UPDATE_DELAYING_BATCHES = ['translate'];\n})(Renderer || (Renderer = {}));\n//# sourceMappingURL=renderer.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { ObjectExt } from '../util';\nimport { Rectangle } from '../geometry';\nimport { Background } from '../registry';\nimport { Base } from './base';\nexport class BackgroundManager extends Base {\n get elem() {\n return this.view.background;\n }\n init() {\n this.startListening();\n if (this.options.background) {\n this.draw(this.options.background);\n }\n }\n startListening() {\n this.graph.on('scale', this.update, this);\n this.graph.on('translate', this.update, this);\n }\n stopListening() {\n this.graph.off('scale', this.update, this);\n this.graph.off('translate', this.update, this);\n }\n updateBackgroundImage(options = {}) {\n let backgroundSize = options.size || 'auto auto';\n let backgroundPosition = options.position || 'center';\n const scale = this.graph.transform.getScale();\n const ts = this.graph.translate();\n // backgroundPosition\n if (typeof backgroundPosition === 'object') {\n const x = ts.tx + scale.sx * (backgroundPosition.x || 0);\n const y = ts.ty + scale.sy * (backgroundPosition.y || 0);\n backgroundPosition = `${x}px ${y}px`;\n }\n // backgroundSize\n if (typeof backgroundSize === 'object') {\n backgroundSize = Rectangle.fromSize(backgroundSize).scale(scale.sx, scale.sy);\n backgroundSize = `${backgroundSize.width}px ${backgroundSize.height}px`;\n }\n this.elem.style.backgroundSize = backgroundSize;\n this.elem.style.backgroundPosition = backgroundPosition;\n }\n drawBackgroundImage(img, options = {}) {\n if (!(img instanceof HTMLImageElement)) {\n this.elem.style.backgroundImage = '';\n return;\n }\n // draw multiple times to show the last image\n const cache = this.optionsCache;\n if (cache && cache.image !== options.image) {\n return;\n }\n let uri;\n const opacity = options.opacity;\n const backgroundSize = options.size;\n let backgroundRepeat = options.repeat || 'no-repeat';\n const pattern = Background.registry.get(backgroundRepeat);\n if (typeof pattern === 'function') {\n const quality = options.quality || 1;\n img.width *= quality;\n img.height *= quality;\n const canvas = pattern(img, options);\n if (!(canvas instanceof HTMLCanvasElement)) {\n throw new Error('Background pattern must return an HTML Canvas instance');\n }\n uri = canvas.toDataURL('image/png');\n // `repeat` was changed in pattern function\n if (options.repeat && backgroundRepeat !== options.repeat) {\n backgroundRepeat = options.repeat;\n }\n else {\n backgroundRepeat = 'repeat';\n }\n if (typeof backgroundSize === 'object') {\n // recalculate the tile size if an object passed in\n backgroundSize.width *= canvas.width / img.width;\n backgroundSize.height *= canvas.height / img.height;\n }\n else if (backgroundSize === undefined) {\n // calcule the tile size if no provided\n options.size = {\n width: canvas.width / quality,\n height: canvas.height / quality,\n };\n }\n }\n else {\n uri = img.src;\n if (backgroundSize === undefined) {\n options.size = {\n width: img.width,\n height: img.height,\n };\n }\n }\n if (cache != null &&\n typeof options.size === 'object' &&\n options.image === cache.image &&\n options.repeat === cache.repeat &&\n options.quality ===\n cache.quality) {\n cache.size = ObjectExt.clone(options.size);\n }\n const style = this.elem.style;\n style.backgroundImage = `url(${uri})`;\n style.backgroundRepeat = backgroundRepeat;\n style.opacity = opacity == null || opacity >= 1 ? '' : `${opacity}`;\n this.updateBackgroundImage(options);\n }\n updateBackgroundColor(color) {\n this.elem.style.backgroundColor = color || '';\n }\n updateBackgroundOptions(options) {\n this.graph.options.background = options;\n }\n update() {\n if (this.optionsCache) {\n this.updateBackgroundImage(this.optionsCache);\n }\n }\n draw(options) {\n const opts = options || {};\n this.updateBackgroundOptions(options);\n this.updateBackgroundColor(opts.color);\n if (opts.image) {\n this.optionsCache = ObjectExt.clone(opts);\n const img = document.createElement('img');\n img.onload = () => this.drawBackgroundImage(img, options);\n img.setAttribute('crossorigin', 'anonymous');\n img.src = opts.image;\n }\n else {\n this.drawBackgroundImage(null);\n this.optionsCache = null;\n }\n }\n clear() {\n this.draw();\n }\n dispose() {\n this.clear();\n this.stopListening();\n }\n}\n__decorate([\n Base.dispose()\n], BackgroundManager.prototype, \"dispose\", null);\n//# sourceMappingURL=background.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Platform, NumberExt, ObjectExt, Dom, FunctionExt } from '../../util';\nimport { Point, Rectangle } from '../../geometry';\nimport { View } from '../../view/view';\nimport { Renderer } from '../../graph/renderer';\nimport { GraphView } from '../../graph/view';\nimport { BackgroundManager } from '../../graph/background';\nexport class Scroller extends View {\n constructor(options) {\n super();\n this.padding = { left: 0, top: 0, right: 0, bottom: 0 };\n this.options = Util.getOptions(options);\n const scale = this.graph.transform.getScale();\n this.sx = scale.sx;\n this.sy = scale.sy;\n const width = this.options.width || this.graph.options.width;\n const height = this.options.height || this.graph.options.height;\n this.container = document.createElement('div');\n this.$container = this.$(this.container)\n .addClass(this.prefixClassName(Util.containerClass))\n .css({ width, height });\n if (this.options.pageVisible) {\n this.$container.addClass(this.prefixClassName(Util.pagedClass));\n }\n if (this.options.className) {\n this.$container.addClass(this.options.className);\n }\n const graphContainer = this.graph.container;\n if (graphContainer.parentNode) {\n this.$container.insertBefore(graphContainer);\n }\n // copy style\n const style = graphContainer.getAttribute('style');\n if (style) {\n const obj = {};\n const styles = style.split(';');\n styles.forEach((item) => {\n const section = item.trim();\n if (section) {\n const pair = section.split(':');\n if (pair.length) {\n obj[pair[0].trim()] = pair[1] ? pair[1].trim() : '';\n }\n }\n });\n Object.keys(obj).forEach((key) => {\n if (key === 'width' || key === 'height') {\n return;\n }\n graphContainer.style[key] = '';\n this.container.style[key] = obj[key];\n });\n }\n this.content = document.createElement('div');\n this.$content = this.$(this.content)\n .addClass(this.prefixClassName(Util.contentClass))\n .css({\n width: this.graph.options.width,\n height: this.graph.options.height,\n });\n // custom background\n this.background = document.createElement('div');\n this.$background = this.$(this.background).addClass(this.prefixClassName(Util.backgroundClass));\n this.$content.append(this.background);\n if (!this.options.pageVisible) {\n this.$content.append(this.graph.view.grid);\n }\n this.$content.append(graphContainer);\n this.$content.appendTo(this.container);\n this.startListening();\n if (!this.options.pageVisible) {\n this.graph.grid.update();\n }\n this.backgroundManager = new Scroller.Background(this);\n if (!this.options.autoResize) {\n this.update();\n }\n }\n get graph() {\n return this.options.graph;\n }\n get model() {\n return this.graph.model;\n }\n startListening() {\n const graph = this.graph;\n const model = this.model;\n graph.on('scale', this.onScale, this);\n graph.on('resize', this.onResize, this);\n graph.on('before:print', this.storeScrollPosition, this);\n graph.on('before:export', this.storeScrollPosition, this);\n graph.on('after:print', this.restoreScrollPosition, this);\n graph.on('after:export', this.restoreScrollPosition, this);\n graph.on('render:done', this.onRenderDone, this);\n graph.on('unfreeze', this.onUpdate, this);\n model.on('reseted', this.onUpdate, this);\n model.on('cell:added', this.onUpdate, this);\n model.on('cell:removed', this.onUpdate, this);\n model.on('cell:changed', this.onUpdate, this);\n model.on('batch:stop', this.onBatchStop, this);\n this.delegateBackgroundEvents();\n }\n stopListening() {\n const graph = this.graph;\n const model = this.model;\n graph.off('scale', this.onScale, this);\n graph.off('resize', this.onResize, this);\n graph.off('beforeprint', this.storeScrollPosition, this);\n graph.off('beforeexport', this.storeScrollPosition, this);\n graph.off('afterprint', this.restoreScrollPosition, this);\n graph.off('afterexport', this.restoreScrollPosition, this);\n graph.off('render:done', this.onRenderDone, this);\n graph.off('unfreeze', this.onUpdate, this);\n model.off('reseted', this.onUpdate, this);\n model.off('cell:added', this.onUpdate, this);\n model.off('cell:removed', this.onUpdate, this);\n model.off('cell:changed', this.onUpdate, this);\n model.off('batch:stop', this.onBatchStop, this);\n this.undelegateBackgroundEvents();\n }\n enableAutoResize() {\n this.options.autoResize = true;\n }\n disableAutoResize() {\n this.options.autoResize = false;\n }\n onUpdate() {\n if (this.graph.isAsync() || !this.options.autoResize) {\n return;\n }\n this.update();\n }\n onBatchStop(args) {\n if (this.graph.isAsync() || !this.options.autoResize) {\n return;\n }\n if (Renderer.UPDATE_DELAYING_BATCHES.includes(args.name)) {\n this.update();\n }\n }\n delegateBackgroundEvents(events) {\n const evts = events || GraphView.events;\n this.delegatedHandlers = Object.keys(evts).reduce((memo, name) => {\n const handler = evts[name];\n if (name.indexOf(' ') === -1) {\n if (typeof handler === 'function') {\n memo[name] = handler;\n }\n else {\n let method = this.graph.view[handler];\n if (typeof method === 'function') {\n method = method.bind(this.graph.view);\n memo[name] = method;\n }\n }\n }\n return memo;\n }, {});\n this.onBackgroundEvent = this.onBackgroundEvent.bind(this);\n Object.keys(this.delegatedHandlers).forEach((name) => {\n this.delegateEvent(name, {\n guarded: false,\n }, this.onBackgroundEvent);\n });\n }\n undelegateBackgroundEvents() {\n Object.keys(this.delegatedHandlers).forEach((name) => {\n this.undelegateEvent(name, this.onBackgroundEvent);\n });\n }\n onBackgroundEvent(e) {\n let valid = false;\n const target = e.target;\n if (!this.options.pageVisible) {\n const view = this.graph.view;\n valid = view.background === target || view.grid === target;\n }\n else if (this.options.background) {\n valid = this.background === target;\n }\n else {\n valid = this.content === target;\n }\n if (valid) {\n const handler = this.delegatedHandlers[e.type];\n if (typeof handler === 'function') {\n handler.apply(this.graph, arguments); // eslint-disable-line\n }\n }\n }\n onRenderDone({ stats }) {\n if (this.options.autoResize && stats.priority < 2) {\n this.update();\n }\n }\n onResize() {\n if (this.cachedCenterPoint) {\n this.centerPoint(this.cachedCenterPoint.x, this.cachedCenterPoint.y);\n this.updatePageBreak();\n }\n }\n onScale({ sx, sy, ox, oy }) {\n this.updateScale(sx, sy);\n if (ox || oy) {\n this.centerPoint(ox, oy);\n this.updatePageBreak();\n }\n const autoResizeOptions = this.options.autoResizeOptions || this.options.fitTocontentOptions;\n if (typeof autoResizeOptions === 'function') {\n this.update();\n }\n }\n storeScrollPosition() {\n this.cachedScrollLeft = this.container.scrollLeft;\n this.cachedScrollTop = this.container.scrollTop;\n }\n restoreScrollPosition() {\n this.container.scrollLeft = this.cachedScrollLeft;\n this.container.scrollTop = this.cachedScrollTop;\n this.cachedScrollLeft = null;\n this.cachedScrollTop = null;\n }\n storeClientSize() {\n this.cachedClientSize = {\n width: this.container.clientWidth,\n height: this.container.clientHeight,\n };\n }\n restoreClientSize() {\n this.cachedClientSize = null;\n }\n beforeManipulation() {\n if (Platform.IS_IE || Platform.IS_EDGE) {\n this.$container.css('visibility', 'hidden');\n }\n }\n afterManipulation() {\n if (Platform.IS_IE || Platform.IS_EDGE) {\n this.$container.css('visibility', 'visible');\n }\n }\n updatePageSize(width, height) {\n if (width != null) {\n this.options.pageWidth = width;\n }\n if (height != null) {\n this.options.pageHeight = height;\n }\n this.updatePageBreak();\n }\n updatePageBreak() {\n if (this.pageBreak && this.pageBreak.parentNode) {\n this.pageBreak.parentNode.removeChild(this.pageBreak);\n }\n this.pageBreak = null;\n if (this.options.pageVisible && this.options.pageBreak) {\n const graphWidth = this.graph.options.width;\n const graphHeight = this.graph.options.height;\n const pageWidth = this.options.pageWidth * this.sx;\n const pageHeight = this.options.pageHeight * this.sy;\n if (graphWidth > pageWidth || graphHeight > pageHeight) {\n let hasPageBreak = false;\n const container = document.createElement('div');\n for (let i = 1, l = Math.floor(graphWidth / pageWidth); i < l; i += 1) {\n this.$('<div/>')\n .addClass(this.prefixClassName(`graph-pagebreak-vertical`))\n .css({ left: i * pageWidth })\n .appendTo(container);\n hasPageBreak = true;\n }\n for (let i = 1, l = Math.floor(graphHeight / pageHeight); i < l; i += 1) {\n this.$('<div/>')\n .addClass(this.prefixClassName(`graph-pagebreak-horizontal`))\n .css({ top: i * pageHeight })\n .appendTo(container);\n hasPageBreak = true;\n }\n if (hasPageBreak) {\n Dom.addClass(container, this.prefixClassName('graph-pagebreak'));\n this.$(this.graph.view.grid).after(container);\n this.pageBreak = container;\n }\n }\n }\n }\n update() {\n const size = this.getClientSize();\n this.cachedCenterPoint = this.clientToLocalPoint(size.width / 2, size.height / 2);\n let resizeOptions = this.options.autoResizeOptions || this.options.fitTocontentOptions;\n if (typeof resizeOptions === 'function') {\n resizeOptions = FunctionExt.call(resizeOptions, this, this);\n }\n const options = Object.assign({ gridWidth: this.options.pageWidth, gridHeight: this.options.pageHeight, allowNewOrigin: 'negative' }, resizeOptions);\n this.graph.fitToContent(this.getFitToContentOptions(options));\n }\n getFitToContentOptions(options) {\n const sx = this.sx;\n const sy = this.sy;\n options.gridWidth && (options.gridWidth *= sx);\n options.gridHeight && (options.gridHeight *= sy);\n options.minWidth && (options.minWidth *= sx);\n options.minHeight && (options.minHeight *= sy);\n if (typeof options.padding === 'object') {\n options.padding = {\n left: (options.padding.left || 0) * sx,\n right: (options.padding.right || 0) * sx,\n top: (options.padding.top || 0) * sy,\n bottom: (options.padding.bottom || 0) * sy,\n };\n }\n else if (typeof options.padding === 'number') {\n options.padding *= sx;\n }\n if (!this.options.autoResize) {\n options.contentArea = Rectangle.create();\n }\n return options;\n }\n updateScale(sx, sy) {\n const options = this.graph.options;\n const dx = sx / this.sx;\n const dy = sy / this.sy;\n this.sx = sx;\n this.sy = sy;\n this.graph.translate(options.x * dx, options.y * dy);\n this.graph.resizeGraph(options.width * dx, options.height * dy);\n }\n scrollbarPosition(left, top, options) {\n if (left == null && top == null) {\n return {\n left: this.container.scrollLeft,\n top: this.container.scrollTop,\n };\n }\n const prop = {};\n if (typeof left === 'number') {\n prop.scrollLeft = left;\n }\n if (typeof top === 'number') {\n prop.scrollTop = top;\n }\n if (options && options.animation) {\n this.$container.animate(prop, options.animation);\n }\n else {\n this.$container.prop(prop);\n }\n return this;\n }\n /**\n * Try to scroll to ensure that the position (x,y) on the graph (in local\n * coordinates) is at the center of the viewport. If only one of the\n * coordinates is specified, only scroll in the specified dimension and\n * keep the other coordinate unchanged.\n */\n scrollToPoint(x, y, options) {\n const size = this.getClientSize();\n const ctm = this.graph.matrix();\n const prop = {};\n if (typeof x === 'number') {\n prop.scrollLeft = x - size.width / 2 + ctm.e + (this.padding.left || 0);\n }\n if (typeof y === 'number') {\n prop.scrollTop = y - size.height / 2 + ctm.f + (this.padding.top || 0);\n }\n if (options && options.animation) {\n this.$container.animate(prop, options.animation);\n }\n else {\n this.$container.prop(prop);\n }\n return this;\n }\n /**\n * Try to scroll to ensure that the center of graph content is at the\n * center of the viewport.\n */\n scrollToContent(options) {\n const sx = this.sx;\n const sy = this.sy;\n const center = this.graph.getContentArea().getCenter();\n return this.scrollToPoint(center.x * sx, center.y * sy, options);\n }\n /**\n * Try to scroll to ensure that the center of cell is at the center of\n * the viewport.\n */\n scrollToCell(cell, options) {\n const sx = this.sx;\n const sy = this.sy;\n const center = cell.getBBox().getCenter();\n return this.scrollToPoint(center.x * sx, center.y * sy, options);\n }\n /**\n * The center methods are more aggressive than the scroll methods. These\n * methods position the graph so that a specific point on the graph lies\n * at the center of the viewport, adding paddings around the paper if\n * necessary (e.g. if the requested point lies in a corner of the paper).\n * This means that the requested point will always move into the center\n * of the viewport. (Use the scroll functions to avoid adding paddings\n * and only scroll the viewport as far as the graph boundary.)\n */\n /**\n * Position the center of graph to the center of the viewport.\n */\n center(optons) {\n return this.centerPoint(optons);\n }\n centerPoint(x, y, options) {\n const ctm = this.graph.matrix();\n const sx = ctm.a;\n const sy = ctm.d;\n const tx = -ctm.e;\n const ty = -ctm.f;\n const tWidth = tx + this.graph.options.width;\n const tHeight = ty + this.graph.options.height;\n let localOptions;\n this.storeClientSize(); // avoid multilple reflow\n if (typeof x === 'number' || typeof y === 'number') {\n localOptions = options;\n const visibleCenter = this.getVisibleArea().getCenter();\n if (typeof x === 'number') {\n x *= sx; // eslint-disable-line\n }\n else {\n x = visibleCenter.x; // eslint-disable-line\n }\n if (typeof y === 'number') {\n y *= sy; // eslint-disable-line\n }\n else {\n y = visibleCenter.y; // eslint-disable-line\n }\n }\n else {\n localOptions = x;\n x = (tx + tWidth) / 2; // eslint-disable-line\n y = (ty + tHeight) / 2; // eslint-disable-line\n }\n if (localOptions && localOptions.padding) {\n return this.positionPoint({ x, y }, '50%', '50%', localOptions);\n }\n const padding = this.getPadding();\n const clientSize = this.getClientSize();\n const cx = clientSize.width / 2;\n const cy = clientSize.height / 2;\n const left = cx - padding.left - x + tx;\n const right = cx - padding.right + x - tWidth;\n const top = cy - padding.top - y + ty;\n const bottom = cy - padding.bottom + y - tHeight;\n this.addPadding(Math.max(left, 0), Math.max(right, 0), Math.max(top, 0), Math.max(bottom, 0));\n const result = this.scrollToPoint(x, y, localOptions || undefined);\n this.restoreClientSize();\n return result;\n }\n centerContent(options) {\n return this.positionContent('center', options);\n }\n centerCell(cell, options) {\n return this.positionCell(cell, 'center', options);\n }\n /**\n * The position methods are a more general version of the center methods.\n * They position the graph so that a specific point on the graph lies at\n * requested coordinates inside the viewport.\n */\n /**\n *\n */\n positionContent(pos, options) {\n const rect = this.graph.getContentArea(options);\n return this.positionRect(rect, pos, options);\n }\n positionCell(cell, pos, options) {\n const bbox = cell.getBBox();\n return this.positionRect(bbox, pos, options);\n }\n positionRect(rect, pos, options) {\n const bbox = Rectangle.create(rect);\n switch (pos) {\n case 'center':\n return this.positionPoint(bbox.getCenter(), '50%', '50%', options);\n case 'top':\n return this.positionPoint(bbox.getTopCenter(), '50%', 0, options);\n case 'top-right':\n return this.positionPoint(bbox.getTopRight(), '100%', 0, options);\n case 'right':\n return this.positionPoint(bbox.getRightMiddle(), '100%', '50%', options);\n case 'bottom-right':\n return this.positionPoint(bbox.getBottomRight(), '100%', '100%', options);\n case 'bottom':\n return this.positionPoint(bbox.getBottomCenter(), '50%', '100%', options);\n case 'bottom-left':\n return this.positionPoint(bbox.getBottomLeft(), 0, '100%', options);\n case 'left':\n return this.positionPoint(bbox.getLeftMiddle(), 0, '50%', options);\n case 'top-left':\n return this.positionPoint(bbox.getTopLeft(), 0, 0, options);\n default:\n return this;\n }\n }\n positionPoint(point, x, y, options = {}) {\n const { padding: pad } = options, localOptions = __rest(options, [\"padding\"]);\n const padding = NumberExt.normalizeSides(pad);\n const clientRect = Rectangle.fromSize(this.getClientSize());\n const targetRect = clientRect.clone().moveAndExpand({\n x: padding.left,\n y: padding.top,\n width: -padding.right - padding.left,\n height: -padding.top - padding.bottom,\n });\n // eslint-disable-next-line\n x = NumberExt.normalizePercentage(x, Math.max(0, targetRect.width));\n if (x < 0) {\n x = targetRect.width + x; // eslint-disable-line\n }\n // eslint-disable-next-line\n y = NumberExt.normalizePercentage(y, Math.max(0, targetRect.height));\n if (y < 0) {\n y = targetRect.height + y; // eslint-disable-line\n }\n const origin = targetRect.getTopLeft().translate(x, y);\n const diff = clientRect.getCenter().diff(origin);\n const scale = this.zoom();\n const rawDiff = diff.scale(1 / scale, 1 / scale);\n const result = Point.create(point).translate(rawDiff);\n return this.centerPoint(result.x, result.y, localOptions);\n }\n zoom(factor, options) {\n if (factor == null) {\n return this.sx;\n }\n options = options || {}; // eslint-disable-line\n let cx;\n let cy;\n const clientSize = this.getClientSize();\n const center = this.clientToLocalPoint(clientSize.width / 2, clientSize.height / 2);\n let sx = factor;\n let sy = factor;\n if (!options.absolute) {\n sx += this.sx;\n sy += this.sy;\n }\n if (options.scaleGrid) {\n sx = Math.round(sx / options.scaleGrid) * options.scaleGrid;\n sy = Math.round(sy / options.scaleGrid) * options.scaleGrid;\n }\n if (options.maxScale) {\n sx = Math.min(options.maxScale, sx);\n sy = Math.min(options.maxScale, sy);\n }\n if (options.minScale) {\n sx = Math.max(options.minScale, sx);\n sy = Math.max(options.minScale, sy);\n }\n sx = this.graph.transform.clampScale(sx);\n sy = this.graph.transform.clampScale(sy);\n if (options.center) {\n const fx = sx / this.sx;\n const fy = sy / this.sy;\n cx = options.center.x - (options.center.x - center.x) / fx;\n cy = options.center.y - (options.center.y - center.y) / fy;\n }\n else {\n cx = center.x;\n cy = center.y;\n }\n this.beforeManipulation();\n this.graph.transform.scale(sx, sy);\n this.centerPoint(cx, cy);\n this.afterManipulation();\n return this;\n }\n zoomToRect(rect, options = {}) {\n const area = Rectangle.create(rect);\n const graph = this.graph;\n options.contentArea = area;\n if (options.viewportArea == null) {\n options.viewportArea = {\n x: graph.options.x,\n y: graph.options.y,\n width: this.$container.width(),\n height: this.$container.height(),\n };\n }\n this.beforeManipulation();\n graph.transform.scaleContentToFitImpl(options, false);\n const center = area.getCenter();\n this.centerPoint(center.x, center.y);\n this.afterManipulation();\n return this;\n }\n zoomToFit(options = {}) {\n return this.zoomToRect(this.graph.getContentArea(options), options);\n }\n transitionToPoint(x, y, options) {\n if (typeof x === 'object') {\n options = y; // eslint-disable-line\n y = x.y; // eslint-disable-line\n x = x.x; // eslint-disable-line\n }\n else {\n y = y; // eslint-disable-line\n }\n if (options == null) {\n options = {}; // eslint-disable-line\n }\n let transform;\n let transformOrigin;\n const scale = this.sx;\n const targetScale = Math.max(options.scale || scale, 0.000001);\n const clientSize = this.getClientSize();\n const targetPoint = new Point(x, y);\n const localPoint = this.clientToLocalPoint(clientSize.width / 2, clientSize.height / 2);\n if (scale === targetScale) {\n const translate = localPoint.diff(targetPoint).scale(scale, scale).round();\n transform = `translate(${translate.x}px,${translate.y}px)`;\n }\n else {\n const delta = (targetScale / (scale - targetScale)) * targetPoint.distance(localPoint);\n const range = localPoint.clone().move(targetPoint, delta);\n const origin = this.localToBackgroundPoint(range).round();\n transform = `scale(${targetScale / scale})`;\n transformOrigin = `${origin.x}px ${origin.y}px`;\n }\n const onTransitionEnd = options.onTransitionEnd;\n this.$container.addClass(Util.transitionClassName);\n this.$content\n .off(Util.transitionEventName)\n .on(Util.transitionEventName, (e) => {\n this.syncTransition(targetScale, { x: x, y: y });\n if (typeof onTransitionEnd === 'function') {\n FunctionExt.call(onTransitionEnd, this, e.originalEvent);\n }\n })\n .css({\n transform,\n transformOrigin,\n transition: 'transform',\n transitionDuration: options.duration || '1s',\n transitionDelay: options.delay,\n transitionTimingFunction: options.timing,\n });\n return this;\n }\n syncTransition(scale, p) {\n this.beforeManipulation();\n this.graph.scale(scale);\n this.removeTransition();\n this.centerPoint(p.x, p.y);\n this.afterManipulation();\n return this;\n }\n removeTransition() {\n this.$container.removeClass(Util.transitionClassName);\n this.$content.off(Util.transitionEventName).css({\n transform: '',\n transformOrigin: '',\n transition: '',\n transitionDuration: '',\n transitionDelay: '',\n transitionTimingFunction: '',\n });\n return this;\n }\n transitionToRect(rectangle, options = {}) {\n const rect = Rectangle.create(rectangle);\n const maxScale = options.maxScale || Infinity;\n const minScale = options.minScale || Number.MIN_VALUE;\n const scaleGrid = options.scaleGrid || null;\n const PIXEL_SIZE = options.visibility || 1;\n const center = options.center\n ? Point.create(options.center)\n : rect.getCenter();\n const clientSize = this.getClientSize();\n const w = clientSize.width * PIXEL_SIZE;\n const h = clientSize.height * PIXEL_SIZE;\n let scale = new Rectangle(center.x - w / 2, center.y - h / 2, w, h).getMaxUniformScaleToFit(rect, center);\n scale = Math.min(scale, maxScale);\n if (scaleGrid) {\n scale = Math.floor(scale / scaleGrid) * scaleGrid;\n }\n scale = Math.max(minScale, scale);\n return this.transitionToPoint(center, Object.assign({ scale }, options));\n }\n startPanning(evt) {\n const e = this.normalizeEvent(evt);\n this.clientX = e.clientX;\n this.clientY = e.clientY;\n this.trigger('pan:start', { e });\n this.$(document.body).on({\n 'mousemove.panning touchmove.panning': this.pan.bind(this),\n 'mouseup.panning touchend.panning': this.stopPanning.bind(this),\n 'mouseleave.panning': this.stopPanning.bind(this),\n });\n this.$(window).on('mouseup.panning', this.stopPanning.bind(this));\n }\n pan(evt) {\n const e = this.normalizeEvent(evt);\n const dx = e.clientX - this.clientX;\n const dy = e.clientY - this.clientY;\n this.container.scrollTop -= dy;\n this.container.scrollLeft -= dx;\n this.clientX = e.clientX;\n this.clientY = e.clientY;\n this.trigger('panning', { e });\n }\n stopPanning(e) {\n this.$(document.body).off('.panning');\n this.$(window).off('.panning');\n this.trigger('pan:stop', { e });\n }\n clientToLocalPoint(a, b) {\n let x = typeof a === 'object' ? a.x : a;\n let y = typeof a === 'object' ? a.y : b;\n const ctm = this.graph.matrix();\n x += this.container.scrollLeft - this.padding.left - ctm.e;\n y += this.container.scrollTop - this.padding.top - ctm.f;\n return new Point(x / ctm.a, y / ctm.d);\n }\n localToBackgroundPoint(x, y) {\n const p = typeof x === 'object' ? Point.create(x) : new Point(x, y);\n const ctm = this.graph.matrix();\n const padding = this.padding;\n return Dom.transformPoint(p, ctm).translate(padding.left, padding.top);\n }\n resize(width, height) {\n let w = width != null ? width : this.container.clientWidth;\n let h = height != null ? height : this.container.clientHeight;\n if (typeof w === 'number') {\n w = Math.round(w);\n }\n if (typeof h === 'number') {\n h = Math.round(h);\n }\n this.options.width = w;\n this.options.height = h;\n this.$container.css({ width: w, height: h });\n this.update();\n }\n getClientSize() {\n if (this.cachedClientSize) {\n return this.cachedClientSize;\n }\n return {\n width: this.container.clientWidth,\n height: this.container.clientHeight,\n };\n }\n autoScroll(clientX, clientY) {\n const buffer = 10;\n const container = this.container;\n const rect = container.getBoundingClientRect();\n let dx = 0;\n let dy = 0;\n if (clientX <= rect.left + buffer) {\n dx = -buffer;\n }\n if (clientY <= rect.top + buffer) {\n dy = -buffer;\n }\n if (clientX >= rect.right - buffer) {\n dx = buffer;\n }\n if (clientY >= rect.bottom - buffer) {\n dy = buffer;\n }\n if (dx !== 0) {\n container.scrollLeft += dx;\n }\n if (dy !== 0) {\n container.scrollTop += dy;\n }\n return {\n scrollerX: dx,\n scrollerY: dy,\n };\n }\n addPadding(left, right, top, bottom) {\n let padding = this.getPadding();\n this.padding = {\n left: Math.round(padding.left + (left || 0)),\n top: Math.round(padding.top + (top || 0)),\n bottom: Math.round(padding.bottom + (bottom || 0)),\n right: Math.round(padding.right + (right || 0)),\n };\n padding = this.padding;\n this.$content.css({\n width: padding.left + this.graph.options.width + padding.right,\n height: padding.top + this.graph.options.height + padding.bottom,\n });\n const container = this.graph.container;\n container.style.left = `${this.padding.left}px`;\n container.style.top = `${this.padding.top}px`;\n return this;\n }\n getPadding() {\n const padding = this.options.padding;\n if (typeof padding === 'function') {\n return NumberExt.normalizeSides(FunctionExt.call(padding, this, this));\n }\n return NumberExt.normalizeSides(padding);\n }\n /**\n * Returns the untransformed size and origin of the current viewport.\n */\n getVisibleArea() {\n const ctm = this.graph.matrix();\n const size = this.getClientSize();\n const box = {\n x: this.container.scrollLeft || 0,\n y: this.container.scrollTop || 0,\n width: size.width,\n height: size.height,\n };\n const area = Dom.transformRectangle(box, ctm.inverse());\n area.x -= (this.padding.left || 0) / this.sx;\n area.y -= (this.padding.top || 0) / this.sy;\n return area;\n }\n isCellVisible(cell, options = {}) {\n const bbox = cell.getBBox();\n const area = this.getVisibleArea();\n return options.strict\n ? area.containsRect(bbox)\n : area.isIntersectWithRect(bbox);\n }\n isPointVisible(point) {\n return this.getVisibleArea().containsPoint(point);\n }\n /**\n * Lock the current viewport by disabling user scrolling.\n */\n lock() {\n this.$container.css('overflow', 'hidden');\n return this;\n }\n /**\n * Enable user scrolling if previously locked.\n */\n unlock() {\n this.$container.css('overflow', 'scroll');\n return this;\n }\n onRemove() {\n this.stopListening();\n }\n dispose() {\n this.$(this.graph.container).insertBefore(this.$container);\n this.remove();\n }\n}\n__decorate([\n View.dispose()\n], Scroller.prototype, \"dispose\", null);\n(function (Scroller) {\n class Background extends BackgroundManager {\n constructor(scroller) {\n super(scroller.graph);\n this.scroller = scroller;\n if (scroller.options.background) {\n this.draw(scroller.options.background);\n }\n }\n get elem() {\n return this.scroller.background;\n }\n init() {\n this.graph.on('scale', this.update, this);\n this.graph.on('translate', this.update, this);\n }\n updateBackgroundOptions(options) {\n this.scroller.options.background = options;\n }\n }\n Scroller.Background = Background;\n})(Scroller || (Scroller = {}));\nvar Util;\n(function (Util) {\n Util.containerClass = 'graph-scroller';\n Util.panningClass = `${Util.containerClass}-panning`;\n Util.pannableClass = `${Util.containerClass}-pannable`;\n Util.pagedClass = `${Util.containerClass}-paged`;\n Util.contentClass = `${Util.containerClass}-content`;\n Util.backgroundClass = `${Util.containerClass}-background`;\n Util.transitionClassName = 'transition-in-progress';\n Util.transitionEventName = 'transitionend.graph-scroller-transition';\n Util.defaultOptions = {\n padding() {\n const size = this.getClientSize();\n const minWidth = Math.max(this.options.minVisibleWidth || 0, 1) || 1;\n const minHeight = Math.max(this.options.minVisibleHeight || 0, 1) || 1;\n const left = Math.max(size.width - minWidth, 0);\n const top = Math.max(size.height - minHeight, 0);\n return { left, top, right: left, bottom: top };\n },\n minVisibleWidth: 50,\n minVisibleHeight: 50,\n pageVisible: false,\n pageBreak: false,\n autoResize: true,\n };\n function getOptions(options) {\n const result = ObjectExt.merge({}, Util.defaultOptions, options);\n if (result.pageWidth == null) {\n result.pageWidth = options.graph.options.width;\n }\n if (result.pageHeight == null) {\n result.pageHeight = options.graph.options.height;\n }\n return result;\n }\n Util.getOptions = getOptions;\n})(Util || (Util = {}));\n//# sourceMappingURL=index.js.map","export function notify(name, evt, view, args = {}) {\n if (view) {\n const graph = view.graph;\n const e = graph.view.normalizeEvent(evt);\n const localPoint = graph.snapToGrid(e.clientX, e.clientY);\n view.notify(name, Object.assign({ e,\n view, node: view.cell, cell: view.cell, x: localPoint.x, y: localPoint.y }, args));\n }\n}\n//# sourceMappingURL=util.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Util } from '../../global';\nimport { Rectangle, Angle } from '../../geometry';\nimport { ObjectExt, StringExt, FunctionExt } from '../../util';\nimport { Cell } from '../../model/cell';\nimport { Collection } from '../../model/collection';\nimport { View } from '../../view/view';\nimport { notify } from '../transform/util';\nimport { Handle } from '../common';\nexport class Selection extends View {\n constructor(options) {\n super();\n this.options = ObjectExt.merge({}, Private.defaultOptions, options);\n if (this.options.model) {\n this.options.collection = this.options.model.collection;\n }\n if (this.options.collection) {\n this.collection = this.options.collection;\n }\n else {\n this.collection = new Collection([], {\n comparator: Private.depthComparator,\n });\n this.options.collection = this.collection;\n }\n this.boxCount = 0;\n this.createContainer();\n this.initHandles();\n this.startListening();\n }\n get graph() {\n return this.options.graph;\n }\n get boxClassName() {\n return this.prefixClassName(Private.classNames.box);\n }\n get $boxes() {\n return this.$container.children(`.${this.boxClassName}`);\n }\n get handleOptions() {\n return this.options;\n }\n startListening() {\n const graph = this.graph;\n const collection = this.collection;\n this.delegateEvents({\n [`mousedown .${this.boxClassName}`]: 'onSelectionBoxMouseDown',\n [`touchstart .${this.boxClassName}`]: 'onSelectionBoxMouseDown',\n }, true);\n graph.on('scale', this.onGraphTransformed, this);\n graph.on('translate', this.onGraphTransformed, this);\n graph.model.on('updated', this.onModelUpdated, this);\n collection.on('added', this.onCellAdded, this);\n collection.on('removed', this.onCellRemoved, this);\n collection.on('reseted', this.onReseted, this);\n collection.on('updated', this.onCollectionUpdated, this);\n collection.on('node:change:position', this.onNodePositionChanged, this);\n collection.on('cell:changed', this.onCellChanged, this);\n }\n stopListening() {\n const graph = this.graph;\n const collection = this.collection;\n this.undelegateEvents();\n graph.off('scale', this.onGraphTransformed, this);\n graph.off('translate', this.onGraphTransformed, this);\n graph.model.off('updated', this.onModelUpdated, this);\n collection.off('added', this.onCellAdded, this);\n collection.off('removed', this.onCellRemoved, this);\n collection.off('reseted', this.onReseted, this);\n collection.off('updated', this.onCollectionUpdated, this);\n collection.off('node:change:position', this.onNodePositionChanged, this);\n collection.off('cell:changed', this.onCellChanged, this);\n }\n onRemove() {\n this.stopListening();\n }\n onGraphTransformed() {\n this.updateSelectionBoxes({ async: false });\n }\n onCellChanged() {\n this.updateSelectionBoxes();\n }\n onNodePositionChanged({ node, options, }) {\n const { showNodeSelectionBox, pointerEvents } = this.options;\n const { ui, selection } = options;\n let allowTranslating = !this.translating;\n /* Scenarios where this method is not called:\n * 1. ShowNodeSelection is true or ponterEvents is none\n * 2. Avoid circular calls with the selection tag\n */\n allowTranslating =\n allowTranslating &&\n (showNodeSelectionBox !== true || pointerEvents === 'none');\n allowTranslating = allowTranslating && ui && !selection;\n if (allowTranslating) {\n this.translating = true;\n const current = node.position();\n const previous = node.previous('position');\n const dx = current.x - previous.x;\n const dy = current.y - previous.y;\n if (dx !== 0 || dy !== 0) {\n this.translateSelectedNodes(dx, dy, node, options);\n }\n this.translating = false;\n }\n }\n onModelUpdated({ removed }) {\n if (removed && removed.length) {\n this.unselect(removed);\n }\n }\n isEmpty() {\n return this.length <= 0;\n }\n isSelected(cell) {\n return this.collection.has(cell);\n }\n get length() {\n return this.collection.length;\n }\n get cells() {\n return this.collection.toArray();\n }\n select(cells, options = {}) {\n options.dryrun = true;\n const items = this.filter(Array.isArray(cells) ? cells : [cells]);\n this.collection.add(items, options);\n return this;\n }\n unselect(cells, options = {}) {\n // dryrun to prevent cell be removed from graph\n options.dryrun = true;\n this.collection.remove(Array.isArray(cells) ? cells : [cells], options);\n return this;\n }\n reset(cells, options = {}) {\n if (cells) {\n if (options.batch) {\n const filterCells = this.filter(Array.isArray(cells) ? cells : [cells]);\n this.collection.reset(filterCells, Object.assign(Object.assign({}, options), { ui: true }));\n return this;\n }\n const prev = this.cells;\n const next = this.filter(Array.isArray(cells) ? cells : [cells]);\n const prevMap = {};\n const nextMap = {};\n prev.forEach((cell) => (prevMap[cell.id] = cell));\n next.forEach((cell) => (nextMap[cell.id] = cell));\n const added = [];\n const removed = [];\n next.forEach((cell) => {\n if (!prevMap[cell.id]) {\n added.push(cell);\n }\n });\n prev.forEach((cell) => {\n if (!nextMap[cell.id]) {\n removed.push(cell);\n }\n });\n if (removed.length) {\n this.unselect(removed, Object.assign(Object.assign({}, options), { ui: true }));\n }\n if (added.length) {\n this.select(added, Object.assign(Object.assign({}, options), { ui: true }));\n }\n if (removed.length === 0 && added.length === 0) {\n this.updateContainer();\n }\n return this;\n }\n return this.clean(options);\n }\n clean(options = {}) {\n if (this.length) {\n if (options.batch === false) {\n this.unselect(this.cells, options);\n }\n else {\n this.collection.reset([], Object.assign(Object.assign({}, options), { ui: true }));\n }\n }\n return this;\n }\n setFilter(filter) {\n this.options.filter = filter;\n }\n setContent(content) {\n this.options.content = content;\n }\n startSelecting(evt) {\n // Flow: startSelecting => adjustSelection => stopSelecting\n evt = this.normalizeEvent(evt); // eslint-disable-line\n this.clean();\n let x;\n let y;\n const graphContainer = this.graph.container;\n if (evt.offsetX != null &&\n evt.offsetY != null &&\n graphContainer.contains(evt.target)) {\n x = evt.offsetX;\n y = evt.offsetY;\n }\n else {\n const offset = this.$(graphContainer).offset();\n const scrollLeft = graphContainer.scrollLeft;\n const scrollTop = graphContainer.scrollTop;\n x = evt.clientX - offset.left + window.pageXOffset + scrollLeft;\n y = evt.clientY - offset.top + window.pageYOffset + scrollTop;\n }\n this.$container.css({\n top: y,\n left: x,\n width: 1,\n height: 1,\n });\n this.setEventData(evt, {\n action: 'selecting',\n clientX: evt.clientX,\n clientY: evt.clientY,\n offsetX: x,\n offsetY: y,\n scrollerX: 0,\n scrollerY: 0,\n });\n this.delegateDocumentEvents(Private.documentEvents, evt.data);\n }\n filter(cells) {\n const filter = this.options.filter;\n if (Array.isArray(filter)) {\n return cells.filter((cell) => !filter.includes(cell) && !filter.includes(cell.shape));\n }\n if (typeof filter === 'function') {\n return cells.filter((cell) => FunctionExt.call(filter, this.graph, cell));\n }\n return cells;\n }\n stopSelecting(evt) {\n const graph = this.graph;\n const eventData = this.getEventData(evt);\n const action = eventData.action;\n switch (action) {\n case 'selecting': {\n let width = this.$container.width();\n let height = this.$container.height();\n const offset = this.$container.offset();\n const origin = graph.pageToLocal(offset.left, offset.top);\n const scale = graph.transform.getScale();\n width /= scale.sx;\n height /= scale.sy;\n const rect = new Rectangle(origin.x, origin.y, width, height);\n const cells = this.getCellViewsInArea(rect).map((view) => view.cell);\n this.reset(cells, { batch: true });\n this.hideRubberband();\n break;\n }\n case 'translating': {\n const client = graph.snapToGrid(evt.clientX, evt.clientY);\n if (!this.options.following) {\n const data = eventData;\n this.updateSelectedNodesPosition({\n dx: data.clientX - data.originX,\n dy: data.clientY - data.originY,\n });\n }\n this.graph.model.stopBatch('move-selection');\n this.notifyBoxEvent('box:mouseup', evt, client.x, client.y);\n break;\n }\n default: {\n this.clean();\n break;\n }\n }\n }\n onMouseUp(evt) {\n const action = this.getEventData(evt).action;\n if (action) {\n this.stopSelecting(evt);\n this.undelegateDocumentEvents();\n }\n }\n onSelectionBoxMouseDown(evt) {\n if (!this.options.following) {\n evt.stopPropagation();\n }\n const e = this.normalizeEvent(evt);\n if (this.options.movable) {\n this.startTranslating(e);\n }\n const activeView = this.getCellViewFromElem(e.target);\n this.setEventData(e, { activeView });\n const client = this.graph.snapToGrid(e.clientX, e.clientY);\n this.notifyBoxEvent('box:mousedown', e, client.x, client.y);\n this.delegateDocumentEvents(Private.documentEvents, e.data);\n }\n startTranslating(evt) {\n this.graph.model.startBatch('move-selection');\n const client = this.graph.snapToGrid(evt.clientX, evt.clientY);\n this.setEventData(evt, {\n action: 'translating',\n clientX: client.x,\n clientY: client.y,\n originX: client.x,\n originY: client.y,\n });\n }\n getSelectionOffset(client, data) {\n let dx = client.x - data.clientX;\n let dy = client.y - data.clientY;\n const restrict = this.graph.hook.getRestrictArea();\n if (restrict) {\n const cells = this.collection.toArray();\n const totalBBox = Cell.getCellsBBox(cells, { deep: true }) || Rectangle.create();\n const minDx = restrict.x - totalBBox.x;\n const minDy = restrict.y - totalBBox.y;\n const maxDx = restrict.x + restrict.width - (totalBBox.x + totalBBox.width);\n const maxDy = restrict.y + restrict.height - (totalBBox.y + totalBBox.height);\n if (dx < minDx) {\n dx = minDx;\n }\n if (dy < minDy) {\n dy = minDy;\n }\n if (maxDx < dx) {\n dx = maxDx;\n }\n if (maxDy < dy) {\n dy = maxDy;\n }\n if (!this.options.following) {\n const offsetX = client.x - data.originX;\n const offsetY = client.y - data.originY;\n dx = offsetX <= minDx || offsetX >= maxDx ? 0 : dx;\n dy = offsetY <= minDy || offsetY >= maxDy ? 0 : dy;\n }\n }\n return {\n dx,\n dy,\n };\n }\n updateSelectedNodesPosition(offset) {\n const { dx, dy } = offset;\n if (dx || dy) {\n if ((this.translateSelectedNodes(dx, dy), this.boxesUpdated)) {\n if (this.collection.length > 1) {\n this.updateSelectionBoxes();\n }\n }\n else {\n const scale = this.graph.transform.getScale();\n this.$boxes.add(this.$selectionContainer).css({\n left: `+=${dx * scale.sx}`,\n top: `+=${dy * scale.sy}`,\n });\n }\n }\n }\n autoScrollGraph(x, y) {\n const scroller = this.graph.scroller.widget;\n if (scroller) {\n return scroller.autoScroll(x, y);\n }\n return { scrollerX: 0, scrollerY: 0 };\n }\n adjustSelection(evt) {\n const e = this.normalizeEvent(evt);\n const eventData = this.getEventData(e);\n const action = eventData.action;\n switch (action) {\n case 'selecting': {\n const data = eventData;\n if (data.moving !== true) {\n this.$container.appendTo(this.graph.container);\n this.showRubberband();\n data.moving = true;\n }\n const { scrollerX, scrollerY } = this.autoScrollGraph(e.clientX, e.clientY);\n data.scrollerX += scrollerX;\n data.scrollerY += scrollerY;\n const dx = e.clientX - data.clientX + data.scrollerX;\n const dy = e.clientY - data.clientY + data.scrollerY;\n const left = parseInt(this.$container.css('left'), 10);\n const top = parseInt(this.$container.css('top'), 10);\n this.$container.css({\n left: dx < 0 ? data.offsetX + dx : left,\n top: dy < 0 ? data.offsetY + dy : top,\n width: Math.abs(dx),\n height: Math.abs(dy),\n });\n break;\n }\n case 'translating': {\n const client = this.graph.snapToGrid(e.clientX, e.clientY);\n const data = eventData;\n const offset = this.getSelectionOffset(client, data);\n if (this.options.following) {\n this.updateSelectedNodesPosition(offset);\n }\n else {\n this.updateContainerPosition(offset);\n }\n if (offset.dx) {\n data.clientX = client.x;\n }\n if (offset.dy) {\n data.clientY = client.y;\n }\n this.notifyBoxEvent('box:mousemove', evt, client.x, client.y);\n break;\n }\n default:\n break;\n }\n this.boxesUpdated = false;\n }\n translateSelectedNodes(dx, dy, exclude, otherOptions) {\n const map = {};\n const excluded = [];\n if (exclude) {\n map[exclude.id] = true;\n }\n this.collection.toArray().forEach((cell) => {\n cell.getDescendants({ deep: true }).forEach((child) => {\n map[child.id] = true;\n });\n });\n if (otherOptions && otherOptions.translateBy) {\n const currentCell = this.graph.getCellById(otherOptions.translateBy);\n if (currentCell) {\n map[currentCell.id] = true;\n currentCell.getDescendants({ deep: true }).forEach((child) => {\n map[child.id] = true;\n });\n excluded.push(currentCell);\n }\n }\n this.collection.toArray().forEach((cell) => {\n if (!map[cell.id]) {\n const options = Object.assign(Object.assign({}, otherOptions), { selection: this.cid, exclude: excluded });\n cell.translate(dx, dy, options);\n this.graph.model.getConnectedEdges(cell).forEach((edge) => {\n if (!map[edge.id]) {\n edge.translate(dx, dy, options);\n map[edge.id] = true;\n }\n });\n }\n });\n }\n getCellViewsInArea(rect) {\n const graph = this.graph;\n const options = {\n strict: this.options.strict,\n };\n let views = [];\n if (this.options.rubberNode) {\n if (this.options.useCellGeometry) {\n views = views.concat(graph.model\n .getNodesInArea(rect, options)\n .map((node) => graph.renderer.findViewByCell(node))\n .filter((view) => view != null));\n }\n else {\n views = views.concat(graph.renderer.findViewsInArea(rect, options));\n }\n }\n if (this.options.rubberEdge) {\n if (this.options.useCellGeometry) {\n views = views.concat(graph.model\n .getEdgesInArea(rect, options)\n .map((edge) => graph.renderer.findViewByCell(edge))\n .filter((view) => view != null));\n }\n else {\n views = views.concat(graph.renderer.findEdgeViewsInArea(rect, options));\n }\n }\n return views;\n }\n notifyBoxEvent(name, e, x, y) {\n const data = this.getEventData(e);\n const view = data.activeView;\n this.trigger(name, { e, view, x, y, cell: view.cell });\n }\n getSelectedClassName(cell) {\n return this.prefixClassName(`${cell.isNode() ? 'node' : 'edge'}-selected`);\n }\n addCellSelectedClassName(cell) {\n const view = this.graph.renderer.findViewByCell(cell);\n if (view) {\n view.addClass(this.getSelectedClassName(cell));\n }\n }\n removeCellUnSelectedClassName(cell) {\n const view = this.graph.renderer.findViewByCell(cell);\n if (view) {\n view.removeClass(this.getSelectedClassName(cell));\n }\n }\n destroySelectionBox(cell) {\n this.removeCellUnSelectedClassName(cell);\n if (this.canShowSelectionBox(cell)) {\n this.$container.find(`[data-cell-id=\"${cell.id}\"]`).remove();\n if (this.$boxes.length === 0) {\n this.hide();\n }\n this.boxCount = Math.max(0, this.boxCount - 1);\n }\n }\n destroyAllSelectionBoxes(cells) {\n cells.forEach((cell) => this.removeCellUnSelectedClassName(cell));\n this.hide();\n this.$boxes.remove();\n this.boxCount = 0;\n }\n hide() {\n this.$container\n .removeClass(this.prefixClassName(Private.classNames.rubberband))\n .removeClass(this.prefixClassName(Private.classNames.selected));\n }\n showRubberband() {\n this.$container.addClass(this.prefixClassName(Private.classNames.rubberband));\n }\n hideRubberband() {\n this.$container.removeClass(this.prefixClassName(Private.classNames.rubberband));\n }\n showSelected() {\n this.$container\n .removeAttr('style')\n .addClass(this.prefixClassName(Private.classNames.selected));\n }\n createContainer() {\n this.container = document.createElement('div');\n this.$container = this.$(this.container);\n this.$container.addClass(this.prefixClassName(Private.classNames.root));\n if (this.options.className) {\n this.$container.addClass(this.options.className);\n }\n this.$selectionContainer = this.$('<div/>').addClass(this.prefixClassName(Private.classNames.inner));\n this.$selectionContent = this.$('<div/>').addClass(this.prefixClassName(Private.classNames.content));\n this.$selectionContainer.append(this.$selectionContent);\n this.$selectionContainer.attr('data-selection-length', this.collection.length);\n this.$container.prepend(this.$selectionContainer);\n this.$handleContainer = this.$selectionContainer;\n }\n updateContainerPosition(offset) {\n if (offset.dx || offset.dy) {\n this.$selectionContainer.css({\n left: `+=${offset.dx}`,\n top: `+=${offset.dy}`,\n });\n }\n }\n updateContainer() {\n const origin = { x: Infinity, y: Infinity };\n const corner = { x: 0, y: 0 };\n const cells = this.collection\n .toArray()\n .filter((cell) => this.canShowSelectionBox(cell));\n cells.forEach((cell) => {\n const view = this.graph.renderer.findViewByCell(cell);\n if (view) {\n const bbox = view.getBBox({\n useCellGeometry: this.options.useCellGeometry,\n });\n origin.x = Math.min(origin.x, bbox.x);\n origin.y = Math.min(origin.y, bbox.y);\n corner.x = Math.max(corner.x, bbox.x + bbox.width);\n corner.y = Math.max(corner.y, bbox.y + bbox.height);\n }\n });\n this.$selectionContainer\n .css({\n position: 'absolute',\n pointerEvents: 'none',\n left: origin.x,\n top: origin.y,\n width: corner.x - origin.x,\n height: corner.y - origin.y,\n })\n .attr('data-selection-length', this.collection.length);\n const boxContent = this.options.content;\n if (boxContent) {\n if (typeof boxContent === 'function') {\n const content = FunctionExt.call(boxContent, this.graph, this, this.$selectionContent[0]);\n if (content) {\n this.$selectionContent.html(content);\n }\n }\n else {\n this.$selectionContent.html(boxContent);\n }\n }\n if (this.collection.length > 0 && !this.container.parentNode) {\n this.$container.appendTo(this.graph.container);\n }\n else if (this.collection.length <= 0 && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n canShowSelectionBox(cell) {\n return ((cell.isNode() && this.options.showNodeSelectionBox === true) ||\n (cell.isEdge() && this.options.showEdgeSelectionBox === true));\n }\n createSelectionBox(cell) {\n this.addCellSelectedClassName(cell);\n if (this.canShowSelectionBox(cell)) {\n const view = this.graph.renderer.findViewByCell(cell);\n if (view) {\n const bbox = view.getBBox({\n useCellGeometry: this.options.useCellGeometry,\n });\n const className = this.boxClassName;\n this.$('<div/>')\n .addClass(className)\n .addClass(`${className}-${cell.isNode() ? 'node' : 'edge'}`)\n .attr('data-cell-id', cell.id)\n .css({\n position: 'absolute',\n left: bbox.x,\n top: bbox.y,\n width: bbox.width,\n height: bbox.height,\n pointerEvents: this.options.pointerEvents || 'auto',\n })\n .appendTo(this.container);\n this.showSelected();\n this.boxCount += 1;\n }\n }\n }\n updateSelectionBoxes(options = {}) {\n if (this.collection.length > 0) {\n this.boxesUpdated = true;\n this.graph.renderer.requestViewUpdate(this, 1, 2, options);\n }\n }\n confirmUpdate() {\n if (this.boxCount) {\n this.hide();\n this.$boxes.each((_, elem) => {\n const cellId = this.$(elem).remove().attr('data-cell-id');\n const cell = this.collection.get(cellId);\n if (cell) {\n this.createSelectionBox(cell);\n }\n });\n this.updateContainer();\n }\n return 0;\n }\n getCellViewFromElem(elem) {\n const id = elem.getAttribute('data-cell-id');\n if (id) {\n const cell = this.collection.get(id);\n if (cell) {\n return this.graph.renderer.findViewByCell(cell);\n }\n }\n return null;\n }\n onCellRemoved({ cell }) {\n this.destroySelectionBox(cell);\n this.updateContainer();\n }\n onReseted({ previous, current }) {\n this.destroyAllSelectionBoxes(previous);\n current.forEach((cell) => {\n this.listenCellRemoveEvent(cell);\n this.createSelectionBox(cell);\n });\n this.updateContainer();\n }\n onCellAdded({ cell }) {\n // The collection do not known the cell was removed when cell was\n // removed by interaction(such as, by \"delete\" shortcut), so we should\n // manually listen to cell's remove evnet.\n this.listenCellRemoveEvent(cell);\n this.createSelectionBox(cell);\n this.updateContainer();\n }\n listenCellRemoveEvent(cell) {\n cell.off('removed', this.onCellRemoved, this);\n cell.on('removed', this.onCellRemoved, this);\n }\n onCollectionUpdated({ added, removed, options, }) {\n added.forEach((cell) => {\n this.trigger('cell:selected', { cell, options });\n this.graph.trigger('cell:selected', { cell, options });\n if (cell.isNode()) {\n this.trigger('node:selected', { cell, options, node: cell });\n this.graph.trigger('node:selected', { cell, options, node: cell });\n }\n else if (cell.isEdge()) {\n this.trigger('edge:selected', { cell, options, edge: cell });\n this.graph.trigger('edge:selected', { cell, options, edge: cell });\n }\n });\n removed.forEach((cell) => {\n this.trigger('cell:unselected', { cell, options });\n this.graph.trigger('cell:unselected', { cell, options });\n if (cell.isNode()) {\n this.trigger('node:unselected', { cell, options, node: cell });\n this.graph.trigger('node:unselected', { cell, options, node: cell });\n }\n else if (cell.isEdge()) {\n this.trigger('edge:unselected', { cell, options, edge: cell });\n this.graph.trigger('edge:unselected', { cell, options, edge: cell });\n }\n });\n const args = {\n added,\n removed,\n options,\n selected: this.cells,\n };\n this.trigger('selection:changed', args);\n this.graph.trigger('selection:changed', args);\n }\n // #region handle\n deleteSelectedCells() {\n const cells = this.collection.toArray();\n this.clean();\n this.graph.model.removeCells(cells, { selection: this.cid });\n }\n startRotate({ e }) {\n const cells = this.collection.toArray();\n const center = Cell.getCellsBBox(cells).getCenter();\n const client = this.graph.snapToGrid(e.clientX, e.clientY);\n const angles = cells.reduce((memo, cell) => {\n memo[cell.id] = Angle.normalize(cell.getAngle());\n return memo;\n }, {});\n this.setEventData(e, {\n center,\n angles,\n start: client.theta(center),\n });\n }\n doRotate({ e }) {\n const data = this.getEventData(e);\n const grid = this.graph.options.rotating.grid;\n const gridSize = typeof grid === 'function'\n ? FunctionExt.call(grid, this.graph, null)\n : grid;\n const client = this.graph.snapToGrid(e.clientX, e.clientY);\n const delta = data.start - client.theta(data.center);\n if (!data.rotated) {\n data.rotated = true;\n }\n if (Math.abs(delta) > 0.001) {\n this.collection.toArray().forEach((node) => {\n const angle = Util.snapToGrid(data.angles[node.id] + delta, gridSize || 15);\n node.rotate(angle, {\n absolute: true,\n center: data.center,\n selection: this.cid,\n });\n });\n this.updateSelectionBoxes();\n }\n }\n stopRotate({ e }) {\n const data = this.getEventData(e);\n if (data.rotated) {\n data.rotated = false;\n this.collection.toArray().forEach((node) => {\n notify('node:rotated', e, this.graph.findViewByCell(node));\n });\n }\n }\n startResize({ e }) {\n const gridSize = this.graph.getGridSize();\n const cells = this.collection.toArray();\n const bbox = Cell.getCellsBBox(cells);\n const bboxes = cells.map((cell) => cell.getBBox());\n const maxWidth = bboxes.reduce((maxWidth, bbox) => {\n return bbox.width < maxWidth ? bbox.width : maxWidth;\n }, Infinity);\n const maxHeight = bboxes.reduce((maxHeight, bbox) => {\n return bbox.height < maxHeight ? bbox.height : maxHeight;\n }, Infinity);\n this.setEventData(e, {\n bbox,\n cells: this.graph.model.getSubGraph(cells),\n minWidth: (gridSize * bbox.width) / maxWidth,\n minHeight: (gridSize * bbox.height) / maxHeight,\n });\n }\n doResize({ e, dx, dy }) {\n const data = this.eventData(e);\n const bbox = data.bbox;\n const width = bbox.width;\n const height = bbox.height;\n const newWidth = Math.max(width + dx, data.minWidth);\n const newHeight = Math.max(height + dy, data.minHeight);\n if (!data.resized) {\n data.resized = true;\n }\n if (Math.abs(width - newWidth) > 0.001 ||\n Math.abs(height - newHeight) > 0.001) {\n this.graph.model.resizeCells(newWidth, newHeight, data.cells, {\n selection: this.cid,\n });\n bbox.width = newWidth;\n bbox.height = newHeight;\n this.updateSelectionBoxes();\n }\n }\n stopResize({ e }) {\n const data = this.eventData(e);\n if (data.resized) {\n data.resized = false;\n this.collection.toArray().forEach((node) => {\n notify('node:resized', e, this.graph.findViewByCell(node));\n });\n }\n }\n // #endregion\n dispose() {\n this.clean();\n this.remove();\n }\n}\n__decorate([\n View.dispose()\n], Selection.prototype, \"dispose\", null);\nObjectExt.applyMixins(Selection, Handle);\n// private\n// -------\nvar Private;\n(function (Private) {\n const base = 'widget-selection';\n Private.classNames = {\n root: base,\n inner: `${base}-inner`,\n box: `${base}-box`,\n content: `${base}-content`,\n rubberband: `${base}-rubberband`,\n selected: `${base}-selected`,\n };\n Private.documentEvents = {\n mousemove: 'adjustSelection',\n touchmove: 'adjustSelection',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n touchcancel: 'onMouseUp',\n };\n Private.defaultOptions = {\n movable: true,\n following: true,\n strict: false,\n useCellGeometry: false,\n content(selection) {\n return StringExt.template('<%= length %> node<%= length > 1 ? \"s\":\"\" %> selected.')({ length: selection.length });\n },\n handles: [\n {\n name: 'remove',\n position: 'nw',\n events: {\n mousedown: 'deleteSelectedCells',\n },\n },\n {\n name: 'rotate',\n position: 'sw',\n events: {\n mousedown: 'startRotate',\n mousemove: 'doRotate',\n mouseup: 'stopRotate',\n },\n },\n {\n name: 'resize',\n position: 'se',\n events: {\n mousedown: 'startResize',\n mousemove: 'doResize',\n mouseup: 'stopResize',\n },\n },\n ],\n };\n function depthComparator(cell) {\n return cell.getAncestors().length;\n }\n Private.depthComparator = depthComparator;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","import { Util } from '../../global';\nimport { NumberExt } from '../../util';\nimport { Angle, Point } from '../../geometry';\nimport { Widget } from '../common';\nimport { notify } from './util';\nexport class Transform extends Widget {\n get node() {\n return this.cell;\n }\n get containerClassName() {\n return this.prefixClassName('widget-transform');\n }\n get resizeClassName() {\n return `${this.containerClassName}-resize`;\n }\n get rotateClassName() {\n return `${this.containerClassName}-rotate`;\n }\n init(options) {\n this.options = Object.assign(Object.assign({}, Private.defaultOptions), options);\n this.render();\n this.startListening();\n }\n startListening() {\n this.delegateEvents({\n [`mousedown .${this.resizeClassName}`]: 'startResizing',\n [`touchstart .${this.resizeClassName}`]: 'startResizing',\n [`mousedown .${this.rotateClassName}`]: 'startRotating',\n [`touchstart .${this.rotateClassName}`]: 'startRotating',\n });\n this.model.on('*', this.update, this);\n this.graph.on('scale', this.update, this);\n this.graph.on('translate', this.update, this);\n this.node.on('removed', this.remove, this);\n this.model.on('reseted', this.remove, this);\n this.view.on('cell:knob:mousedown', this.onKnobMouseDown, this);\n this.view.on('cell:knob:mouseup', this.onKnobMouseUp, this);\n super.startListening();\n }\n stopListening() {\n this.undelegateEvents();\n this.model.off('*', this.update, this);\n this.graph.off('scale', this.update, this);\n this.graph.off('translate', this.update, this);\n this.node.off('removed', this.remove, this);\n this.model.off('reseted', this.remove, this);\n this.view.off('cell:knob:mousedown', this.onKnobMouseDown, this);\n this.view.off('cell:knob:mouseup', this.onKnobMouseUp, this);\n super.stopListening();\n }\n renderHandles() {\n this.container = document.createElement('div');\n this.$container = this.$(this.container);\n const $knob = this.$('<div/>').prop('draggable', false);\n const $rotate = $knob.clone().addClass(this.rotateClassName);\n const $resizes = Private.POSITIONS.map((pos) => {\n return $knob\n .clone()\n .addClass(this.resizeClassName)\n .attr('data-position', pos);\n });\n this.empty();\n this.$container.append($resizes, $rotate);\n }\n render() {\n this.renderHandles();\n this.view.addClass(Private.NODE_CLS);\n this.$container\n .addClass(this.containerClassName)\n .toggleClass('no-orth-resize', this.options.preserveAspectRatio || !this.options.orthogonalResizing)\n .toggleClass('no-resize', !this.options.resizable)\n .toggleClass('no-rotate', !this.options.rotatable);\n if (this.options.className) {\n this.$container.addClass(this.options.className);\n }\n this.graph.container.appendChild(this.container);\n return this.update();\n }\n update() {\n const ctm = this.graph.matrix();\n const bbox = this.node.getBBox();\n bbox.x *= ctm.a;\n bbox.x += ctm.e;\n bbox.y *= ctm.d;\n bbox.y += ctm.f;\n bbox.width *= ctm.a;\n bbox.height *= ctm.d;\n const angle = Angle.normalize(this.node.getAngle());\n const transform = angle !== 0 ? `rotate(${angle}deg)` : '';\n this.$container.css({\n transform,\n width: bbox.width,\n height: bbox.height,\n left: bbox.x,\n top: bbox.y,\n });\n this.updateResizerDirections();\n return this;\n }\n remove() {\n this.view.removeClass(Private.NODE_CLS);\n return super.remove();\n }\n onKnobMouseDown() {\n this.startHandle();\n }\n onKnobMouseUp() {\n this.stopHandle();\n }\n updateResizerDirections() {\n // Update the directions on the resizer divs while the node being rotated.\n // The directions are represented by cardinal points (N,S,E,W). For example\n // the div originally pointed to north needs to be changed to point to south\n // if the node was rotated by 180 degrees.\n const angle = Angle.normalize(this.node.getAngle());\n const shift = Math.floor(angle * (Private.DIRECTIONS.length / 360));\n if (shift !== this.prevShift) {\n // Create the current directions array based on the calculated shift.\n const directions = Private.DIRECTIONS.slice(shift).concat(Private.DIRECTIONS.slice(0, shift));\n const className = (dir) => `${this.containerClassName}-cursor-${dir}`;\n this.$container\n .find(`.${this.resizeClassName}`)\n .removeClass(Private.DIRECTIONS.map((dir) => className(dir)).join(' '))\n .each((index, elem) => {\n this.$(elem).addClass(className(directions[index]));\n });\n this.prevShift = shift;\n }\n }\n getTrueDirection(dir) {\n const angle = Angle.normalize(this.node.getAngle());\n let index = Private.POSITIONS.indexOf(dir);\n index += Math.floor(angle * (Private.POSITIONS.length / 360));\n index %= Private.POSITIONS.length;\n return Private.POSITIONS[index];\n }\n toValidResizeDirection(dir) {\n return ({\n top: 'top-left',\n bottom: 'bottom-right',\n left: 'bottom-left',\n right: 'top-right',\n }[dir] || dir);\n }\n startResizing(evt) {\n evt.stopPropagation();\n this.model.startBatch('resize', { cid: this.cid });\n const dir = this.$(evt.target).attr('data-position');\n const view = this.graph.findViewByCell(this.node);\n this.prepareResizing(evt, dir);\n this.startAction(evt);\n notify('node:resize:mousedown', evt, view);\n }\n prepareResizing(evt, relativeDirection) {\n const trueDirection = this.getTrueDirection(relativeDirection);\n let rx = 0;\n let ry = 0;\n relativeDirection.split('-').forEach((direction) => {\n rx = { left: -1, right: 1 }[direction] || rx;\n ry = { top: -1, bottom: 1 }[direction] || ry;\n });\n const direction = this.toValidResizeDirection(relativeDirection);\n const selector = {\n 'top-right': 'bottomLeft',\n 'top-left': 'bottomRight',\n 'bottom-left': 'topRight',\n 'bottom-right': 'topLeft',\n }[direction];\n const angle = Angle.normalize(this.node.getAngle());\n this.setEventData(evt, {\n selector,\n direction,\n trueDirection,\n relativeDirection,\n angle,\n resizeX: rx,\n resizeY: ry,\n action: 'resizing',\n });\n }\n startRotating(evt) {\n evt.stopPropagation();\n this.model.startBatch('rotate', { cid: this.cid });\n const view = this.graph.findViewByCell(this.node);\n const center = this.node.getBBox().getCenter();\n const e = this.normalizeEvent(evt);\n const client = this.graph.snapToGrid(e.clientX, e.clientY);\n this.setEventData(evt, {\n center,\n action: 'rotating',\n angle: Angle.normalize(this.node.getAngle()),\n start: Point.create(client).theta(center),\n });\n this.startAction(evt);\n notify('node:rotate:mousedown', evt, view);\n }\n onMouseMove(evt) {\n const view = this.graph.findViewByCell(this.node);\n let data = this.getEventData(evt);\n if (data.action) {\n const e = this.normalizeEvent(evt);\n let clientX = e.clientX;\n let clientY = e.clientY;\n const scroller = this.graph.scroller.widget;\n const restrict = this.options.restrictedResizing;\n if (restrict === true || typeof restrict === 'number') {\n const factor = restrict === true ? 0 : restrict;\n const fix = scroller ? Math.max(factor, 8) : factor;\n const rect = this.graph.container.getBoundingClientRect();\n clientX = NumberExt.clamp(clientX, rect.left + fix, rect.right - fix);\n clientY = NumberExt.clamp(clientY, rect.top + fix, rect.bottom - fix);\n }\n else if (this.options.autoScrollOnResizing && scroller) {\n scroller.autoScroll(clientX, clientY);\n }\n const pos = this.graph.snapToGrid(clientX, clientY);\n const gridSize = this.graph.getGridSize();\n const node = this.node;\n const options = this.options;\n if (data.action === 'resizing') {\n data = data;\n if (!data.resized) {\n if (view) {\n view.addClass('node-resizing');\n notify('node:resize', evt, view);\n }\n data.resized = true;\n }\n const currentBBox = node.getBBox();\n const requestedSize = Point.create(pos)\n .rotate(data.angle, currentBBox.getCenter())\n .diff(currentBBox[data.selector]);\n let width = data.resizeX\n ? requestedSize.x * data.resizeX\n : currentBBox.width;\n let height = data.resizeY\n ? requestedSize.y * data.resizeY\n : currentBBox.height;\n const rawWidth = width;\n const rawHeight = height;\n width = Util.snapToGrid(width, gridSize);\n height = Util.snapToGrid(height, gridSize);\n width = Math.max(width, options.minWidth || gridSize);\n height = Math.max(height, options.minHeight || gridSize);\n width = Math.min(width, options.maxWidth || Infinity);\n height = Math.min(height, options.maxHeight || Infinity);\n if (options.preserveAspectRatio) {\n const candidateWidth = (currentBBox.width * height) / currentBBox.height;\n const candidateHeight = (currentBBox.height * width) / currentBBox.width;\n if (width < candidateWidth) {\n height = candidateHeight;\n }\n else {\n width = candidateWidth;\n }\n }\n const relativeDirection = data.relativeDirection;\n if (options.allowReverse &&\n (rawWidth <= -width || rawHeight <= -height)) {\n let reverted;\n if (relativeDirection === 'left') {\n if (rawWidth <= -width) {\n reverted = 'right';\n }\n }\n else if (relativeDirection === 'right') {\n if (rawWidth <= -width) {\n reverted = 'left';\n }\n }\n else if (relativeDirection === 'top') {\n if (rawHeight <= -height) {\n reverted = 'bottom';\n }\n }\n else if (relativeDirection === 'bottom') {\n if (rawHeight <= -height) {\n reverted = 'top';\n }\n }\n else if (relativeDirection === 'top-left') {\n if (rawWidth <= -width && rawHeight <= -height) {\n reverted = 'bottom-right';\n }\n else if (rawWidth <= -width) {\n reverted = 'top-right';\n }\n else if (rawHeight <= -height) {\n reverted = 'bottom-left';\n }\n }\n else if (relativeDirection === 'top-right') {\n if (rawWidth <= -width && rawHeight <= -height) {\n reverted = 'bottom-left';\n }\n else if (rawWidth <= -width) {\n reverted = 'top-left';\n }\n else if (rawHeight <= -height) {\n reverted = 'bottom-right';\n }\n }\n else if (relativeDirection === 'bottom-left') {\n if (rawWidth <= -width && rawHeight <= -height) {\n reverted = 'top-right';\n }\n else if (rawWidth <= -width) {\n reverted = 'bottom-right';\n }\n else if (rawHeight <= -height) {\n reverted = 'top-left';\n }\n }\n else if (relativeDirection === 'bottom-right') {\n if (rawWidth <= -width && rawHeight <= -height) {\n reverted = 'top-left';\n }\n else if (rawWidth <= -width) {\n reverted = 'bottom-left';\n }\n else if (rawHeight <= -height) {\n reverted = 'top-right';\n }\n }\n const revertedDir = reverted;\n this.stopHandle();\n const $handle = this.$container.find(`.${this.resizeClassName}[data-position=\"${revertedDir}\"]`);\n this.startHandle($handle[0]);\n this.prepareResizing(evt, revertedDir);\n this.onMouseMove(evt);\n }\n if (currentBBox.width !== width || currentBBox.height !== height) {\n const resizeOptions = {\n ui: true,\n direction: data.direction,\n relativeDirection: data.relativeDirection,\n trueDirection: data.trueDirection,\n minWidth: options.minWidth,\n minHeight: options.minHeight,\n maxWidth: options.maxWidth,\n maxHeight: options.maxHeight,\n preserveAspectRatio: options.preserveAspectRatio === true,\n };\n node.resize(width, height, resizeOptions);\n notify('node:resizing', evt, view);\n }\n notify('node:resize:mousemove', evt, view);\n }\n else if (data.action === 'rotating') {\n data = data;\n if (!data.rotated) {\n if (view) {\n view.addClass('node-rotating');\n notify('node:rotate', evt, view);\n }\n data.rotated = true;\n }\n const currentAngle = node.getAngle();\n const theta = data.start - Point.create(pos).theta(data.center);\n let target = data.angle + theta;\n if (options.rotateGrid) {\n target = Util.snapToGrid(target, options.rotateGrid);\n }\n if (currentAngle !== target) {\n node.rotate(target, { absolute: true });\n notify('node:rotating', evt, view);\n }\n notify('node:rotate:mousemove', evt, view);\n }\n }\n }\n onMouseUp(evt) {\n const view = this.graph.findViewByCell(this.node);\n const data = this.getEventData(evt);\n if (data.action) {\n this.stopAction(evt);\n this.model.stopBatch(data.action === 'resizing' ? 'resize' : 'rotate', {\n cid: this.cid,\n });\n if (data.action === 'resizing') {\n notify('node:resize:mouseup', evt, view);\n }\n else if (data.action === 'rotating') {\n notify('node:rotate:mouseup', evt, view);\n }\n }\n }\n startHandle(handle) {\n this.handle = handle || null;\n this.$container.addClass(`${this.containerClassName}-active`);\n if (handle) {\n this.$(handle).addClass(`${this.containerClassName}-active-handle`);\n const pos = handle.getAttribute('data-position');\n if (pos) {\n const dir = Private.DIRECTIONS[Private.POSITIONS.indexOf(pos)];\n this.$container.addClass(`${this.containerClassName}-cursor-${dir}`);\n }\n }\n }\n stopHandle() {\n this.$container.removeClass(`${this.containerClassName}-active`);\n if (this.handle) {\n this.$(this.handle).removeClass(`${this.containerClassName}-active-handle`);\n const pos = this.handle.getAttribute('data-position');\n if (pos) {\n const dir = Private.DIRECTIONS[Private.POSITIONS.indexOf(pos)];\n this.$container.removeClass(`${this.containerClassName}-cursor-${dir}`);\n }\n this.handle = null;\n }\n }\n startAction(evt) {\n this.startHandle(evt.target);\n this.graph.view.undelegateEvents();\n this.delegateDocumentEvents(Private.documentEvents, evt.data);\n }\n stopAction(evt) {\n this.stopHandle();\n this.undelegateDocumentEvents();\n this.graph.view.delegateEvents();\n const view = this.graph.findViewByCell(this.node);\n const data = this.getEventData(evt);\n if (view) {\n view.removeClass(`node-${data.action}`);\n if (data.action === 'resizing' && data.resized) {\n notify('node:resized', evt, view);\n }\n else if (data.action === 'rotating' && data.rotated) {\n notify('node:rotated', evt, view);\n }\n }\n }\n}\nvar Private;\n(function (Private) {\n Private.NODE_CLS = 'has-widget-transform';\n Private.DIRECTIONS = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n Private.POSITIONS = [\n 'top-left',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n ];\n Private.documentEvents = {\n mousemove: 'onMouseMove',\n touchmove: 'onMouseMove',\n mouseup: 'onMouseUp',\n touchend: 'onMouseUp',\n };\n Private.defaultOptions = {\n minWidth: 0,\n minHeight: 0,\n maxWidth: Infinity,\n maxHeight: Infinity,\n rotateGrid: 15,\n rotatable: true,\n preserveAspectRatio: false,\n orthogonalResizing: true,\n restrictedResizing: false,\n autoScrollOnResizing: true,\n allowReverse: true,\n };\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Util } from '../global';\nimport { ObjectExt } from '../util';\nimport { Edge as StandardEdge } from '../shape/standard/edge';\nexport var Options;\n(function (Options) {\n function parseOptionGroup(graph, arg, options) {\n const result = {};\n Object.keys(options || {}).forEach((key) => {\n const val = options[key];\n result[key] = typeof val === 'function' ? val.call(graph, arg) : val;\n });\n return result;\n }\n Options.parseOptionGroup = parseOptionGroup;\n})(Options || (Options = {}));\n(function (Options) {\n function get(options) {\n const { grid, panning, selecting, embedding, snapline, resizing, rotating, knob, clipboard, history, scroller, minimap, keyboard, mousewheel } = options, others = __rest(options\n // size\n // ----\n , [\"grid\", \"panning\", \"selecting\", \"embedding\", \"snapline\", \"resizing\", \"rotating\", \"knob\", \"clipboard\", \"history\", \"scroller\", \"minimap\", \"keyboard\", \"mousewheel\"]);\n // size\n // ----\n const container = options.container;\n if (container != null) {\n if (others.width == null) {\n others.width = container.clientWidth;\n }\n if (others.height == null) {\n others.height = container.clientHeight;\n }\n }\n else {\n throw new Error(`Ensure the container of the graph is specified and valid`);\n }\n const result = ObjectExt.merge({}, Options.defaults, others);\n // grid\n // ----\n const defaultGrid = { size: 10, visible: false };\n if (typeof grid === 'number') {\n result.grid = { size: grid, visible: false };\n }\n else if (typeof grid === 'boolean') {\n result.grid = Object.assign(Object.assign({}, defaultGrid), { visible: grid });\n }\n else {\n result.grid = Object.assign(Object.assign({}, defaultGrid), grid);\n }\n // booleas\n // -------\n const booleas = [\n 'panning',\n 'selecting',\n 'embedding',\n 'snapline',\n 'resizing',\n 'rotating',\n 'knob',\n 'clipboard',\n 'history',\n 'scroller',\n 'minimap',\n 'keyboard',\n 'mousewheel',\n ];\n booleas.forEach((key) => {\n const val = options[key];\n if (typeof val === 'boolean') {\n result[key].enabled = val;\n }\n else {\n result[key] = Object.assign(Object.assign({}, result[key]), val);\n }\n });\n // background\n // ----------\n if (result.background &&\n result.scroller.enabled &&\n result.scroller.background == null) {\n result.scroller.background = result.background;\n delete result.background;\n }\n return result;\n }\n Options.get = get;\n})(Options || (Options = {}));\n(function (Options) {\n Options.defaults = {\n x: 0,\n y: 0,\n grid: {\n size: 10,\n visible: false,\n },\n scaling: {\n min: 0.01,\n max: 16,\n },\n background: false,\n highlighting: {\n default: {\n name: 'stroke',\n args: {\n padding: 3,\n },\n },\n nodeAvailable: {\n name: 'className',\n args: {\n className: Util.prefix('available-node'),\n },\n },\n magnetAvailable: {\n name: 'className',\n args: {\n className: Util.prefix('available-magnet'),\n },\n },\n },\n connecting: {\n snap: false,\n multi: true,\n // TODO: Unannotation the next line when the `multi` option was removed in the next major version.\n // allowMulti: true,\n dangling: true,\n // TODO: Unannotation the next line when the `dangling` option was removed in the next major version.\n // allowBlank: true,\n allowLoop: true,\n allowNode: true,\n allowEdge: false,\n allowPort: true,\n highlight: false,\n anchor: 'center',\n edgeAnchor: 'ratio',\n connectionPoint: 'boundary',\n strategy: null,\n router: 'normal',\n connector: 'normal',\n validateConnection({ type, sourceView, targetView }) {\n const view = type === 'target' ? targetView : sourceView;\n return view != null;\n },\n createEdge() {\n return new StandardEdge();\n },\n },\n transforming: {\n clearAll: true,\n clearOnBlankMouseDown: true,\n },\n resizing: {\n enabled: false,\n minWidth: 0,\n minHeight: 0,\n maxWidth: Number.MAX_SAFE_INTEGER,\n maxHeight: Number.MAX_SAFE_INTEGER,\n orthogonal: true,\n restricted: false,\n autoScroll: true,\n preserveAspectRatio: false,\n allowReverse: true,\n },\n rotating: {\n enabled: false,\n grid: 15,\n },\n translating: {\n restrict: false,\n },\n knob: {\n enabled: false,\n clearAll: true,\n clearOnBlankMouseDown: true,\n },\n embedding: {\n enabled: false,\n findParent: 'bbox',\n frontOnly: true,\n validate: () => true,\n },\n selecting: {\n enabled: false,\n rubberband: false,\n rubberNode: true,\n rubberEdge: false,\n pointerEvents: 'auto',\n multiple: true,\n movable: true,\n strict: false,\n useCellGeometry: false,\n selectCellOnMoved: false,\n selectNodeOnMoved: false,\n selectEdgeOnMoved: false,\n content: null,\n handles: null,\n },\n panning: {\n enabled: false,\n eventTypes: ['leftMouseDown'],\n },\n snapline: {\n enabled: false,\n },\n clipboard: {\n enabled: false,\n },\n history: {\n enabled: false,\n },\n scroller: {\n enabled: false,\n },\n keyboard: {\n enabled: false,\n },\n mousewheel: {\n enabled: false,\n factor: 1.2,\n zoomAtMousePosition: true,\n },\n async: false,\n frozen: false,\n sorting: 'exact',\n moveThreshold: 0,\n clickThreshold: 0,\n magnetThreshold: 0,\n preventDefaultDblClick: true,\n preventDefaultMouseDown: false,\n preventDefaultContextMenu: true,\n preventDefaultBlankAction: true,\n interacting: {\n edgeLabelMovable: false,\n },\n guard: () => false,\n };\n})(Options || (Options = {}));\n//# sourceMappingURL=options.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { StringExt, Dom, Vector } from '../util';\nimport { Filter } from '../registry';\nimport { Markup } from '../view';\nimport { Base } from './base';\nexport class DefsManager extends Base {\n get cid() {\n return this.graph.view.cid;\n }\n get svg() {\n return this.view.svg;\n }\n get defs() {\n return this.view.defs;\n }\n isDefined(id) {\n return this.svg.getElementById(id) != null;\n }\n filter(options) {\n let filterId = options.id;\n const name = options.name;\n if (!filterId) {\n filterId = `filter-${name}-${this.cid}-${StringExt.hashcode(JSON.stringify(options))}`;\n }\n if (!this.isDefined(filterId)) {\n const fn = Filter.registry.get(name);\n if (fn == null) {\n return Filter.registry.onNotFound(name);\n }\n const markup = fn(options.args || {});\n // Set the filter area to be 3x the bounding box of the cell\n // and center the filter around the cell.\n const attrs = Object.assign(Object.assign({ x: -1, y: -1, width: 3, height: 3, filterUnits: 'objectBoundingBox' }, options.attrs), { id: filterId });\n Vector.create(Markup.sanitize(markup), attrs).appendTo(this.defs);\n }\n return filterId;\n }\n gradient(options) {\n let id = options.id;\n const type = options.type;\n if (!id) {\n id = `gradient-${type}-${this.cid}-${StringExt.hashcode(JSON.stringify(options))}`;\n }\n if (!this.isDefined(id)) {\n const stops = options.stops;\n const arr = stops.map((stop) => {\n const opacity = stop.opacity != null && Number.isFinite(stop.opacity)\n ? stop.opacity\n : 1;\n return `<stop offset=\"${stop.offset}\" stop-color=\"${stop.color}\" stop-opacity=\"${opacity}\"/>`;\n });\n const markup = `<${type}>${arr.join('')}</${type}>`;\n const attrs = Object.assign({ id }, options.attrs);\n Vector.create(markup, attrs).appendTo(this.defs);\n }\n return id;\n }\n marker(options) {\n const { id, refX, refY, markerUnits, markerOrient, tagName, children } = options, attrs = __rest(options, [\"id\", \"refX\", \"refY\", \"markerUnits\", \"markerOrient\", \"tagName\", \"children\"]);\n let markerId = id;\n if (!markerId) {\n markerId = `marker-${this.cid}-${StringExt.hashcode(JSON.stringify(options))}`;\n }\n if (!this.isDefined(markerId)) {\n if (tagName !== 'path') {\n // remove unnecessary d attribute inherit from standard edge.\n delete attrs.d;\n }\n const pathMarker = Vector.create('marker', {\n refX,\n refY,\n id: markerId,\n overflow: 'visible',\n orient: markerOrient != null ? markerOrient : 'auto',\n markerUnits: markerUnits || 'userSpaceOnUse',\n }, children\n ? children.map((_a) => {\n var { tagName } = _a, other = __rest(_a, [\"tagName\"]);\n return Vector.create(`${tagName}` || 'path', Dom.kebablizeAttrs(Object.assign(Object.assign({}, attrs), other)));\n })\n : [Vector.create(tagName || 'path', Dom.kebablizeAttrs(attrs))]);\n this.defs.appendChild(pathMarker.node);\n }\n return markerId;\n }\n remove(id) {\n const elem = this.svg.getElementById(id);\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n }\n}\n//# sourceMappingURL=defs.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport * as Registry from '../registry';\nimport { Dom, Vector } from '../util';\nimport { Base } from './base';\nexport class GridManager extends Base {\n get elem() {\n return this.view.grid;\n }\n get grid() {\n return this.options.grid;\n }\n init() {\n this.startListening();\n this.draw(this.grid);\n }\n startListening() {\n this.graph.on('scale', this.update, this);\n this.graph.on('translate', this.update, this);\n }\n stopListening() {\n this.graph.off('scale', this.update, this);\n this.graph.off('translate', this.update, this);\n }\n setVisible(visible) {\n if (this.grid.visible !== visible) {\n this.grid.visible = visible;\n this.update();\n }\n }\n getGridSize() {\n return this.grid.size;\n }\n setGridSize(size) {\n this.grid.size = Math.max(size, 1);\n this.update();\n }\n show() {\n this.setVisible(true);\n this.update();\n }\n hide() {\n this.setVisible(false);\n this.update();\n }\n clear() {\n this.elem.style.backgroundImage = '';\n }\n draw(options) {\n this.clear();\n this.instance = null;\n Object.assign(this.grid, options);\n this.patterns = this.resolveGrid(options);\n this.update();\n }\n update(options = {}) {\n const gridSize = this.grid.size;\n if (gridSize <= 1 || !this.grid.visible) {\n return this.clear();\n }\n const ctm = this.graph.matrix();\n const grid = this.getInstance();\n const items = Array.isArray(options) ? options : [options];\n this.patterns.forEach((settings, index) => {\n const id = `pattern_${index}`;\n const sx = ctm.a || 1;\n const sy = ctm.d || 1;\n const { update, markup } = settings, others = __rest(settings, [\"update\", \"markup\"]);\n const options = Object.assign(Object.assign(Object.assign({}, others), items[index]), { sx,\n sy, ox: ctm.e || 0, oy: ctm.f || 0, width: gridSize * sx, height: gridSize * sy });\n if (!grid.has(id)) {\n grid.add(id, Vector.create('pattern', { id, patternUnits: 'userSpaceOnUse' }, Vector.createVectors(markup)).node);\n }\n const patternElem = grid.get(id);\n if (typeof update === 'function') {\n update(patternElem.childNodes[0], options);\n }\n let x = options.ox % options.width;\n if (x < 0) {\n x += options.width;\n }\n let y = options.oy % options.height;\n if (y < 0) {\n y += options.height;\n }\n Dom.attr(patternElem, {\n x,\n y,\n width: options.width,\n height: options.height,\n });\n });\n const base64 = new XMLSerializer().serializeToString(grid.root);\n const url = `url(data:image/svg+xml;base64,${btoa(base64)})`;\n this.elem.style.backgroundImage = url;\n }\n getInstance() {\n if (!this.instance) {\n this.instance = new Registry.Grid();\n }\n return this.instance;\n }\n resolveGrid(options) {\n if (!options) {\n return [];\n }\n const type = options.type;\n if (type == null) {\n return [\n Object.assign(Object.assign({}, Registry.Grid.presets.dot), options.args),\n ];\n }\n const items = Registry.Grid.registry.get(type);\n if (items) {\n let args = options.args || [];\n if (!Array.isArray(args)) {\n args = [args];\n }\n return Array.isArray(items)\n ? items.map((item, index) => (Object.assign(Object.assign({}, item), args[index])))\n : [Object.assign(Object.assign({}, items), args[0])];\n }\n return Registry.Grid.registry.onNotFound(type);\n }\n dispose() {\n this.stopListening();\n this.clear();\n }\n}\n__decorate([\n Base.dispose()\n], GridManager.prototype, \"dispose\", null);\n//# sourceMappingURL=grid.js.map","import { Base } from './base';\nimport { Dom } from '../util';\nimport { Point, Rectangle } from '../geometry';\nexport class CoordManager extends Base {\n getClientMatrix() {\n return Dom.createSVGMatrix(this.view.stage.getScreenCTM());\n }\n /**\n * Returns coordinates of the graph viewport, relative to the window.\n */\n getClientOffset() {\n // see: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect\n const rect = this.view.svg.getBoundingClientRect();\n return new Point(rect.left, rect.top);\n }\n /**\n * Returns coordinates of the graph viewport, relative to the document.\n */\n getPageOffset() {\n // see: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect\n return this.getClientOffset().translate(window.scrollX, window.scrollY);\n }\n snapToGrid(x, y) {\n const p = typeof x === 'number'\n ? this.clientToLocalPoint(x, y)\n : this.clientToLocalPoint(x.x, x.y);\n return p.snapToGrid(this.graph.getGridSize());\n }\n localToGraphPoint(x, y) {\n const localPoint = Point.create(x, y);\n return Dom.transformPoint(localPoint, this.graph.matrix());\n }\n localToClientPoint(x, y) {\n const localPoint = Point.create(x, y);\n return Dom.transformPoint(localPoint, this.getClientMatrix());\n }\n localToPagePoint(x, y) {\n const p = typeof x === 'number'\n ? this.localToGraphPoint(x, y)\n : this.localToGraphPoint(x);\n return p.translate(this.getPageOffset());\n }\n localToGraphRect(x, y, width, height) {\n const localRect = Rectangle.create(x, y, width, height);\n return Dom.transformRectangle(localRect, this.graph.matrix());\n }\n localToClientRect(x, y, width, height) {\n const localRect = Rectangle.create(x, y, width, height);\n return Dom.transformRectangle(localRect, this.getClientMatrix());\n }\n localToPageRect(x, y, width, height) {\n const rect = typeof x === 'number'\n ? this.localToGraphRect(x, y, width, height)\n : this.localToGraphRect(x);\n return rect.translate(this.getPageOffset());\n }\n graphToLocalPoint(x, y) {\n const graphPoint = Point.create(x, y);\n return Dom.transformPoint(graphPoint, this.graph.matrix().inverse());\n }\n clientToLocalPoint(x, y) {\n const clientPoint = Point.create(x, y);\n return Dom.transformPoint(clientPoint, this.getClientMatrix().inverse());\n }\n clientToGraphPoint(x, y) {\n const clientPoint = Point.create(x, y);\n return Dom.transformPoint(clientPoint, this.graph.matrix().multiply(this.getClientMatrix().inverse()));\n }\n pageToLocalPoint(x, y) {\n const pagePoint = Point.create(x, y);\n const graphPoint = pagePoint.diff(this.getPageOffset());\n return this.graphToLocalPoint(graphPoint);\n }\n graphToLocalRect(x, y, width, height) {\n const graphRect = Rectangle.create(x, y, width, height);\n return Dom.transformRectangle(graphRect, this.graph.matrix().inverse());\n }\n clientToLocalRect(x, y, width, height) {\n const clientRect = Rectangle.create(x, y, width, height);\n return Dom.transformRectangle(clientRect, this.getClientMatrix().inverse());\n }\n clientToGraphRect(x, y, width, height) {\n const clientRect = Rectangle.create(x, y, width, height);\n return Dom.transformRectangle(clientRect, this.graph.matrix().multiply(this.getClientMatrix().inverse()));\n }\n pageToLocalRect(x, y, width, height) {\n const graphRect = Rectangle.create(x, y, width, height);\n const pageOffset = this.getPageOffset();\n graphRect.x -= pageOffset.x;\n graphRect.y -= pageOffset.y;\n return this.graphToLocalRect(graphRect);\n }\n}\n//# sourceMappingURL=coord.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Base } from './base';\nexport class SnaplineManager extends Base {\n constructor() {\n super(...arguments);\n this.widget = this.graph.hook.createSnapline();\n }\n dispose() {\n this.widget.dispose();\n }\n}\n__decorate([\n Base.dispose()\n], SnaplineManager.prototype, \"dispose\", null);\n//# sourceMappingURL=snapline.js.map","// eslint-disable-next-line\nexport var ModifierKey;\n(function (ModifierKey) {\n function parse(modifiers) {\n const or = [];\n const and = [];\n if (Array.isArray(modifiers)) {\n or.push(...modifiers);\n }\n else {\n modifiers.split('|').forEach((item) => {\n if (item.indexOf('&') === -1) {\n or.push(item);\n }\n else {\n and.push(...item.split('&'));\n }\n });\n }\n return { or, and };\n }\n ModifierKey.parse = parse;\n function equals(modifiers1, modifiers2) {\n if (modifiers1 != null && modifiers2 != null) {\n const m1 = parse(modifiers1);\n const m2 = parse(modifiers2);\n const or1 = m1.or.sort();\n const or2 = m2.or.sort();\n const and1 = m1.and.sort();\n const and2 = m2.and.sort();\n const equal = (a1, a2) => {\n return (a1.length === a2.length &&\n (a1.length === 0 || a1.every((a, i) => a === a2[i])));\n };\n return equal(or1, or2) && equal(and1, and2);\n }\n if (modifiers1 == null && modifiers2 == null) {\n return true;\n }\n return false;\n }\n ModifierKey.equals = equals;\n function isMatch(e, modifiers, strict) {\n if (modifiers == null ||\n (Array.isArray(modifiers) && modifiers.length === 0)) {\n return strict\n ? e.altKey !== true &&\n e.ctrlKey !== true &&\n e.metaKey !== true &&\n e.shiftKey !== true\n : true;\n }\n const { or, and } = parse(modifiers);\n const match = (key) => {\n const name = `${key.toLowerCase()}Key`;\n return e[name] === true;\n };\n return or.some((key) => match(key)) && and.every((key) => match(key));\n }\n ModifierKey.isMatch = isMatch;\n})(ModifierKey || (ModifierKey = {}));\n//# sourceMappingURL=modifier.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Dom } from '../util';\nimport { ModifierKey } from '../types';\nimport { Base } from './base';\nexport class ScrollerManager extends Base {\n get widgetOptions() {\n return this.options.scroller;\n }\n get pannable() {\n if (this.widgetOptions) {\n if (typeof this.widgetOptions.pannable === 'object') {\n return this.widgetOptions.pannable.enabled;\n }\n return !!this.widgetOptions.pannable;\n }\n return false;\n }\n init() {\n this.widget = this.graph.hook.createScroller();\n this.startListening();\n this.updateClassName();\n if (this.widget) {\n this.widget.center();\n }\n }\n startListening() {\n let eventTypes = [];\n const pannable = this.widgetOptions.pannable;\n if (typeof pannable === 'object') {\n eventTypes = pannable.eventTypes || [];\n }\n else {\n eventTypes = ['leftMouseDown'];\n }\n if (eventTypes.includes('leftMouseDown')) {\n this.graph.on('blank:mousedown', this.preparePanning, this);\n this.graph.on('node:unhandled:mousedown', this.preparePanning, this);\n this.graph.on('edge:unhandled:mousedown', this.preparePanning, this);\n }\n if (eventTypes.includes('rightMouseDown')) {\n this.onRightMouseDown = this.onRightMouseDown.bind(this);\n this.view.$(this.widget.container).on('mousedown', this.onRightMouseDown);\n }\n }\n stopListening() {\n let eventTypes = [];\n const pannable = this.widgetOptions.pannable;\n if (typeof pannable === 'object') {\n eventTypes = pannable.eventTypes || [];\n }\n else {\n eventTypes = ['leftMouseDown'];\n }\n if (eventTypes.includes('leftMouseDown')) {\n this.graph.off('blank:mousedown', this.preparePanning, this);\n this.graph.off('node:unhandled:mousedown', this.preparePanning, this);\n this.graph.off('edge:unhandled:mousedown', this.preparePanning, this);\n }\n if (eventTypes.includes('rightMouseDown')) {\n this.view\n .$(this.widget.container)\n .off('mousedown', this.onRightMouseDown);\n }\n }\n onRightMouseDown(e) {\n if (e.button === 2 && this.allowPanning(e, true) && this.widget) {\n this.updateClassName(true);\n this.widget.startPanning(e);\n this.widget.once('pan:stop', () => this.updateClassName(false));\n }\n }\n preparePanning({ e }) {\n if (this.widget) {\n if (this.allowPanning(e, true) ||\n (this.allowPanning(e) && !this.graph.selection.allowRubberband(e, true))) {\n this.updateClassName(true);\n this.widget.startPanning(e);\n this.widget.once('pan:stop', () => this.updateClassName(false));\n }\n }\n }\n allowPanning(e, strict) {\n return (this.widget &&\n this.pannable &&\n ModifierKey.isMatch(e, this.widgetOptions.modifiers, strict) &&\n this.graph.hook.allowPanning(e));\n }\n updateClassName(isPanning) {\n if (this.widget == null) {\n return;\n }\n const container = this.widget.container;\n const pannable = this.view.prefixClassName('graph-scroller-pannable');\n if (this.pannable) {\n Dom.addClass(container, pannable);\n container.dataset.panning = (!!isPanning).toString(); // Use dataset to control scroller panning style to avoid reflow caused by changing classList\n }\n else {\n Dom.removeClass(container, pannable);\n }\n }\n enablePanning() {\n if (!this.pannable) {\n this.widgetOptions.pannable = true;\n this.updateClassName();\n // if (\n // ModifierKey.equals(\n // this.graph.options.scroller.modifiers,\n // this.graph.options.selecting.modifiers,\n // )\n // ) {\n // this.graph.selection.disableRubberband()\n // }\n }\n }\n disablePanning() {\n if (this.pannable) {\n this.widgetOptions.pannable = false;\n this.updateClassName();\n }\n }\n lock() {\n if (this.widget) {\n this.widget.lock();\n }\n }\n unlock() {\n if (this.widget) {\n this.widget.unlock();\n }\n }\n update() {\n if (this.widget) {\n this.widget.update();\n }\n }\n enableAutoResize() {\n if (this.widget) {\n this.widget.enableAutoResize();\n }\n }\n disableAutoResize() {\n if (this.widget) {\n this.widget.disableAutoResize();\n }\n }\n resize(width, height) {\n if (this.widget) {\n this.widget.resize(width, height);\n }\n }\n dispose() {\n if (this.widget) {\n this.widget.dispose();\n }\n this.stopListening();\n }\n}\n__decorate([\n Base.dispose()\n], ScrollerManager.prototype, \"dispose\", null);\n//# sourceMappingURL=scroller.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Base } from './base';\nexport class ClipboardManager extends Base {\n get commonOptions() {\n const _a = this.instanceOptions, { enabled } = _a, others = __rest(_a, [\"enabled\"]);\n return others;\n }\n get instanceOptions() {\n return this.options.clipboard;\n }\n get cells() {\n return this.widget.cells;\n }\n get disabled() {\n return this.instanceOptions.enabled !== true;\n }\n init() {\n this.widget = this.graph.hook.createClipboard();\n this.widget.deserialize(this.instanceOptions);\n }\n enable() {\n if (this.disabled) {\n this.instanceOptions.enabled = true;\n }\n }\n disable() {\n if (!this.disabled) {\n this.instanceOptions.enabled = false;\n }\n }\n copy(cells, options = {}) {\n if (!this.disabled) {\n this.widget.copy(cells, this.graph, Object.assign(Object.assign({}, this.commonOptions), options));\n }\n }\n cut(cells, options = {}) {\n if (!this.disabled) {\n this.widget.cut(cells, this.graph, Object.assign(Object.assign({}, this.commonOptions), options));\n }\n }\n paste(options = {}, graph = this.graph) {\n if (!this.disabled) {\n return this.widget.paste(graph, Object.assign(Object.assign({}, this.commonOptions), options));\n }\n return [];\n }\n clean(force) {\n if (!this.disabled || force) {\n this.widget.clean();\n }\n }\n isEmpty() {\n return this.widget.isEmpty();\n }\n dispose() {\n this.clean(true);\n }\n}\n__decorate([\n Base.dispose()\n], ClipboardManager.prototype, \"dispose\", null);\n//# sourceMappingURL=clipboard.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Dom } from '../util';\nimport { Highlighter } from '../registry';\nimport { Base } from './base';\nexport class HighlightManager extends Base {\n constructor() {\n super(...arguments);\n this.highlights = {};\n }\n init() {\n this.startListening();\n }\n startListening() {\n this.graph.on('cell:highlight', this.onCellHighlight, this);\n this.graph.on('cell:unhighlight', this.onCellUnhighlight, this);\n }\n stopListening() {\n this.graph.off('cell:highlight', this.onCellHighlight, this);\n this.graph.off('cell:unhighlight', this.onCellUnhighlight, this);\n }\n onCellHighlight({ view: cellView, magnet, options = {}, }) {\n const resolved = this.resolveHighlighter(options);\n if (!resolved) {\n return;\n }\n const key = this.getHighlighterId(magnet, resolved);\n if (!this.highlights[key]) {\n const highlighter = resolved.highlighter;\n highlighter.highlight(cellView, magnet, Object.assign({}, resolved.args));\n this.highlights[key] = {\n cellView,\n magnet,\n highlighter,\n args: resolved.args,\n };\n }\n }\n onCellUnhighlight({ magnet, options = {}, }) {\n const resolved = this.resolveHighlighter(options);\n if (!resolved) {\n return;\n }\n const id = this.getHighlighterId(magnet, resolved);\n this.unhighlight(id);\n }\n resolveHighlighter(options) {\n const graphOptions = this.options;\n let highlighterDef = options.highlighter;\n if (highlighterDef == null) {\n // check for built-in types\n const type = options.type;\n highlighterDef =\n (type && graphOptions.highlighting[type]) ||\n graphOptions.highlighting.default;\n }\n if (highlighterDef == null) {\n return null;\n }\n const def = typeof highlighterDef === 'string'\n ? {\n name: highlighterDef,\n }\n : highlighterDef;\n const name = def.name;\n const highlighter = Highlighter.registry.get(name);\n if (highlighter == null) {\n return Highlighter.registry.onNotFound(name);\n }\n Highlighter.check(name, highlighter);\n return {\n name,\n highlighter,\n args: def.args || {},\n };\n }\n getHighlighterId(magnet, options) {\n Dom.ensureId(magnet);\n return options.name + magnet.id + JSON.stringify(options.args);\n }\n unhighlight(id) {\n const highlight = this.highlights[id];\n if (highlight) {\n highlight.highlighter.unhighlight(highlight.cellView, highlight.magnet, highlight.args);\n delete this.highlights[id];\n }\n }\n dispose() {\n Object.keys(this.highlights).forEach((id) => this.unhighlight(id));\n this.stopListening();\n }\n}\n__decorate([\n HighlightManager.dispose()\n], HighlightManager.prototype, \"dispose\", null);\n//# sourceMappingURL=highlight.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Dom, NumberExt } from '../util';\nimport { Point, Rectangle } from '../geometry';\nimport { Base } from './base';\nexport class TransformManager extends Base {\n constructor() {\n super(...arguments);\n this.widgets = new Map();\n }\n get container() {\n return this.graph.view.container;\n }\n get viewport() {\n return this.graph.view.viewport;\n }\n get isSelectionEnabled() {\n return this.options.selecting.enabled === true;\n }\n init() {\n this.startListening();\n this.resize();\n }\n startListening() {\n this.graph.on('node:mouseup', this.onNodeMouseUp, this);\n this.graph.on('node:selected', this.onNodeSelected, this);\n this.graph.on('node:unselected', this.onNodeUnSelected, this);\n }\n stopListening() {\n this.graph.off('node:mouseup', this.onNodeMouseUp, this);\n this.graph.off('node:selected', this.onNodeSelected, this);\n this.graph.off('node:unselected', this.onNodeUnSelected, this);\n }\n onNodeMouseUp({ node }) {\n if (!this.isSelectionEnabled) {\n const widget = this.graph.hook.createTransform(node, { clearAll: true });\n if (widget) {\n this.widgets.set(node, widget);\n }\n }\n }\n onNodeSelected({ node }) {\n if (this.isSelectionEnabled) {\n const widget = this.graph.hook.createTransform(node, { clearAll: false });\n if (widget) {\n this.widgets.set(node, widget);\n }\n }\n }\n onNodeUnSelected({ node }) {\n if (this.isSelectionEnabled) {\n const widget = this.widgets.get(node);\n if (widget) {\n widget.dispose();\n }\n this.widgets.delete(node);\n }\n }\n /**\n * Returns the current transformation matrix of the graph.\n */\n getMatrix() {\n const transform = this.viewport.getAttribute('transform');\n if (transform !== this.viewportTransformString) {\n // `getCTM`: top-left relative to the SVG element\n // `getScreenCTM`: top-left relative to the document\n this.viewportMatrix = this.viewport.getCTM();\n this.viewportTransformString = transform;\n }\n // Clone the cached current transformation matrix.\n // If no matrix previously stored the identity matrix is returned.\n return Dom.createSVGMatrix(this.viewportMatrix);\n }\n /**\n * Sets new transformation with the given `matrix`\n */\n setMatrix(matrix) {\n const ctm = Dom.createSVGMatrix(matrix);\n const transform = Dom.matrixToTransformString(ctm);\n this.viewport.setAttribute('transform', transform);\n this.viewportMatrix = ctm;\n this.viewportTransformString = transform;\n }\n resize(width, height) {\n let w = width === undefined ? this.options.width : width;\n let h = height === undefined ? this.options.height : height;\n this.options.width = w;\n this.options.height = h;\n if (typeof w === 'number') {\n w = Math.round(w);\n }\n if (typeof h === 'number') {\n h = Math.round(h);\n }\n this.container.style.width = w == null ? '' : `${w}px`;\n this.container.style.height = h == null ? '' : `${h}px`;\n const size = this.getComputedSize();\n this.graph.trigger('resize', Object.assign({}, size));\n return this;\n }\n getComputedSize() {\n let w = this.options.width;\n let h = this.options.height;\n if (!NumberExt.isNumber(w)) {\n w = this.container.clientWidth;\n }\n if (!NumberExt.isNumber(h)) {\n h = this.container.clientHeight;\n }\n return { width: w, height: h };\n }\n getScale() {\n return Dom.matrixToScale(this.getMatrix());\n }\n scale(sx, sy = sx, ox = 0, oy = 0) {\n sx = this.clampScale(sx); // eslint-disable-line\n sy = this.clampScale(sy); // eslint-disable-line\n if (ox || oy) {\n const ts = this.getTranslation();\n const tx = ts.tx - ox * (sx - 1);\n const ty = ts.ty - oy * (sy - 1);\n if (tx !== ts.tx || ty !== ts.ty) {\n this.translate(tx, ty);\n }\n }\n const matrix = this.getMatrix();\n matrix.a = sx;\n matrix.d = sy;\n this.setMatrix(matrix);\n this.graph.trigger('scale', { sx, sy, ox, oy });\n return this;\n }\n clampScale(scale) {\n const range = this.graph.options.scaling;\n return NumberExt.clamp(scale, range.min || 0.01, range.max || 16);\n }\n getZoom() {\n return this.getScale().sx;\n }\n zoom(factor, options) {\n options = options || {}; // eslint-disable-line\n let sx = factor;\n let sy = factor;\n const scale = this.getScale();\n const clientSize = this.getComputedSize();\n let cx = clientSize.width / 2;\n let cy = clientSize.height / 2;\n if (!options.absolute) {\n sx += scale.sx;\n sy += scale.sy;\n }\n if (options.scaleGrid) {\n sx = Math.round(sx / options.scaleGrid) * options.scaleGrid;\n sy = Math.round(sy / options.scaleGrid) * options.scaleGrid;\n }\n if (options.maxScale) {\n sx = Math.min(options.maxScale, sx);\n sy = Math.min(options.maxScale, sy);\n }\n if (options.minScale) {\n sx = Math.max(options.minScale, sx);\n sy = Math.max(options.minScale, sy);\n }\n if (options.center) {\n cx = options.center.x;\n cy = options.center.y;\n }\n sx = this.clampScale(sx);\n sy = this.clampScale(sy);\n if (cx || cy) {\n const ts = this.getTranslation();\n const tx = cx - (cx - ts.tx) * (sx / scale.sx);\n const ty = cy - (cy - ts.ty) * (sy / scale.sy);\n if (tx !== ts.tx || ty !== ts.ty) {\n this.translate(tx, ty);\n }\n }\n this.scale(sx, sy);\n return this;\n }\n getRotation() {\n return Dom.matrixToRotation(this.getMatrix());\n }\n rotate(angle, cx, cy) {\n if (cx == null || cy == null) {\n const bbox = Dom.getBBox(this.graph.view.stage);\n cx = bbox.width / 2; // eslint-disable-line\n cy = bbox.height / 2; // eslint-disable-line\n }\n const ctm = this.getMatrix()\n .translate(cx, cy)\n .rotate(angle)\n .translate(-cx, -cy);\n this.setMatrix(ctm);\n return this;\n }\n getTranslation() {\n return Dom.matrixToTranslation(this.getMatrix());\n }\n translate(tx, ty) {\n const matrix = this.getMatrix();\n matrix.e = tx || 0;\n matrix.f = ty || 0;\n this.setMatrix(matrix);\n const ts = this.getTranslation();\n this.options.x = ts.tx;\n this.options.y = ts.ty;\n this.graph.trigger('translate', Object.assign({}, ts));\n return this;\n }\n setOrigin(ox, oy) {\n return this.translate(ox || 0, oy || 0);\n }\n fitToContent(gridWidth, gridHeight, padding, options) {\n if (typeof gridWidth === 'object') {\n const opts = gridWidth;\n gridWidth = opts.gridWidth || 1; // eslint-disable-line\n gridHeight = opts.gridHeight || 1; // eslint-disable-line\n padding = opts.padding || 0; // eslint-disable-line\n options = opts; // eslint-disable-line\n }\n else {\n gridWidth = gridWidth || 1; // eslint-disable-line\n gridHeight = gridHeight || 1; // eslint-disable-line\n padding = padding || 0; // eslint-disable-line\n if (options == null) {\n options = {}; // eslint-disable-line\n }\n }\n const paddings = NumberExt.normalizeSides(padding);\n const border = options.border || 0;\n const contentArea = options.contentArea\n ? Rectangle.create(options.contentArea)\n : this.getContentArea(options);\n if (border > 0) {\n contentArea.inflate(border);\n }\n const scale = this.getScale();\n const translate = this.getTranslation();\n const sx = scale.sx;\n const sy = scale.sy;\n contentArea.x *= sx;\n contentArea.y *= sy;\n contentArea.width *= sx;\n contentArea.height *= sy;\n let width = Math.max(Math.ceil((contentArea.width + contentArea.x) / gridWidth), 1) *\n gridWidth;\n let height = Math.max(Math.ceil((contentArea.height + contentArea.y) / gridHeight), 1) * gridHeight;\n let tx = 0;\n let ty = 0;\n if ((options.allowNewOrigin === 'negative' && contentArea.x < 0) ||\n (options.allowNewOrigin === 'positive' && contentArea.x >= 0) ||\n options.allowNewOrigin === 'any') {\n tx = Math.ceil(-contentArea.x / gridWidth) * gridWidth;\n tx += paddings.left;\n width += tx;\n }\n if ((options.allowNewOrigin === 'negative' && contentArea.y < 0) ||\n (options.allowNewOrigin === 'positive' && contentArea.y >= 0) ||\n options.allowNewOrigin === 'any') {\n ty = Math.ceil(-contentArea.y / gridHeight) * gridHeight;\n ty += paddings.top;\n height += ty;\n }\n width += paddings.right;\n height += paddings.bottom;\n // Make sure the resulting width and height are greater than minimum.\n width = Math.max(width, options.minWidth || 0);\n height = Math.max(height, options.minHeight || 0);\n // Make sure the resulting width and height are lesser than maximum.\n width = Math.min(width, options.maxWidth || Number.MAX_SAFE_INTEGER);\n height = Math.min(height, options.maxHeight || Number.MAX_SAFE_INTEGER);\n const size = this.getComputedSize();\n const sizeChanged = width !== size.width || height !== size.height;\n const originChanged = tx !== translate.tx || ty !== translate.ty;\n // Change the dimensions only if there is a size discrepency or an origin change\n if (originChanged) {\n this.translate(tx, ty);\n }\n if (sizeChanged) {\n this.resize(width, height);\n }\n return new Rectangle(-tx / sx, -ty / sy, width / sx, height / sy);\n }\n scaleContentToFit(options = {}) {\n this.scaleContentToFitImpl(options);\n }\n scaleContentToFitImpl(options = {}, translate = true) {\n let contentBBox;\n let contentLocalOrigin;\n if (options.contentArea) {\n const contentArea = options.contentArea;\n contentBBox = this.graph.localToGraph(contentArea);\n contentLocalOrigin = Point.create(contentArea);\n }\n else {\n contentBBox = this.getContentBBox(options);\n contentLocalOrigin = this.graph.graphToLocal(contentBBox);\n }\n if (!contentBBox.width || !contentBBox.height) {\n return;\n }\n const padding = NumberExt.normalizeSides(options.padding);\n const minScale = options.minScale || 0;\n const maxScale = options.maxScale || Number.MAX_SAFE_INTEGER;\n const minScaleX = options.minScaleX || minScale;\n const maxScaleX = options.maxScaleX || maxScale;\n const minScaleY = options.minScaleY || minScale;\n const maxScaleY = options.maxScaleY || maxScale;\n let fittingBox;\n if (options.viewportArea) {\n fittingBox = options.viewportArea;\n }\n else {\n const computedSize = this.getComputedSize();\n const currentTranslate = this.getTranslation();\n fittingBox = {\n x: currentTranslate.tx,\n y: currentTranslate.ty,\n width: computedSize.width,\n height: computedSize.height,\n };\n }\n fittingBox = Rectangle.create(fittingBox).moveAndExpand({\n x: padding.left,\n y: padding.top,\n width: -padding.left - padding.right,\n height: -padding.top - padding.bottom,\n });\n const currentScale = this.getScale();\n let newSX = (fittingBox.width / contentBBox.width) * currentScale.sx;\n let newSY = (fittingBox.height / contentBBox.height) * currentScale.sy;\n if (options.preserveAspectRatio !== false) {\n newSX = newSY = Math.min(newSX, newSY);\n }\n // snap scale to a grid\n const gridSize = options.scaleGrid;\n if (gridSize) {\n newSX = gridSize * Math.floor(newSX / gridSize);\n newSY = gridSize * Math.floor(newSY / gridSize);\n }\n // scale min/max boundaries\n newSX = NumberExt.clamp(newSX, minScaleX, maxScaleX);\n newSY = NumberExt.clamp(newSY, minScaleY, maxScaleY);\n this.scale(newSX, newSY);\n if (translate) {\n const origin = this.options;\n const newOX = fittingBox.x - contentLocalOrigin.x * newSX - origin.x;\n const newOY = fittingBox.y - contentLocalOrigin.y * newSY - origin.y;\n this.translate(newOX, newOY);\n }\n }\n getContentArea(options = {}) {\n if (options.useCellGeometry) {\n return this.model.getAllCellsBBox() || new Rectangle();\n }\n return Dom.getBBox(this.graph.view.stage);\n }\n getContentBBox(options = {}) {\n return this.graph.localToGraph(this.getContentArea(options));\n }\n getGraphArea() {\n const rect = Rectangle.fromSize(this.getComputedSize());\n return this.graph.graphToLocal(rect);\n }\n zoomToRect(rect, options = {}) {\n const area = Rectangle.create(rect);\n const graph = this.graph;\n options.contentArea = area;\n if (options.viewportArea == null) {\n options.viewportArea = {\n x: graph.options.x,\n y: graph.options.y,\n width: this.options.width,\n height: this.options.height,\n };\n }\n this.scaleContentToFitImpl(options, false);\n const center = area.getCenter();\n this.centerPoint(center.x, center.y);\n return this;\n }\n zoomToFit(options = {}) {\n return this.zoomToRect(this.getContentArea(options), options);\n }\n centerPoint(x, y) {\n const clientSize = this.getComputedSize();\n const scale = this.getScale();\n const ts = this.getTranslation();\n const cx = clientSize.width / 2;\n const cy = clientSize.height / 2;\n x = typeof x === 'number' ? x : cx; // eslint-disable-line\n y = typeof y === 'number' ? y : cy; // eslint-disable-line\n x = cx - x * scale.sx; // eslint-disable-line\n y = cy - y * scale.sy; // eslint-disable-line\n if (ts.tx !== x || ts.ty !== y) {\n this.translate(x, y);\n }\n }\n centerContent(options) {\n const rect = this.graph.getContentArea(options);\n const center = rect.getCenter();\n this.centerPoint(center.x, center.y);\n }\n centerCell(cell) {\n return this.positionCell(cell, 'center');\n }\n positionPoint(point, x, y) {\n const clientSize = this.getComputedSize();\n // eslint-disable-next-line\n x = NumberExt.normalizePercentage(x, Math.max(0, clientSize.width));\n if (x < 0) {\n x = clientSize.width + x; // eslint-disable-line\n }\n // eslint-disable-next-line\n y = NumberExt.normalizePercentage(y, Math.max(0, clientSize.height));\n if (y < 0) {\n y = clientSize.height + y; // eslint-disable-line\n }\n const ts = this.getTranslation();\n const scale = this.getScale();\n const dx = x - point.x * scale.sx;\n const dy = y - point.y * scale.sy;\n if (ts.tx !== dx || ts.ty !== dy) {\n this.translate(dx, dy);\n }\n }\n positionRect(rect, pos) {\n const bbox = Rectangle.create(rect);\n switch (pos) {\n case 'center':\n return this.positionPoint(bbox.getCenter(), '50%', '50%');\n case 'top':\n return this.positionPoint(bbox.getTopCenter(), '50%', 0);\n case 'top-right':\n return this.positionPoint(bbox.getTopRight(), '100%', 0);\n case 'right':\n return this.positionPoint(bbox.getRightMiddle(), '100%', '50%');\n case 'bottom-right':\n return this.positionPoint(bbox.getBottomRight(), '100%', '100%');\n case 'bottom':\n return this.positionPoint(bbox.getBottomCenter(), '50%', '100%');\n case 'bottom-left':\n return this.positionPoint(bbox.getBottomLeft(), 0, '100%');\n case 'left':\n return this.positionPoint(bbox.getLeftMiddle(), 0, '50%');\n case 'top-left':\n return this.positionPoint(bbox.getTopLeft(), 0, 0);\n default:\n return this;\n }\n }\n positionCell(cell, pos) {\n const bbox = cell.getBBox();\n return this.positionRect(bbox, pos);\n }\n positionContent(pos, options) {\n const rect = this.graph.getContentArea(options);\n return this.positionRect(rect, pos);\n }\n dispose() {\n this.widgets.forEach((widget) => widget.dispose());\n this.widgets.clear();\n this.stopListening();\n }\n}\n__decorate([\n TransformManager.dispose()\n], TransformManager.prototype, \"dispose\", null);\n//# sourceMappingURL=transform.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { ModifierKey } from '../types';\nimport { Base } from './base';\nexport class SelectionManager extends Base {\n constructor() {\n super(...arguments);\n this.movedMap = new WeakMap();\n this.unselectMap = new WeakMap();\n }\n get widgetOptions() {\n return this.options.selecting;\n }\n get rubberbandDisabled() {\n return (this.widgetOptions.enabled !== true ||\n this.widgetOptions.rubberband !== true);\n }\n get disabled() {\n return this.widgetOptions.enabled !== true;\n }\n get length() {\n return this.widget.length;\n }\n get cells() {\n return this.widget.cells;\n }\n init() {\n this.widget = this.graph.hook.createSelection();\n this.startListening();\n }\n startListening() {\n this.graph.on('blank:mousedown', this.onBlankMouseDown, this);\n this.graph.on('blank:click', this.onBlankClick, this);\n this.graph.on('cell:mousemove', this.onCellMouseMove, this);\n this.graph.on('cell:mouseup', this.onCellMouseUp, this);\n this.widget.on('box:mousedown', this.onBoxMouseDown, this);\n }\n stopListening() {\n this.graph.off('blank:mousedown', this.onBlankMouseDown, this);\n this.graph.off('blank:click', this.onBlankClick, this);\n this.graph.off('cell:mousemove', this.onCellMouseMove, this);\n this.graph.off('cell:mouseup', this.onCellMouseUp, this);\n this.widget.off('box:mousedown', this.onBoxMouseDown, this);\n }\n onBlankMouseDown({ e }) {\n if (this.allowRubberband(e, true) ||\n (this.allowRubberband(e) &&\n !this.graph.scroller.allowPanning(e, true) &&\n !this.graph.panning.allowPanning(e, true))) {\n this.startRubberband(e);\n }\n }\n onBlankClick() {\n this.clean();\n }\n allowRubberband(e, strict) {\n return (!this.rubberbandDisabled &&\n ModifierKey.isMatch(e, this.widgetOptions.modifiers, strict) &&\n this.graph.hook.allowRubberband(e));\n }\n onCellMouseMove({ cell }) {\n this.movedMap.set(cell, true);\n }\n onCellMouseUp({ e, cell }) {\n const options = this.widgetOptions;\n let disabled = this.disabled;\n if (!disabled && this.movedMap.has(cell)) {\n disabled = options.selectCellOnMoved === false;\n if (!disabled) {\n disabled = options.selectNodeOnMoved === false && cell.isNode();\n }\n if (!disabled) {\n disabled = options.selectEdgeOnMoved === false && cell.isEdge();\n }\n }\n if (!disabled) {\n if (options.multiple === false || (!e.ctrlKey && !e.metaKey)) {\n this.reset(cell);\n }\n else if (this.unselectMap.has(cell)) {\n this.unselectMap.delete(cell);\n }\n else if (this.isSelected(cell)) {\n this.unselect(cell);\n }\n else {\n this.select(cell);\n }\n }\n this.movedMap.delete(cell);\n }\n onBoxMouseDown({ e, cell }) {\n if (!this.disabled) {\n if (this.widgetOptions.multiple !== false && (e.ctrlKey || e.metaKey)) {\n this.unselect(cell);\n this.unselectMap.set(cell, true);\n }\n }\n }\n isEmpty() {\n return this.length <= 0;\n }\n isSelected(cell) {\n return this.widget.isSelected(cell);\n }\n getCells(cells) {\n return (Array.isArray(cells) ? cells : [cells])\n .map((cell) => typeof cell === 'string' ? this.graph.getCellById(cell) : cell)\n .filter((cell) => cell != null);\n }\n select(cells, options = {}) {\n const selected = this.getCells(cells);\n if (selected.length) {\n if (this.isMultiple()) {\n this.widget.select(selected, options);\n }\n else {\n this.reset(selected.slice(0, 1), options);\n }\n }\n return this;\n }\n unselect(cells, options = {}) {\n this.widget.unselect(this.getCells(cells), options);\n return this;\n }\n reset(cells, options = {}) {\n this.widget.reset(cells ? this.getCells(cells) : [], options);\n return this;\n }\n clean(options = {}) {\n this.widget.clean(options);\n return this;\n }\n enable() {\n if (this.disabled) {\n this.widgetOptions.enabled = true;\n }\n return this;\n }\n disable() {\n if (!this.disabled) {\n this.widgetOptions.enabled = false;\n }\n return this;\n }\n startRubberband(e) {\n if (!this.rubberbandDisabled) {\n this.widget.startSelecting(e);\n }\n return this;\n }\n enableRubberband() {\n if (this.rubberbandDisabled) {\n this.widgetOptions.rubberband = true;\n // if (\n // ModifierKey.equals(\n // this.graph.options.scroller.modifiers,\n // this.graph.options.selecting.modifiers,\n // )\n // ) {\n // this.graph.scroller.disablePanning()\n // }\n }\n return this;\n }\n disableRubberband() {\n if (!this.rubberbandDisabled) {\n this.widgetOptions.rubberband = false;\n }\n return this;\n }\n isMultiple() {\n return this.widgetOptions.multiple !== false;\n }\n enableMultiple() {\n this.widgetOptions.multiple = true;\n return this;\n }\n disableMultiple() {\n this.widgetOptions.multiple = false;\n return this;\n }\n setModifiers(modifiers) {\n this.widgetOptions.modifiers = modifiers;\n return this;\n }\n setContent(content) {\n this.widget.setContent(content);\n return this;\n }\n setFilter(filter) {\n this.widget.setFilter(filter);\n return this;\n }\n dispose() {\n this.stopListening();\n this.widget.dispose();\n }\n}\n__decorate([\n Base.dispose()\n], SelectionManager.prototype, \"dispose\", null);\n//# sourceMappingURL=selection.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { ObjectExt, FunctionExt } from '../util';\nimport { Basecoat } from '../common';\nimport { Model } from '../model/model';\nexport class HistoryManager extends Basecoat {\n constructor(options) {\n super();\n this.batchCommands = null;\n this.batchLevel = 0;\n this.lastBatchIndex = -1;\n this.freezed = false;\n this.handlers = [];\n this.graph = options.graph;\n this.model = options.graph.model;\n this.options = Util.getOptions(options);\n this.validator = new HistoryManager.Validator({\n history: this,\n cancelInvalid: this.options.cancelInvalid,\n });\n this.clean();\n this.startListening();\n }\n get disabled() {\n return this.options.enabled !== true;\n }\n enable() {\n if (this.disabled) {\n this.options.enabled = true;\n }\n }\n disable() {\n if (!this.disabled) {\n this.options.enabled = false;\n }\n }\n undo(options = {}) {\n if (!this.disabled) {\n const cmd = this.undoStack.pop();\n if (cmd) {\n this.revertCommand(cmd, options);\n this.redoStack.push(cmd);\n this.notify('undo', cmd, options);\n }\n }\n return this;\n }\n redo(options = {}) {\n if (!this.disabled) {\n const cmd = this.redoStack.pop();\n if (cmd) {\n this.applyCommand(cmd, options);\n this.undoStack.push(cmd);\n this.notify('redo', cmd, options);\n }\n }\n return this;\n }\n /**\n * Same as `undo()` but does not store the undo-ed command to the\n * `redoStack`. Canceled command therefore cannot be redo-ed.\n */\n cancel(options = {}) {\n if (!this.disabled) {\n const cmd = this.undoStack.pop();\n if (cmd) {\n this.revertCommand(cmd, options);\n this.redoStack = [];\n this.notify('cancel', cmd, options);\n }\n }\n return this;\n }\n clean(options = {}) {\n this.undoStack = [];\n this.redoStack = [];\n this.notify('clean', null, options);\n return this;\n }\n canUndo() {\n return !this.disabled && this.undoStack.length > 0;\n }\n canRedo() {\n return !this.disabled && this.redoStack.length > 0;\n }\n validate(events, ...callbacks) {\n this.validator.validate(events, ...callbacks);\n return this;\n }\n dispose() {\n this.validator.dispose();\n this.clean();\n this.stopListening();\n }\n startListening() {\n this.model.on('batch:start', this.initBatchCommand, this);\n this.model.on('batch:stop', this.storeBatchCommand, this);\n if (this.options.eventNames) {\n this.options.eventNames.forEach((name, index) => {\n this.handlers[index] = this.addCommand.bind(this, name);\n this.model.on(name, this.handlers[index]);\n });\n }\n this.validator.on('invalid', (args) => this.trigger('invalid', args));\n }\n stopListening() {\n this.model.off('batch:start', this.initBatchCommand, this);\n this.model.off('batch:stop', this.storeBatchCommand, this);\n if (this.options.eventNames) {\n this.options.eventNames.forEach((name, index) => {\n this.model.off(name, this.handlers[index]);\n });\n this.handlers.length = 0;\n }\n this.validator.off('invalid');\n }\n createCommand(options) {\n return {\n batch: options ? options.batch : false,\n data: {},\n };\n }\n revertCommand(cmd, options) {\n this.freezed = true;\n const cmds = Array.isArray(cmd) ? Util.sortBatchCommands(cmd) : [cmd];\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n const localOptions = Object.assign(Object.assign({}, options), ObjectExt.pick(cmd.options, this.options.revertOptionsList || []));\n this.executeCommand(cmd, true, localOptions);\n }\n this.freezed = false;\n }\n applyCommand(cmd, options) {\n this.freezed = true;\n const cmds = Array.isArray(cmd) ? Util.sortBatchCommands(cmd) : [cmd];\n for (let i = 0; i < cmds.length; i += 1) {\n const cmd = cmds[i];\n const localOptions = Object.assign(Object.assign({}, options), ObjectExt.pick(cmd.options, this.options.applyOptionsList || []));\n this.executeCommand(cmd, false, localOptions);\n }\n this.freezed = false;\n }\n executeCommand(cmd, revert, options) {\n const model = this.model;\n // const cell = cmd.modelChange ? model : model.getCell(cmd.data.id!)\n const cell = model.getCell(cmd.data.id);\n const event = cmd.event;\n if ((Util.isAddEvent(event) && revert) ||\n (Util.isRemoveEvent(event) && !revert)) {\n cell.remove(options);\n }\n else if ((Util.isAddEvent(event) && !revert) ||\n (Util.isRemoveEvent(event) && revert)) {\n const data = cmd.data;\n if (data.node) {\n model.addNode(data.props, options);\n }\n else if (data.edge) {\n model.addEdge(data.props, options);\n }\n }\n else if (Util.isChangeEvent(event)) {\n const data = cmd.data;\n const key = data.key;\n if (key) {\n const value = revert ? data.prev[key] : data.next[key];\n cell.prop(key, value, options);\n }\n }\n else {\n const executeCommand = this.options.executeCommand;\n if (executeCommand) {\n FunctionExt.call(executeCommand, this, cmd, revert, options);\n }\n }\n }\n addCommand(event, args) {\n if (this.freezed || this.disabled) {\n return;\n }\n const eventArgs = args;\n const options = eventArgs.options || {};\n if (options.dryrun) {\n return;\n }\n if ((Util.isAddEvent(event) && this.options.ignoreAdd) ||\n (Util.isRemoveEvent(event) && this.options.ignoreRemove) ||\n (Util.isChangeEvent(event) && this.options.ignoreChange)) {\n return;\n }\n // before\n // ------\n const before = this.options.beforeAddCommand;\n if (before != null &&\n FunctionExt.call(before, this, event, args) === false) {\n return;\n }\n if (event === 'cell:change:*') {\n // eslint-disable-next-line\n event = `cell:change:${eventArgs.key}`;\n }\n const cell = eventArgs.cell;\n const isModelChange = Model.isModel(cell);\n let cmd;\n if (this.batchCommands) {\n // In most cases we are working with same object, doing\n // same action etc. translate an object piece by piece.\n cmd = this.batchCommands[Math.max(this.lastBatchIndex, 0)];\n // Check if we are start working with new object or performing different\n // action with it. Note, that command is uninitialized when lastCmdIndex\n // equals -1. In that case we are done, command we were looking for is\n // already set\n const diffId = (isModelChange && !cmd.modelChange) || cmd.data.id !== cell.id;\n const diffName = cmd.event !== event;\n if (this.lastBatchIndex >= 0 && (diffId || diffName)) {\n // Trying to find command first, which was performing same\n // action with the object as we are doing now with cell.\n const index = this.batchCommands.findIndex((cmd) => ((isModelChange && cmd.modelChange) || cmd.data.id === cell.id) &&\n cmd.event === event);\n if (index < 0 || Util.isAddEvent(event) || Util.isRemoveEvent(event)) {\n cmd = this.createCommand({ batch: true });\n }\n else {\n cmd = this.batchCommands[index];\n this.batchCommands.splice(index, 1);\n }\n this.batchCommands.push(cmd);\n this.lastBatchIndex = this.batchCommands.length - 1;\n }\n }\n else {\n cmd = this.createCommand({ batch: false });\n }\n // add & remove\n // ------------\n if (Util.isAddEvent(event) || Util.isRemoveEvent(event)) {\n const data = cmd.data;\n cmd.event = event;\n cmd.options = options;\n data.id = cell.id;\n data.props = ObjectExt.cloneDeep(cell.toJSON());\n if (cell.isEdge()) {\n data.edge = true;\n }\n else if (cell.isNode()) {\n data.node = true;\n }\n return this.push(cmd, options);\n }\n // change:*\n // --------\n if (Util.isChangeEvent(event)) {\n const key = args.key;\n const data = cmd.data;\n if (!cmd.batch || !cmd.event) {\n // Do this only once. Set previous data and action (also\n // serves as a flag so that we don't repeat this branche).\n cmd.event = event;\n cmd.options = options;\n data.key = key;\n if (data.prev == null) {\n data.prev = {};\n }\n data.prev[key] = ObjectExt.clone(cell.previous(key));\n if (isModelChange) {\n cmd.modelChange = true;\n }\n else {\n data.id = cell.id;\n }\n }\n if (data.next == null) {\n data.next = {};\n }\n data.next[key] = ObjectExt.clone(cell.prop(key));\n return this.push(cmd, options);\n }\n // others\n // ------\n const afterAddCommand = this.options.afterAddCommand;\n if (afterAddCommand) {\n FunctionExt.call(afterAddCommand, this, event, args, cmd);\n }\n this.push(cmd, options);\n }\n /**\n * Gather multiple changes into a single command. These commands could\n * be reverted with single `undo()` call. From the moment the function\n * is called every change made on model is not stored into the undoStack.\n * Changes are temporarily kept until `storeBatchCommand()` is called.\n */\n // eslint-disable-next-line\n initBatchCommand(options) {\n if (this.freezed) {\n return;\n }\n if (this.batchCommands) {\n this.batchLevel += 1;\n }\n else {\n this.batchCommands = [this.createCommand({ batch: true })];\n this.batchLevel = 0;\n this.lastBatchIndex = -1;\n }\n }\n /**\n * Store changes temporarily kept in the undoStack. You have to call this\n * function as many times as `initBatchCommand()` been called.\n */\n storeBatchCommand(options) {\n if (this.freezed) {\n return;\n }\n if (this.batchCommands && this.batchLevel <= 0) {\n const cmds = this.filterBatchCommand(this.batchCommands);\n if (cmds.length > 0) {\n this.redoStack = [];\n this.undoStack.push(cmds);\n this.notify('add', cmds, options);\n }\n this.batchCommands = null;\n this.lastBatchIndex = -1;\n this.batchLevel = 0;\n }\n else if (this.batchCommands && this.batchLevel > 0) {\n this.batchLevel -= 1;\n }\n }\n filterBatchCommand(batchCommands) {\n let cmds = batchCommands.slice();\n const result = [];\n while (cmds.length > 0) {\n const cmd = cmds.shift();\n const evt = cmd.event;\n const id = cmd.data.id;\n if (evt != null && (id != null || cmd.modelChange)) {\n if (Util.isAddEvent(evt)) {\n const index = cmds.findIndex((c) => Util.isRemoveEvent(c.event) && c.data.id === id);\n if (index >= 0) {\n cmds = cmds.filter((c, i) => index < i || c.data.id !== id);\n continue;\n }\n }\n else if (Util.isRemoveEvent(evt)) {\n const index = cmds.findIndex((c) => Util.isAddEvent(c.event) && c.data.id === id);\n if (index >= 0) {\n cmds.splice(index, 1);\n continue;\n }\n }\n else if (Util.isChangeEvent(evt)) {\n const data = cmd.data;\n if (ObjectExt.isEqual(data.prev, data.next)) {\n continue;\n }\n }\n else {\n // pass\n }\n result.push(cmd);\n }\n }\n return result;\n }\n notify(event, cmd, options) {\n const cmds = cmd == null ? null : Array.isArray(cmd) ? cmd : [cmd];\n this.emit(event, { cmds, options });\n this.emit('change', { cmds, options });\n }\n push(cmd, options) {\n this.redoStack = [];\n if (cmd.batch) {\n this.lastBatchIndex = Math.max(this.lastBatchIndex, 0);\n this.emit('batch', { cmd, options });\n }\n else {\n this.undoStack.push(cmd);\n this.notify('add', cmd, options);\n }\n }\n}\n__decorate([\n Basecoat.dispose()\n], HistoryManager.prototype, \"dispose\", null);\n(function (HistoryManager) {\n /**\n * Runs a set of callbacks to determine if a command is valid. This is\n * useful for checking if a certain action in your application does\n * lead to an invalid state of the graph.\n */\n class Validator extends Basecoat {\n constructor(options) {\n super();\n this.map = {};\n this.command = options.history;\n this.cancelInvalid = options.cancelInvalid !== false;\n this.command.on('add', this.onCommandAdded, this);\n }\n onCommandAdded({ cmds }) {\n return Array.isArray(cmds)\n ? cmds.every((cmd) => this.isValidCommand(cmd))\n : this.isValidCommand(cmds);\n }\n isValidCommand(cmd) {\n if (cmd.options && cmd.options.validation === false) {\n return true;\n }\n const callbacks = (cmd.event && this.map[cmd.event]) || [];\n let handoverErr = null;\n callbacks.forEach((routes) => {\n let i = 0;\n const rollup = (err) => {\n const fn = routes[i];\n i += 1;\n try {\n if (fn) {\n fn(err, cmd, rollup);\n }\n else {\n handoverErr = err;\n return;\n }\n }\n catch (err) {\n rollup(err);\n }\n };\n rollup(handoverErr);\n });\n if (handoverErr) {\n if (this.cancelInvalid) {\n this.command.cancel();\n }\n this.emit('invalid', { err: handoverErr });\n return false;\n }\n return true;\n }\n validate(events, ...callbacks) {\n const evts = Array.isArray(events) ? events : events.split(/\\s+/);\n callbacks.forEach((callback) => {\n if (typeof callback !== 'function') {\n throw new Error(`${evts.join(' ')} requires callback functions.`);\n }\n });\n evts.forEach((event) => {\n if (this.map[event] == null) {\n this.map[event] = [];\n }\n this.map[event].push(callbacks);\n });\n return this;\n }\n dispose() {\n this.command.off('add', this.onCommandAdded, this);\n }\n }\n __decorate([\n Basecoat.dispose()\n ], Validator.prototype, \"dispose\", null);\n HistoryManager.Validator = Validator;\n})(HistoryManager || (HistoryManager = {}));\nvar Util;\n(function (Util) {\n function isAddEvent(event) {\n return event === 'cell:added';\n }\n Util.isAddEvent = isAddEvent;\n function isRemoveEvent(event) {\n return event === 'cell:removed';\n }\n Util.isRemoveEvent = isRemoveEvent;\n function isChangeEvent(event) {\n return event != null && event.startsWith('cell:change:');\n }\n Util.isChangeEvent = isChangeEvent;\n function getOptions(options) {\n const { graph } = options, others = __rest(options, [\"graph\"]);\n const reservedNames = [\n 'cell:added',\n 'cell:removed',\n 'cell:change:*',\n ];\n const batchEvents = [\n 'batch:start',\n 'batch:stop',\n ];\n const eventNames = options.eventNames\n ? options.eventNames.filter((event) => !(Util.isChangeEvent(event) ||\n reservedNames.includes(event) ||\n batchEvents.includes(event)))\n : reservedNames;\n return Object.assign(Object.assign({}, others), { eventNames, applyOptionsList: options.applyOptionsList || ['propertyPath'], revertOptionsList: options.revertOptionsList || ['propertyPath'] });\n }\n Util.getOptions = getOptions;\n function sortBatchCommands(cmds) {\n const results = [];\n for (let i = 0, ii = cmds.length; i < ii; i += 1) {\n const cmd = cmds[i];\n let index = null;\n if (Util.isAddEvent(cmd.event)) {\n const id = cmd.data.id;\n for (let j = 0; j < i; j += 1) {\n if (cmds[j].data.id === id) {\n index = j;\n break;\n }\n }\n }\n if (index !== null) {\n results.splice(index, 0, cmd);\n }\n else {\n results.push(cmd);\n }\n }\n return results;\n }\n Util.sortBatchCommands = sortBatchCommands;\n})(Util || (Util = {}));\n//# sourceMappingURL=history.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Base } from './base';\nexport class MiniMapManager extends Base {\n get widgetOptions() {\n return this.options.minimap;\n }\n init() {\n this.widget = this.graph.hook.createMiniMap();\n }\n dispose() {\n if (this.widget) {\n this.widget.dispose();\n }\n }\n}\n__decorate([\n Base.dispose()\n], MiniMapManager.prototype, \"dispose\", null);\n//# sourceMappingURL=minimap.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport Mousetrap from 'mousetrap';\nimport { Dom, FunctionExt } from '../util';\nimport { Disposable } from '../common';\nexport class Keyboard extends Disposable {\n constructor(options) {\n super();\n this.options = options;\n const scroller = this.graph.scroller.widget;\n this.container = scroller ? scroller.container : this.graph.container;\n if (options.global) {\n this.target = document;\n }\n else {\n this.target = this.container;\n if (!this.disabled) {\n // ensure the container focusable\n this.target.setAttribute('tabindex', '-1');\n }\n // change to mouseup event,prevent page stalling caused by focus\n this.graph.on('cell:mouseup', this.focus, this);\n this.graph.on('blank:mouseup', this.focus, this);\n }\n this.mousetrap = Keyboard.createMousetrap(this);\n }\n get graph() {\n return this.options.graph;\n }\n get disabled() {\n return this.options.enabled !== true;\n }\n enable() {\n if (this.disabled) {\n this.options.enabled = true;\n this.graph.options.keyboard.enabled = true;\n if (this.target instanceof HTMLElement) {\n this.target.setAttribute('tabindex', '-1');\n }\n }\n }\n disable() {\n if (!this.disabled) {\n this.options.enabled = false;\n this.graph.options.keyboard.enabled = false;\n if (this.target instanceof HTMLElement) {\n this.target.removeAttribute('tabindex');\n }\n }\n }\n on(keys, callback, action) {\n this.mousetrap.bind(this.getKeys(keys), callback, action);\n }\n off(keys, action) {\n this.mousetrap.unbind(this.getKeys(keys), action);\n }\n focus(e) {\n const isInputEvent = this.isInputEvent(e.e);\n if (isInputEvent) {\n return;\n }\n const target = this.target;\n target.focus({\n preventScroll: true,\n });\n }\n getKeys(keys) {\n return (Array.isArray(keys) ? keys : [keys]).map((key) => this.formatkey(key));\n }\n formatkey(key) {\n const formated = key\n .toLowerCase()\n .replace(/\\s/g, '')\n .replace('delete', 'del')\n .replace('cmd', 'command');\n const formatFn = this.options.format;\n if (formatFn) {\n return FunctionExt.call(formatFn, this.graph, formated);\n }\n return formated;\n }\n isGraphEvent(e) {\n const target = (e.srcElement || e.target);\n if (target) {\n if (target === this.target || target === document.body) {\n return true;\n }\n return Dom.contains(this.container, target);\n }\n return false;\n }\n isInputEvent(e) {\n const target = e.target;\n const tagName = target && target.tagName.toLowerCase();\n return tagName === 'input';\n }\n isEnabledForEvent(e) {\n const allowed = !this.disabled && this.isGraphEvent(e);\n const isInputEvent = this.isInputEvent(e);\n if (allowed) {\n const code = e.keyCode || e.which;\n if (isInputEvent && (code === 8 || code === 46)) {\n return false;\n }\n if (this.options.guard) {\n return FunctionExt.call(this.options.guard, this.graph, e);\n }\n }\n return allowed;\n }\n dispose() {\n this.mousetrap.reset();\n }\n}\n__decorate([\n Disposable.dispose()\n], Keyboard.prototype, \"dispose\", null);\n(function (Keyboard) {\n function createMousetrap(keyboard) {\n const mousetrap = new Mousetrap(keyboard.target);\n const stopCallback = mousetrap.stopCallback;\n mousetrap.stopCallback = (e, elem, combo) => {\n if (keyboard.isEnabledForEvent(e)) {\n if (stopCallback) {\n return stopCallback.call(mousetrap, e, elem, combo);\n }\n return false;\n }\n return true;\n };\n return mousetrap;\n }\n Keyboard.createMousetrap = createMousetrap;\n})(Keyboard || (Keyboard = {}));\n//# sourceMappingURL=keyboard.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { ModifierKey } from '../types';\nimport { Dom, NumberExt } from '../util';\nimport { Disposable } from '../common';\nexport class MouseWheel extends Disposable {\n constructor(options) {\n super();\n this.options = options;\n this.cumulatedFactor = 1;\n const scroller = this.graph.scroller.widget;\n this.container = scroller ? scroller.container : this.graph.container;\n this.target = this.options.global ? document : this.container;\n this.mousewheelHandle = new Dom.MouseWheelHandle(this.target, this.onMouseWheel.bind(this), this.allowMouseWheel.bind(this));\n if (this.options.enabled) {\n this.enable(true);\n }\n }\n get graph() {\n return this.options.graph;\n }\n get disabled() {\n return this.options.enabled !== true;\n }\n enable(force) {\n if (this.disabled || force) {\n this.options.enabled = true;\n this.graph.options.mousewheel.enabled = true;\n this.mousewheelHandle.enable();\n }\n }\n disable() {\n if (!this.disabled) {\n this.options.enabled = false;\n this.graph.options.mousewheel.enabled = false;\n this.mousewheelHandle.disable();\n }\n }\n allowMouseWheel(evt) {\n const e = (evt.originalEvent || evt);\n const guard = this.options.guard;\n return ((guard == null || guard.call(this.graph, e)) &&\n ModifierKey.isMatch(e, this.options.modifiers));\n }\n onMouseWheel(evt) {\n const e = (evt.originalEvent || evt);\n const guard = this.options.guard;\n if ((guard == null || guard.call(this.graph, e)) &&\n ModifierKey.isMatch(e, this.options.modifiers)) {\n const factor = this.options.factor || 1.2;\n if (this.currentScale == null) {\n this.startPos = { x: evt.clientX, y: evt.clientY };\n this.currentScale = this.graph.scroller.widget\n ? this.graph.scroller.widget.zoom()\n : this.graph.transform.getScale().sx;\n }\n const delta = evt.deltaY;\n if (delta < 0) {\n // zoomin\n // ------\n // Switches to 1% zoom steps below 15%\n if (this.currentScale < 0.15) {\n this.cumulatedFactor = (this.currentScale + 0.01) / this.currentScale;\n }\n else {\n // Uses to 5% zoom steps for better grid rendering in\n // webkit and to avoid rounding errors for zoom steps\n this.cumulatedFactor =\n Math.round(this.currentScale * factor * 20) / 20 / this.currentScale;\n }\n }\n else {\n // zoomout\n // -------\n // Switches to 1% zoom steps below 15%\n if (this.currentScale <= 0.15) {\n this.cumulatedFactor = (this.currentScale - 0.01) / this.currentScale;\n }\n else {\n // Uses to 5% zoom steps for better grid rendering in\n // webkit and to avoid rounding errors for zoom steps\n this.cumulatedFactor =\n Math.round(this.currentScale * (1 / factor) * 20) /\n 20 /\n this.currentScale;\n }\n }\n this.cumulatedFactor = Math.max(0.01, Math.min(this.currentScale * this.cumulatedFactor, 160) /\n this.currentScale);\n const scroller = this.graph.scroller.widget;\n const currentScale = this.currentScale;\n let targetScale = this.graph.transform.clampScale(currentScale * this.cumulatedFactor);\n const minScale = this.options.minScale || Number.MIN_SAFE_INTEGER;\n const maxScale = this.options.maxScale || Number.MAX_SAFE_INTEGER;\n targetScale = NumberExt.clamp(targetScale, minScale, maxScale);\n if (targetScale !== currentScale) {\n if (scroller) {\n if (this.options.zoomAtMousePosition) {\n const origin = this.graph.coord.clientToLocalPoint(this.startPos);\n scroller.zoom(targetScale, {\n absolute: true,\n center: origin.clone(),\n });\n }\n else {\n scroller.zoom(targetScale, { absolute: true });\n }\n }\n else if (this.options.zoomAtMousePosition) {\n const origin = this.graph.coord.clientToGraphPoint(this.startPos);\n this.graph.zoom(targetScale, {\n absolute: true,\n center: origin.clone(),\n });\n }\n else {\n this.graph.zoom(targetScale, { absolute: true });\n }\n }\n this.currentScale = null;\n this.cumulatedFactor = 1;\n }\n }\n dispose() {\n this.disable();\n }\n}\n__decorate([\n Disposable.dispose()\n], MouseWheel.prototype, \"dispose\", null);\n//# sourceMappingURL=mousewheel.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Rectangle } from '../geometry';\nimport { NumberExt, JQuery, Dom, Unit, Vector } from '../util';\nimport { Base } from './base';\nexport class PrintManager extends Base {\n show(options = {}) {\n const localOptions = Object.assign(Object.assign({}, PrintManager.defaultOptions), options);\n const $pages = this.createPrintPages(localOptions);\n localOptions.ready($pages, ($pages) => this.showPrintWindow($pages, localOptions), {\n sheetSize: this.getSheetSize(localOptions),\n });\n }\n get className() {\n return this.view.prefixClassName('graph-print');\n }\n showPrintWindow($pages, options) {\n if ($pages) {\n const $body = JQuery(document.body);\n const $container = JQuery(this.view.container);\n const bodyClassName = this.view.prefixClassName('graph-printing');\n $body.addClass(bodyClassName);\n const $detached = $container.children().detach();\n $pages.forEach(($page) => {\n $page\n .removeClass(`${this.className}-preview`)\n .addClass(`${this.className}-ready`)\n .appendTo($body);\n });\n let ret = false;\n const cb = () => {\n if (!ret) {\n ret = true;\n $body.removeClass(bodyClassName);\n $pages.forEach(($page) => $page.remove());\n $container.append($detached);\n JQuery(`#${this.styleSheetId}`).remove();\n this.graph.trigger('after:print', options);\n JQuery(window).off('afterprint', cb);\n }\n };\n JQuery(window).one('afterprint', cb);\n setTimeout(cb, 200);\n window.print();\n }\n }\n createPrintPage(pageArea, options) {\n this.graph.trigger('before:print', options);\n const $page = JQuery('<div/>').addClass(this.className);\n const $wrap = JQuery('<div/>')\n .addClass(this.view.prefixClassName('graph-print-inner'))\n .css('position', 'relative');\n if (options.size) {\n $page.addClass(`${this.className}-size-${options.size}`);\n }\n const vSVG = Vector.create(this.view.svg).clone();\n const vStage = vSVG.findOne(`.${this.view.prefixClassName('graph-svg-stage')}`);\n $wrap.append(vSVG.node);\n const sheetSize = this.getSheetSize(options);\n const graphArea = this.graph.transform.getGraphArea();\n const s = this.graph.transform.getScale();\n const ts = this.graph.translate();\n const matrix = Dom.createSVGMatrix().translate(ts.tx / s.sx, ts.ty / s.sy);\n const info = this.getPageInfo(graphArea, pageArea, sheetSize);\n const scale = info.scale;\n const bbox = info.bbox;\n $wrap.css({\n left: 0,\n top: 0,\n });\n vSVG.attr({\n width: bbox.width * scale,\n height: bbox.height * scale,\n style: 'position:relative',\n viewBox: [bbox.x, bbox.y, bbox.width, bbox.height].join(' '),\n });\n vStage.attr('transform', Dom.matrixToTransformString(matrix));\n $page.append($wrap);\n $page.addClass(`${this.className}-preview`);\n return {\n $page,\n sheetSize,\n };\n }\n createPrintPages(options) {\n let ret;\n const area = this.getPrintArea(options);\n const $pages = [];\n if (options.page) {\n const pageSize = this.getPageSize(area, options.page);\n const pageAreas = this.getPageAreas(area, pageSize);\n pageAreas.forEach((pageArea) => {\n ret = this.createPrintPage(pageArea, options);\n $pages.push(ret.$page);\n });\n }\n else {\n ret = this.createPrintPage(area, options);\n $pages.push(ret.$page);\n }\n if (ret) {\n const size = {\n width: ret.sheetSize.cssWidth,\n height: ret.sheetSize.cssHeight,\n };\n this.updatePrintStyle(size, options);\n }\n return $pages;\n }\n get styleSheetId() {\n return this.view.prefixClassName('graph-print-style');\n }\n updatePrintStyle(size, options) {\n const sizeCSS = Object.keys(size).reduce((memo, key) => `${memo} ${key}:${size[key]};`, '');\n const margin = NumberExt.normalizeSides(options.margin);\n const marginUnit = options.marginUnit || '';\n const sheetUnit = options.sheetUnit || '';\n const css = `\n @media print {\n .${this.className}.${this.className}-ready {\n ${sizeCSS}\n }\n\n @page {\n margin:\n ${[\n margin.top + marginUnit,\n margin.right + marginUnit,\n margin.bottom + marginUnit,\n margin.left + marginUnit,\n ].join(' ')};\n size: ${options.sheet.width + sheetUnit} ${options.sheet.height + sheetUnit};\n\n .${this.className}.${this.className}-preview {\n ${sizeCSS}\n }\n }`;\n const id = this.styleSheetId;\n const $style = JQuery(`#${id}`);\n if ($style.length) {\n $style.html(css);\n }\n else {\n JQuery('head').append(`'<style type=\"text/css\" id=\"${id}\">${css}</style>'`);\n }\n }\n getPrintArea(options) {\n let area = options.area;\n if (!area) {\n const padding = NumberExt.normalizeSides(options.padding);\n area = this.graph.getContentArea().moveAndExpand({\n x: -padding.left,\n y: -padding.top,\n width: padding.left + padding.right,\n height: padding.top + padding.bottom,\n });\n }\n return area;\n }\n getPageSize(area, poster) {\n if (typeof poster === 'object') {\n const raw = poster;\n const page = {\n width: raw.width,\n height: raw.height,\n };\n if (page.width == null) {\n page.width = Math.ceil(area.width / (raw.columns || 1));\n }\n if (page.height == null) {\n page.height = Math.ceil(area.height / (raw.rows || 1));\n }\n return page;\n }\n return {\n width: area.width,\n height: area.height,\n };\n }\n getPageAreas(area, pageSize) {\n const pages = [];\n const width = pageSize.width;\n const height = pageSize.height;\n for (let w = 0, n = 0; w < area.height && n < 200; w += height, n += 1) {\n for (let h = 0, m = 0; h < area.width && m < 200; h += width, m += 1) {\n pages.push(new Rectangle(area.x + h, area.y + w, width, height));\n }\n }\n return pages;\n }\n getSheetSize(options) {\n const sheet = options.sheet;\n const margin = NumberExt.normalizeSides(options.margin);\n const marginUnit = options.marginUnit || '';\n const sheetUnit = options.sheetUnit || '';\n const cssWidth = \n // eslint-disable-next-line\n `calc(${sheet.width}${sheetUnit} - ${margin.left + margin.right}${marginUnit})`;\n const cssHeight = \n // eslint-disable-next-line\n `calc(${sheet.height}${sheetUnit} - ${margin.top + margin.bottom}${marginUnit})`;\n const ret = Unit.measure(cssWidth, cssHeight);\n return {\n cssWidth,\n cssHeight,\n width: ret.width,\n height: ret.height,\n };\n }\n getPageInfo(graphArea, pageArea, sheetSize) {\n const bbox = new Rectangle(pageArea.x - graphArea.x, pageArea.y - graphArea.y, pageArea.width, pageArea.height);\n const pageRatio = bbox.width / bbox.height;\n const graphRatio = sheetSize.width / sheetSize.height;\n return {\n bbox,\n scale: graphRatio < pageRatio\n ? sheetSize.width / bbox.width\n : sheetSize.height / bbox.height,\n fitHorizontal: graphRatio < pageRatio,\n };\n }\n dispose() { }\n}\n__decorate([\n Base.dispose()\n], PrintManager.prototype, \"dispose\", null);\n(function (PrintManager) {\n PrintManager.defaultOptions = {\n page: false,\n sheet: {\n width: 210,\n height: 297,\n },\n sheetUnit: 'mm',\n margin: 0.4,\n marginUnit: 'in',\n padding: 5,\n ready: ($pages, readyToPrint) => readyToPrint($pages),\n };\n})(PrintManager || (PrintManager = {}));\n//# sourceMappingURL=print.js.map","import JQuery from 'jquery';\nimport { DataUri, NumberExt, FunctionExt, Vector } from '../util';\nimport { Rectangle } from '../geometry';\nimport { Base } from './base';\nexport class FormatManager extends Base {\n toSVG(callback, options = {}) {\n this.graph.trigger('before:export', options);\n const rawSVG = this.view.svg;\n const vSVG = Vector.create(rawSVG).clone();\n let clonedSVG = vSVG.node;\n const vStage = vSVG.findOne(`.${this.view.prefixClassName('graph-svg-stage')}`);\n const viewBox = options.viewBox || this.graph.graphToLocal(this.graph.getContentBBox());\n const dimension = options.preserveDimensions;\n if (dimension) {\n const size = typeof dimension === 'boolean' ? viewBox : dimension;\n vSVG.attr({\n width: size.width,\n height: size.height,\n });\n }\n vSVG\n .removeAttribute('style')\n .attr('viewBox', [viewBox.x, viewBox.y, viewBox.width, viewBox.height].join(' '));\n vStage.removeAttribute('transform');\n // Stores all the CSS declarations from external stylesheets to the\n // `style` attribute of the SVG document nodes.\n // This is achieved in three steps.\n // -----------------------------------\n // 1. Disabling all the stylesheets in the page and therefore collecting\n // only default style values. This, together with the step 2, makes it\n // possible to discard default CSS property values and store only those\n // that differ.\n //\n // 2. Enabling back all the stylesheets in the page and collecting styles\n // that differ from the default values.\n //\n // 3. Applying the difference between default values and the ones set by\n // custom stylesheets onto the `style` attribute of each of the nodes\n // in SVG.\n if (options.copyStyles !== false) {\n const document = rawSVG.ownerDocument;\n const raws = Array.from(rawSVG.querySelectorAll('*'));\n const clones = Array.from(clonedSVG.querySelectorAll('*'));\n const styleSheetCount = document.styleSheets.length;\n const styleSheetsCopy = [];\n for (let k = styleSheetCount - 1; k >= 0; k -= 1) {\n // There is a bug (bugSS) in Chrome 14 and Safari. When you set\n // `stylesheet.disable = true` it will also remove it from\n // `document.styleSheets`. So we need to store all stylesheets before\n // we disable them. Later on we put them back to `document.styleSheets`\n // if needed.\n // See the bug `https://code.google.com/p/chromium/issues/detail?id=88310`.\n styleSheetsCopy[k] = document.styleSheets[k];\n document.styleSheets[k].disabled = true;\n }\n const defaultComputedStyles = {};\n raws.forEach((elem, index) => {\n const computedStyle = window.getComputedStyle(elem, null);\n // We're making a deep copy of the `computedStyle` so that it's not affected\n // by that next step when all the stylesheets are re-enabled again.\n const defaultComputedStyle = {};\n Object.keys(computedStyle).forEach((property) => {\n defaultComputedStyle[property] =\n computedStyle.getPropertyValue(property);\n });\n defaultComputedStyles[index] = defaultComputedStyle;\n });\n // Copy all stylesheets back\n if (styleSheetCount !== document.styleSheets.length) {\n styleSheetsCopy.forEach((copy, index) => {\n document.styleSheets[index] = copy;\n });\n }\n for (let i = 0; i < styleSheetCount; i += 1) {\n document.styleSheets[i].disabled = false;\n }\n const customStyles = {};\n raws.forEach((elem, index) => {\n const computedStyle = window.getComputedStyle(elem, null);\n const defaultComputedStyle = defaultComputedStyles[index];\n const customStyle = {};\n Object.keys(computedStyle).forEach((property) => {\n if (computedStyle.getPropertyValue(property) !==\n defaultComputedStyle[property]) {\n customStyle[property] = computedStyle.getPropertyValue(property);\n }\n });\n customStyles[index] = customStyle;\n });\n clones.forEach((elem, index) => {\n JQuery(elem).css(customStyles[index]);\n });\n }\n const stylesheet = options.stylesheet;\n if (typeof stylesheet === 'string') {\n const cDATASection = rawSVG\n .ownerDocument.implementation.createDocument(null, 'xml', null)\n .createCDATASection(stylesheet);\n vSVG.prepend(Vector.create('style', {\n type: 'text/css',\n }, [cDATASection]));\n }\n const format = () => {\n const beforeSerialize = options.beforeSerialize;\n if (typeof beforeSerialize === 'function') {\n const ret = FunctionExt.call(beforeSerialize, this.graph, clonedSVG);\n if (ret instanceof SVGSVGElement) {\n clonedSVG = ret;\n }\n }\n const dataUri = new XMLSerializer()\n .serializeToString(clonedSVG)\n .replace(/&nbsp;/g, '\\u00a0');\n this.graph.trigger('after:export', options);\n callback(dataUri);\n };\n if (options.serializeImages) {\n const deferrals = vSVG.find('image').map((vImage) => {\n return new Promise((resolve) => {\n const url = vImage.attr('xlink:href') || vImage.attr('href');\n DataUri.imageToDataUri(url, (err, dataUri) => {\n if (!err && dataUri) {\n vImage.attr('xlink:href', dataUri);\n }\n resolve();\n });\n });\n });\n Promise.all(deferrals).then(format);\n }\n else {\n format();\n }\n }\n toDataURL(callback, options) {\n let viewBox = options.viewBox || this.graph.getContentBBox();\n const padding = NumberExt.normalizeSides(options.padding);\n if (options.width && options.height) {\n if (padding.left + padding.right >= options.width) {\n padding.left = padding.right = 0;\n }\n if (padding.top + padding.bottom >= options.height) {\n padding.top = padding.bottom = 0;\n }\n }\n const expanding = new Rectangle(-padding.left, -padding.top, padding.left + padding.right, padding.top + padding.bottom);\n if (options.width && options.height) {\n const width = viewBox.width + padding.left + padding.right;\n const height = viewBox.height + padding.top + padding.bottom;\n expanding.scale(width / options.width, height / options.height);\n }\n viewBox = Rectangle.create(viewBox).moveAndExpand(expanding);\n const rawSize = typeof options.width === 'number' && typeof options.height === 'number'\n ? { width: options.width, height: options.height }\n : viewBox;\n let scale = options.ratio ? parseFloat(options.ratio) : 1;\n if (!Number.isFinite(scale) || scale === 0) {\n scale = 1;\n }\n const size = {\n width: Math.max(Math.round(rawSize.width * scale), 1),\n height: Math.max(Math.round(rawSize.height * scale), 1),\n };\n {\n const imgDataCanvas = document.createElement('canvas');\n const context2D = imgDataCanvas.getContext('2d');\n imgDataCanvas.width = size.width;\n imgDataCanvas.height = size.height;\n const x = size.width - 1;\n const y = size.height - 1;\n context2D.fillStyle = 'rgb(1,1,1)';\n context2D.fillRect(x, y, 1, 1);\n const data = context2D.getImageData(x, y, 1, 1).data;\n if (data[0] !== 1 || data[1] !== 1 || data[2] !== 1) {\n throw new Error('size exceeded');\n }\n }\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = size.width;\n canvas.height = size.height;\n const context = canvas.getContext('2d');\n context.fillStyle = options.backgroundColor || 'white';\n context.fillRect(0, 0, size.width, size.height);\n try {\n context.drawImage(img, 0, 0, size.width, size.height);\n const dataUri = canvas.toDataURL(options.type, options.quality);\n callback(dataUri);\n }\n catch (error) {\n // pass\n }\n };\n this.toSVG((dataUri) => {\n img.src = `data:image/svg+xml,${encodeURIComponent(dataUri)}`;\n }, Object.assign(Object.assign({}, options), { viewBox, serializeImages: true, preserveDimensions: Object.assign({}, size) }));\n }\n toPNG(callback, options = {}) {\n this.toDataURL(callback, Object.assign(Object.assign({}, options), { type: 'image/png' }));\n }\n toJPEG(callback, options = {}) {\n this.toDataURL(callback, Object.assign(Object.assign({}, options), { type: 'image/jpeg' }));\n }\n}\n//# sourceMappingURL=format.js.map","import { Base } from './base';\nexport class KnobManager extends Base {\n constructor() {\n super(...arguments);\n this.widgets = new Map();\n }\n get isSelectionEnabled() {\n return this.options.selecting.enabled === true;\n }\n init() {\n this.startListening();\n }\n startListening() {\n this.graph.on('node:mouseup', this.onNodeMouseUp, this);\n this.graph.on('node:selected', this.onNodeSelected, this);\n this.graph.on('node:unselected', this.onNodeUnSelected, this);\n }\n stopListening() {\n this.graph.off('node:mouseup', this.onNodeMouseUp, this);\n this.graph.off('node:selected', this.onNodeSelected, this);\n this.graph.off('node:unselected', this.onNodeUnSelected, this);\n }\n onNodeMouseUp({ node }) {\n if (!this.isSelectionEnabled) {\n const widgets = this.graph.hook.createKnob(node, { clearAll: true });\n if (widgets) {\n this.widgets.set(node, widgets);\n }\n }\n }\n onNodeSelected({ node }) {\n if (this.isSelectionEnabled) {\n const widgets = this.graph.hook.createKnob(node, { clearAll: false });\n if (widgets) {\n this.widgets.set(node, widgets);\n }\n }\n }\n onNodeUnSelected({ node }) {\n if (this.isSelectionEnabled) {\n const widgets = this.widgets.get(node);\n if (widgets) {\n widgets.forEach((widget) => widget.dispose());\n }\n this.widgets.delete(node);\n }\n }\n}\n//# sourceMappingURL=knob.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { ModifierKey } from '../types';\nimport { Dom } from '../util';\nimport { Base } from './base';\nexport class PanningManager extends Base {\n get widgetOptions() {\n return this.options.panning;\n }\n get pannable() {\n return this.widgetOptions && this.widgetOptions.enabled === true;\n }\n init() {\n this.startListening();\n this.updateClassName();\n }\n startListening() {\n const eventTypes = this.widgetOptions.eventTypes;\n if (!eventTypes) {\n return;\n }\n if (eventTypes.includes('leftMouseDown')) {\n this.graph.on('blank:mousedown', this.preparePanning, this);\n this.graph.on('node:unhandled:mousedown', this.preparePanning, this);\n this.graph.on('edge:unhandled:mousedown', this.preparePanning, this);\n }\n if (eventTypes.includes('rightMouseDown')) {\n this.onRightMouseDown = this.onRightMouseDown.bind(this);\n this.view.$(this.graph.container).on('mousedown', this.onRightMouseDown);\n }\n if (eventTypes.includes('mouseWheel')) {\n this.mousewheelHandle = new Dom.MouseWheelHandle(this.graph.container, this.onMouseWheel.bind(this), this.allowMouseWheel.bind(this));\n this.mousewheelHandle.enable();\n }\n }\n stopListening() {\n const eventTypes = this.widgetOptions.eventTypes;\n if (!eventTypes) {\n return;\n }\n if (eventTypes.includes('leftMouseDown')) {\n this.graph.off('blank:mousedown', this.preparePanning, this);\n this.graph.off('node:unhandled:mousedown', this.preparePanning, this);\n this.graph.off('edge:unhandled:mousedown', this.preparePanning, this);\n }\n if (eventTypes.includes('rightMouseDown')) {\n this.view.$(this.graph.container).off('mousedown', this.onRightMouseDown);\n }\n if (eventTypes.includes('mouseWheel')) {\n if (this.mousewheelHandle) {\n this.mousewheelHandle.disable();\n }\n }\n }\n preparePanning({ e }) {\n if (this.allowPanning(e, true) ||\n (this.allowPanning(e) && !this.graph.selection.allowRubberband(e, true))) {\n this.startPanning(e);\n }\n }\n allowPanning(e, strict) {\n return (this.pannable &&\n ModifierKey.isMatch(e, this.widgetOptions.modifiers, strict) &&\n this.graph.hook.allowPanning(e));\n }\n startPanning(evt) {\n const e = this.view.normalizeEvent(evt);\n this.clientX = e.clientX;\n this.clientY = e.clientY;\n this.panning = true;\n this.updateClassName();\n this.view.$(document.body).on({\n 'mousemove.panning touchmove.panning': this.pan.bind(this),\n 'mouseup.panning touchend.panning': this.stopPanning.bind(this),\n 'mouseleave.panning': this.stopPanning.bind(this),\n });\n this.view.$(window).on('mouseup.panning', this.stopPanning.bind(this));\n }\n pan(evt) {\n const e = this.view.normalizeEvent(evt);\n const dx = e.clientX - this.clientX;\n const dy = e.clientY - this.clientY;\n this.clientX = e.clientX;\n this.clientY = e.clientY;\n this.graph.translateBy(dx, dy);\n }\n // eslint-disable-next-line\n stopPanning(e) {\n this.panning = false;\n this.updateClassName();\n this.view.$(document.body).off('.panning');\n this.view.$(window).off('.panning');\n }\n updateClassName() {\n const container = this.view.container;\n const panning = this.view.prefixClassName('graph-panning');\n const pannable = this.view.prefixClassName('graph-pannable');\n if (this.pannable) {\n if (this.panning) {\n Dom.addClass(container, panning);\n Dom.removeClass(container, pannable);\n }\n else {\n Dom.removeClass(container, panning);\n Dom.addClass(container, pannable);\n }\n }\n else {\n Dom.removeClass(container, panning);\n Dom.removeClass(container, pannable);\n }\n }\n onRightMouseDown(e) {\n if (e.button === 2 && this.allowPanning(e, true)) {\n this.startPanning(e);\n }\n }\n allowMouseWheel(e) {\n return this.pannable && !e.ctrlKey;\n }\n onMouseWheel(e, deltaX, deltaY) {\n if (!e.ctrlKey) {\n this.graph.translateBy(-deltaX, -deltaY);\n }\n }\n autoPanning(x, y) {\n const buffer = 10;\n const graphArea = this.graph.getGraphArea();\n let dx = 0;\n let dy = 0;\n if (x <= graphArea.left + buffer) {\n dx = -buffer;\n }\n if (y <= graphArea.top + buffer) {\n dy = -buffer;\n }\n if (x >= graphArea.right - buffer) {\n dx = buffer;\n }\n if (y >= graphArea.bottom - buffer) {\n dy = buffer;\n }\n if (dx !== 0 || dy !== 0) {\n this.graph.translateBy(-dx, -dy);\n }\n }\n enablePanning() {\n if (!this.pannable) {\n this.widgetOptions.enabled = true;\n this.updateClassName();\n }\n }\n disablePanning() {\n if (this.pannable) {\n this.widgetOptions.enabled = false;\n this.updateClassName();\n }\n }\n dispose() {\n this.stopListening();\n }\n}\n__decorate([\n Base.dispose()\n], PanningManager.prototype, \"dispose\", null);\n//# sourceMappingURL=panning.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Base } from './base';\nimport { SizeSensor } from '../util';\nexport class SizeManager extends Base {\n hasScroller() {\n return this.graph.scroller.widget != null;\n }\n getContainer() {\n return this.hasScroller()\n ? this.graph.scroller.widget.container\n : this.graph.container;\n }\n init() {\n const autoResize = this.options.autoResize;\n if (autoResize) {\n const target = typeof autoResize === 'boolean'\n ? this.getContainer()\n : autoResize;\n SizeSensor.bind(target, () => {\n const container = this.getContainer();\n // container is border-box\n const width = container.offsetWidth;\n const height = container.offsetHeight;\n this.resize(width, height);\n });\n }\n }\n resize(width, height) {\n if (this.hasScroller()) {\n this.resizeScroller(width, height);\n }\n else {\n this.resizeGraph(width, height);\n }\n }\n resizeGraph(width, height) {\n this.graph.transform.resize(width, height);\n }\n resizeScroller(width, height) {\n this.graph.scroller.resize(width, height);\n }\n resizePage(width, height) {\n const instance = this.graph.scroller.widget;\n if (instance) {\n instance.updatePageSize(width, height);\n }\n }\n dispose() {\n SizeSensor.clear(this.getContainer());\n }\n}\n__decorate([\n Base.dispose()\n], SizeManager.prototype, \"dispose\", null);\n//# sourceMappingURL=size.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { FunctionExt, ObjectExt } from '../util';\nimport { Model } from '../model/model';\nimport { CellView } from '../view/cell';\nimport { NodeView } from '../view/node';\nimport { EdgeView } from '../view/edge';\nimport { Knob } from '../addon/knob';\nimport { MiniMap } from '../addon/minimap';\nimport { Snapline } from '../addon/snapline';\nimport { Scroller } from '../addon/scroller';\nimport { Selection } from '../addon/selection';\nimport { Clipboard } from '../addon/clipboard';\nimport { Transform } from '../addon/transform';\nimport { HTML } from '../shape/standard/html';\nimport { Edge as StandardEdge } from '../shape/standard/edge';\nimport { Base } from './base';\nimport { Options } from './options';\nimport { Renderer } from './renderer';\nimport { GraphView } from './view';\nimport { DefsManager } from './defs';\nimport { GridManager } from './grid';\nimport { CoordManager } from './coord';\nimport { SnaplineManager } from './snapline';\nimport { ScrollerManager } from './scroller';\nimport { ClipboardManager } from './clipboard';\nimport { HighlightManager } from './highlight';\nimport { TransformManager } from './transform';\nimport { SelectionManager } from './selection';\nimport { BackgroundManager } from './background';\nimport { HistoryManager } from './history';\nimport { MiniMapManager } from './minimap';\nimport { Keyboard } from './keyboard';\nimport { MouseWheel } from './mousewheel';\nimport { PrintManager } from './print';\nimport { FormatManager } from './format';\nimport { KnobManager } from './knob';\nimport { PanningManager } from './panning';\nimport { SizeManager } from './size';\nvar Decorator;\n(function (Decorator) {\n function hook(nullable, hookName) {\n return (target, methodName, descriptor) => {\n const raw = descriptor.value;\n const name = hookName || methodName;\n descriptor.value = function (...args) {\n const hook = this.options[name];\n if (hook != null) {\n this.getNativeValue = raw.bind(this, ...args);\n const ret = FunctionExt.call(hook, this.graph, ...args);\n this.getNativeValue = null;\n if (ret != null || (nullable === true && ret === null)) {\n return ret;\n }\n }\n return raw.call(this, ...args);\n };\n };\n }\n Decorator.hook = hook;\n function after(hookName) {\n return (target, methodName, descriptor) => {\n const raw = descriptor.value;\n const name = hookName || methodName;\n descriptor.value = function (...args) {\n let ret = raw.call(this, ...args);\n const hook = this.options[name];\n if (hook != null) {\n ret = FunctionExt.call(hook, this.graph, ...args) && ret;\n }\n return ret;\n };\n };\n }\n Decorator.after = after;\n})(Decorator || (Decorator = {}));\nexport class Hook extends Base {\n createModel() {\n if (this.options.model) {\n return this.options.model;\n }\n const model = new Model();\n model.graph = this.graph;\n return model;\n }\n createView() {\n return new GraphView(this.graph);\n }\n createRenderer() {\n return new Renderer(this.graph);\n }\n createDefsManager() {\n return new DefsManager(this.graph);\n }\n createGridManager() {\n return new GridManager(this.graph);\n }\n createCoordManager() {\n return new CoordManager(this.graph);\n }\n createKnobManager() {\n return new KnobManager(this.graph);\n }\n createTransform(node, widgetOptions) {\n const options = this.getTransformOptions(node);\n if (options.resizable || options.rotatable) {\n return new Transform(Object.assign(Object.assign({ node, graph: this.graph }, options), widgetOptions));\n }\n if (options.clearAll) {\n Transform.removeInstances(this.graph);\n }\n return null;\n }\n createKnob(node, widgetOptions) {\n const options = Options.parseOptionGroup(this.graph, node, this.options.knob);\n const localOptions = Object.assign(Object.assign({}, options), widgetOptions);\n if (localOptions.clearAll) {\n Knob.removeInstances(this.graph);\n }\n localOptions.clearAll = false;\n const knob = node.prop('knob');\n const widgets = [];\n const meta = Array.isArray(knob) ? knob : [knob];\n meta.forEach((knob, index) => {\n if (knob) {\n if (knob.enabled === false) {\n return;\n }\n if (typeof knob.enabled === 'function' &&\n knob.enabled.call(this.graph, node) === false) {\n return;\n }\n }\n else {\n return;\n }\n if (options.enabled) {\n widgets.push(new Knob(Object.assign({ node,\n index, graph: this.graph }, localOptions)));\n }\n });\n return widgets;\n }\n getTransformOptions(node) {\n const resizing = Options.parseOptionGroup(this.graph, node, this.options.resizing);\n const rotating = Options.parseOptionGroup(this.graph, node, this.options.rotating);\n const transforming = Options.parseOptionGroup(this.graph, node, this.options.transforming);\n const options = Object.assign(Object.assign({}, transforming), { resizable: resizing.enabled, minWidth: resizing.minWidth, maxWidth: resizing.maxWidth, minHeight: resizing.minHeight, maxHeight: resizing.maxHeight, orthogonalResizing: resizing.orthogonal, restrictedResizing: resizing.restrict != null ? resizing.restrict : resizing.restricted, autoScrollOnResizing: resizing.autoScroll, preserveAspectRatio: resizing.preserveAspectRatio, allowReverse: resizing.allowReverse, rotatable: rotating.enabled, rotateGrid: rotating.grid });\n return options;\n }\n createTransformManager() {\n return new TransformManager(this.graph);\n }\n createHighlightManager() {\n return new HighlightManager(this.graph);\n }\n createBackgroundManager() {\n return new BackgroundManager(this.graph);\n }\n createClipboard() {\n return new Clipboard();\n }\n createClipboardManager() {\n return new ClipboardManager(this.graph);\n }\n createSnapline() {\n return new Snapline(Object.assign({ graph: this.graph }, this.options.snapline));\n }\n createSnaplineManager() {\n return new SnaplineManager(this.graph);\n }\n createSelection() {\n return new Selection(Object.assign({ graph: this.graph }, this.options.selecting));\n }\n createSelectionManager() {\n return new SelectionManager(this.graph);\n }\n // eslint-disable-next-line\n allowRubberband(e) {\n return true;\n }\n createHistoryManager() {\n return new HistoryManager(Object.assign({ graph: this.graph }, this.options.history));\n }\n createScroller() {\n if (this.options.scroller.enabled) {\n return new Scroller(Object.assign({ graph: this.graph }, this.options.scroller));\n }\n return null;\n }\n createScrollerManager() {\n return new ScrollerManager(this.graph);\n }\n // eslint-disable-next-line\n allowPanning(e) {\n return true;\n }\n createMiniMap() {\n const _a = this.options.minimap, { enabled } = _a, options = __rest(_a, [\"enabled\"]);\n if (enabled) {\n return new MiniMap(Object.assign({ graph: this.graph }, options));\n }\n return null;\n }\n createMiniMapManager() {\n return new MiniMapManager(this.graph);\n }\n createKeyboard() {\n return new Keyboard(Object.assign({ graph: this.graph }, this.options.keyboard));\n }\n createMouseWheel() {\n return new MouseWheel(Object.assign({ graph: this.graph }, this.options.mousewheel));\n }\n createPrintManager() {\n return new PrintManager(this.graph);\n }\n createFormatManager() {\n return new FormatManager(this.graph);\n }\n createPanningManager() {\n return new PanningManager(this.graph);\n }\n createSizeManager() {\n return new SizeManager(this.graph);\n }\n allowConnectToBlank(edge) {\n const options = this.options.connecting;\n const allowBlank = options.allowBlank != null ? options.allowBlank : options.dangling;\n if (typeof allowBlank !== 'function') {\n return !!allowBlank;\n }\n const edgeView = this.graph.findViewByCell(edge);\n const sourceCell = edge.getSourceCell();\n const targetCell = edge.getTargetCell();\n const sourceView = this.graph.findViewByCell(sourceCell);\n const targetView = this.graph.findViewByCell(targetCell);\n return FunctionExt.call(allowBlank, this.graph, {\n edge,\n edgeView,\n sourceCell,\n targetCell,\n sourceView,\n targetView,\n sourcePort: edge.getSourcePortId(),\n targetPort: edge.getTargetPortId(),\n sourceMagnet: edgeView.sourceMagnet,\n targetMagnet: edgeView.targetMagnet,\n });\n }\n validateEdge(edge, type, initialTerminal) {\n if (!this.allowConnectToBlank(edge)) {\n const sourceId = edge.getSourceCellId();\n const targetId = edge.getTargetCellId();\n if (!(sourceId && targetId)) {\n return false;\n }\n }\n const validate = this.options.connecting.validateEdge;\n if (validate) {\n return FunctionExt.call(validate, this.graph, {\n edge,\n type,\n previous: initialTerminal,\n });\n }\n return true;\n }\n validateMagnet(cellView, magnet, e) {\n if (magnet.getAttribute('magnet') !== 'passive') {\n const validate = this.options.connecting.validateMagnet;\n if (validate) {\n return FunctionExt.call(validate, this.graph, {\n e,\n magnet,\n view: cellView,\n cell: cellView.cell,\n });\n }\n return true;\n }\n return false;\n }\n getDefaultEdge(sourceView, sourceMagnet) {\n let edge;\n const create = this.options.connecting.createEdge;\n if (create) {\n edge = FunctionExt.call(create, this.graph, {\n sourceMagnet,\n sourceView,\n sourceCell: sourceView.cell,\n });\n }\n if (edge == null) {\n edge = new StandardEdge();\n }\n return edge;\n }\n validateConnection(sourceView, sourceMagnet, targetView, targetMagnet, terminalType, edgeView, candidateTerminal) {\n const options = this.options.connecting;\n const allowLoop = options.allowLoop;\n const allowNode = options.allowNode;\n const allowEdge = options.allowEdge;\n const allowPort = options.allowPort;\n const allowMulti = options.allowMulti != null ? options.allowMulti : options.multi;\n const validate = options.validateConnection;\n const edge = edgeView ? edgeView.cell : null;\n const terminalView = terminalType === 'target' ? targetView : sourceView;\n const terminalMagnet = terminalType === 'target' ? targetMagnet : sourceMagnet;\n let valid = true;\n const doValidate = (validate) => {\n const sourcePort = terminalType === 'source'\n ? candidateTerminal\n ? candidateTerminal.port\n : null\n : edge\n ? edge.getSourcePortId()\n : null;\n const targetPort = terminalType === 'target'\n ? candidateTerminal\n ? candidateTerminal.port\n : null\n : edge\n ? edge.getTargetPortId()\n : null;\n return FunctionExt.call(validate, this.graph, {\n edge,\n edgeView,\n sourceView,\n targetView,\n sourcePort,\n targetPort,\n sourceMagnet,\n targetMagnet,\n sourceCell: sourceView ? sourceView.cell : null,\n targetCell: targetView ? targetView.cell : null,\n type: terminalType,\n });\n };\n if (allowLoop != null) {\n if (typeof allowLoop === 'boolean') {\n if (!allowLoop && sourceView === targetView) {\n valid = false;\n }\n }\n else {\n valid = doValidate(allowLoop);\n }\n }\n if (valid && allowPort != null) {\n if (typeof allowPort === 'boolean') {\n if (!allowPort && terminalMagnet) {\n valid = false;\n }\n }\n else {\n valid = doValidate(allowPort);\n }\n }\n if (valid && allowEdge != null) {\n if (typeof allowEdge === 'boolean') {\n if (!allowEdge && EdgeView.isEdgeView(terminalView)) {\n valid = false;\n }\n }\n else {\n valid = doValidate(allowEdge);\n }\n }\n if (valid && allowNode != null) {\n if (typeof allowNode === 'boolean') {\n if (!allowNode && terminalView != null) {\n if (NodeView.isNodeView(terminalView) && terminalMagnet == null) {\n valid = false;\n }\n }\n }\n else {\n valid = doValidate(allowNode);\n }\n }\n if (valid && allowMulti != null && edgeView) {\n const edge = edgeView.cell;\n const source = terminalType === 'source'\n ? candidateTerminal\n : edge.getSource();\n const target = terminalType === 'target'\n ? candidateTerminal\n : edge.getTarget();\n const terminalCell = candidateTerminal\n ? this.graph.getCellById(candidateTerminal.cell)\n : null;\n if (source && target && source.cell && target.cell && terminalCell) {\n if (typeof allowMulti === 'function') {\n valid = doValidate(allowMulti);\n }\n else {\n const connectedEdges = this.model.getConnectedEdges(terminalCell, {\n outgoing: terminalType === 'source',\n incoming: terminalType === 'target',\n });\n if (connectedEdges.length) {\n if (allowMulti === 'withPort') {\n const exist = connectedEdges.some((link) => {\n const s = link.getSource();\n const t = link.getTarget();\n return (s &&\n t &&\n s.cell === source.cell &&\n t.cell === target.cell &&\n s.port != null &&\n s.port === source.port &&\n t.port != null &&\n t.port === target.port);\n });\n if (exist) {\n valid = false;\n }\n }\n else if (!allowMulti) {\n const exist = connectedEdges.some((link) => {\n const s = link.getSource();\n const t = link.getTarget();\n return (s && t && s.cell === source.cell && t.cell === target.cell);\n });\n if (exist) {\n valid = false;\n }\n }\n }\n }\n }\n }\n if (valid && validate != null) {\n valid = doValidate(validate);\n }\n return valid;\n }\n getRestrictArea(view) {\n const restrict = this.options.translating.restrict;\n const area = typeof restrict === 'function'\n ? FunctionExt.call(restrict, this.graph, view)\n : restrict;\n if (typeof area === 'number') {\n return this.graph.transform.getGraphArea().inflate(area);\n }\n if (area === true) {\n return this.graph.transform.getGraphArea();\n }\n return area || null;\n }\n onViewUpdated(view, flag, options) {\n if (flag & Renderer.FLAG_INSERT || options.mounting) {\n return;\n }\n this.graph.renderer.requestConnectedEdgesUpdate(view, options);\n }\n onViewPostponed(view, flag, options) {\n return this.graph.renderer.forcePostponedViewUpdate(view, flag);\n }\n getCellView(cell) {\n return null;\n }\n createCellView(cell) {\n const options = { graph: this.graph };\n const ctor = this.getCellView(cell);\n if (ctor) {\n return new ctor(cell, options); // eslint-disable-line new-cap\n }\n const view = cell.view;\n if (view != null && typeof view === 'string') {\n const def = CellView.registry.get(view);\n if (def) {\n return new def(cell, options); // eslint-disable-line new-cap\n }\n return CellView.registry.onNotFound(view);\n }\n if (cell.isNode()) {\n return new NodeView(cell, options);\n }\n if (cell.isEdge()) {\n return new EdgeView(cell, options);\n }\n return null;\n }\n getHTMLComponent(node) {\n let ret = node.getHTML();\n if (typeof ret === 'string') {\n ret = HTML.componentRegistry.get(ret) || ret;\n }\n if (ObjectExt.isPlainObject(ret)) {\n ret = ret.render;\n }\n if (typeof ret === 'function') {\n return FunctionExt.call(ret, this.graph, node);\n }\n return ret;\n }\n shouldUpdateHTMLComponent(node) {\n let html = node.getHTML();\n if (typeof html === 'string') {\n html = HTML.componentRegistry.get(html) || html;\n }\n if (ObjectExt.isPlainObject(html)) {\n const shouldUpdate = html\n .shouldComponentUpdate;\n if (typeof shouldUpdate === 'function') {\n return FunctionExt.call(shouldUpdate, this.graph, node);\n }\n return !!shouldUpdate;\n }\n return false;\n }\n onEdgeLabelRendered(args) { } // eslint-disable-line\n onPortRendered(args) { } // eslint-disable-line\n onToolItemCreated(args) { } // eslint-disable-line\n}\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createModel\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createView\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createRenderer\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createDefsManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createGridManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createCoordManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createKnobManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createTransform\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createKnob\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createTransformManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createHighlightManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createBackgroundManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createClipboard\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createClipboardManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createSnapline\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createSnaplineManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createSelection\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createSelectionManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"allowRubberband\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createHistoryManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createScroller\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createScrollerManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"allowPanning\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createMiniMap\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createMiniMapManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createKeyboard\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createMouseWheel\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createPrintManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createFormatManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createPanningManager\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"createSizeManager\", null);\n__decorate([\n Decorator.after()\n], Hook.prototype, \"onViewUpdated\", null);\n__decorate([\n Decorator.after()\n], Hook.prototype, \"onViewPostponed\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"getCellView\", null);\n__decorate([\n Decorator.hook(true)\n], Hook.prototype, \"createCellView\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"getHTMLComponent\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"shouldUpdateHTMLComponent\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"onEdgeLabelRendered\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"onPortRendered\", null);\n__decorate([\n Decorator.hook()\n], Hook.prototype, \"onToolItemCreated\", null);\n//# sourceMappingURL=hook.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Basecoat } from '../common';\nimport { Point, Rectangle } from '../geometry';\nimport { Cell } from '../model/cell';\nimport { Node } from '../model/node';\nimport { Edge } from '../model/edge';\nimport { CellView } from '../view/cell';\nimport * as Registry from '../registry';\nimport { HTML } from '../shape/standard/html';\nimport { Base } from './base';\nimport { GraphView } from './view';\nimport { Decorator } from './decorator';\nimport { CSSManager } from './css';\nimport { Hook as HookManager } from './hook';\nimport { Options as GraphOptions } from './options';\nimport { DefsManager as Defs } from './defs';\nimport { GridManager as Grid } from './grid';\nimport { CoordManager as Coord } from './coord';\nimport { Keyboard as Shortcut } from './keyboard';\nimport { PrintManager as Print } from './print';\nimport { MouseWheel as Wheel } from './mousewheel';\nimport { FormatManager as Format } from './format';\nimport { Renderer as ViewRenderer } from './renderer';\nimport { HistoryManager as History } from './history';\nimport { MiniMapManager as MiniMap } from './minimap';\nimport { SnaplineManager as Snapline } from './snapline';\nimport { ScrollerManager as Scroller } from './scroller';\nimport { SelectionManager as Selection } from './selection';\nimport { HighlightManager as Highlight } from './highlight';\nimport { TransformManager as Transform } from './transform';\nimport { ClipboardManager as Clipboard } from './clipboard';\nimport { BackgroundManager as Background } from './background';\nexport class Graph extends Basecoat {\n constructor(options) {\n super();\n this.options = GraphOptions.get(options);\n this.css = new CSSManager(this);\n this.hook = new HookManager(this);\n this.view = this.hook.createView();\n this.defs = this.hook.createDefsManager();\n this.coord = this.hook.createCoordManager();\n this.transform = this.hook.createTransformManager();\n this.knob = this.hook.createKnobManager();\n this.highlight = this.hook.createHighlightManager();\n this.grid = this.hook.createGridManager();\n this.background = this.hook.createBackgroundManager();\n this.model = this.hook.createModel();\n this.renderer = this.hook.createRenderer();\n this.clipboard = this.hook.createClipboardManager();\n this.snapline = this.hook.createSnaplineManager();\n this.selection = this.hook.createSelectionManager();\n this.history = this.hook.createHistoryManager();\n this.scroller = this.hook.createScrollerManager();\n this.minimap = this.hook.createMiniMapManager();\n this.keyboard = this.hook.createKeyboard();\n this.mousewheel = this.hook.createMouseWheel();\n this.print = this.hook.createPrintManager();\n this.format = this.hook.createFormatManager();\n this.panning = this.hook.createPanningManager();\n this.size = this.hook.createSizeManager();\n }\n get container() {\n return this.view.container;\n }\n get [Symbol.toStringTag]() {\n return Graph.toStringTag;\n }\n // #region model\n isNode(cell) {\n return cell.isNode();\n }\n isEdge(cell) {\n return cell.isEdge();\n }\n resetCells(cells, options = {}) {\n this.model.resetCells(cells, options);\n return this;\n }\n clearCells(options = {}) {\n this.model.clear(options);\n return this;\n }\n toJSON(options = {}) {\n return this.model.toJSON(options);\n }\n parseJSON(data) {\n return this.model.parseJSON(data);\n }\n fromJSON(data, options = {}) {\n this.model.fromJSON(data, options);\n return this;\n }\n getCellById(id) {\n return this.model.getCell(id);\n }\n addNode(node, options = {}) {\n return this.model.addNode(node, options);\n }\n addNodes(nodes, options = {}) {\n return this.addCell(nodes.map((node) => (Node.isNode(node) ? node : this.createNode(node))), options);\n }\n createNode(metadata) {\n return this.model.createNode(metadata);\n }\n removeNode(node, options = {}) {\n return this.model.removeCell(node, options);\n }\n addEdge(edge, options = {}) {\n return this.model.addEdge(edge, options);\n }\n addEdges(edges, options = {}) {\n return this.addCell(edges.map((edge) => (Edge.isEdge(edge) ? edge : this.createEdge(edge))), options);\n }\n removeEdge(edge, options = {}) {\n return this.model.removeCell(edge, options);\n }\n createEdge(metadata) {\n return this.model.createEdge(metadata);\n }\n addCell(cell, options = {}) {\n this.model.addCell(cell, options);\n return this;\n }\n removeCell(cell, options = {}) {\n return this.model.removeCell(cell, options);\n }\n removeCells(cells, options = {}) {\n return this.model.removeCells(cells, options);\n }\n removeConnectedEdges(cell, options = {}) {\n return this.model.removeConnectedEdges(cell, options);\n }\n disconnectConnectedEdges(cell, options = {}) {\n this.model.disconnectConnectedEdges(cell, options);\n return this;\n }\n hasCell(cell) {\n return this.model.has(cell);\n }\n /**\n * **Deprecation Notice:** `getCell` is deprecated and will be moved in next\n * major release. Use `getCellById()` instead.\n *\n * @deprecated\n */\n getCell(id) {\n return this.model.getCell(id);\n }\n getCells() {\n return this.model.getCells();\n }\n getCellCount() {\n return this.model.total();\n }\n /**\n * Returns all the nodes in the graph.\n */\n getNodes() {\n return this.model.getNodes();\n }\n /**\n * Returns all the edges in the graph.\n */\n getEdges() {\n return this.model.getEdges();\n }\n /**\n * Returns all outgoing edges for the node.\n */\n getOutgoingEdges(cell) {\n return this.model.getOutgoingEdges(cell);\n }\n /**\n * Returns all incoming edges for the node.\n */\n getIncomingEdges(cell) {\n return this.model.getIncomingEdges(cell);\n }\n /**\n * Returns edges connected with cell.\n */\n getConnectedEdges(cell, options = {}) {\n return this.model.getConnectedEdges(cell, options);\n }\n /**\n * Returns an array of all the roots of the graph.\n */\n getRootNodes() {\n return this.model.getRoots();\n }\n /**\n * Returns an array of all the leafs of the graph.\n */\n getLeafNodes() {\n return this.model.getLeafs();\n }\n /**\n * Returns `true` if the node is a root node, i.e.\n * there is no edges coming to the node.\n */\n isRootNode(cell) {\n return this.model.isRoot(cell);\n }\n /**\n * Returns `true` if the node is a leaf node, i.e.\n * there is no edges going out from the node.\n */\n isLeafNode(cell) {\n return this.model.isLeaf(cell);\n }\n /**\n * Returns all the neighbors of node in the graph. Neighbors are all\n * the nodes connected to node via either incoming or outgoing edge.\n */\n getNeighbors(cell, options = {}) {\n return this.model.getNeighbors(cell, options);\n }\n /**\n * Returns `true` if `cell2` is a neighbor of `cell1`.\n */\n isNeighbor(cell1, cell2, options = {}) {\n return this.model.isNeighbor(cell1, cell2, options);\n }\n getSuccessors(cell, options = {}) {\n return this.model.getSuccessors(cell, options);\n }\n /**\n * Returns `true` if `cell2` is a successor of `cell1`.\n */\n isSuccessor(cell1, cell2, options = {}) {\n return this.model.isSuccessor(cell1, cell2, options);\n }\n getPredecessors(cell, options = {}) {\n return this.model.getPredecessors(cell, options);\n }\n /**\n * Returns `true` if `cell2` is a predecessor of `cell1`.\n */\n isPredecessor(cell1, cell2, options = {}) {\n return this.model.isPredecessor(cell1, cell2, options);\n }\n getCommonAncestor(...cells) {\n return this.model.getCommonAncestor(...cells);\n }\n /**\n * Returns an array of cells that result from finding nodes/edges that\n * are connected to any of the cells in the cells array. This function\n * loops over cells and if the current cell is a edge, it collects its\n * source/target nodes; if it is an node, it collects its incoming and\n * outgoing edges if both the edge terminal (source/target) are in the\n * cells array.\n */\n getSubGraph(cells, options = {}) {\n return this.model.getSubGraph(cells, options);\n }\n /**\n * Clones the whole subgraph (including all the connected links whose\n * source/target is in the subgraph). If `options.deep` is `true`, also\n * take into account all the embedded cells of all the subgraph cells.\n *\n * Returns a map of the form: { [original cell ID]: [clone] }.\n */\n cloneSubGraph(cells, options = {}) {\n return this.model.cloneSubGraph(cells, options);\n }\n cloneCells(cells) {\n return this.model.cloneCells(cells);\n }\n getNodesFromPoint(x, y) {\n return this.model.getNodesFromPoint(x, y);\n }\n getNodesInArea(x, y, w, h, options) {\n return this.model.getNodesInArea(x, y, w, h, options);\n }\n getNodesUnderNode(node, options = {}) {\n return this.model.getNodesUnderNode(node, options);\n }\n searchCell(cell, iterator, options = {}) {\n this.model.search(cell, iterator, options);\n return this;\n }\n /** *\n * Returns an array of IDs of nodes on the shortest\n * path between source and target.\n */\n getShortestPath(source, target, options = {}) {\n return this.model.getShortestPath(source, target, options);\n }\n /**\n * Returns the bounding box that surrounds all cells in the graph.\n */\n getAllCellsBBox() {\n return this.model.getAllCellsBBox();\n }\n /**\n * Returns the bounding box that surrounds all the given cells.\n */\n getCellsBBox(cells, options = {}) {\n return this.model.getCellsBBox(cells, options);\n }\n startBatch(name, data = {}) {\n this.model.startBatch(name, data);\n }\n stopBatch(name, data = {}) {\n this.model.stopBatch(name, data);\n }\n batchUpdate(arg1, arg2, arg3) {\n const name = typeof arg1 === 'string' ? arg1 : 'update';\n const execute = typeof arg1 === 'string' ? arg2 : arg1;\n const data = typeof arg2 === 'function' ? arg3 : arg2;\n this.startBatch(name, data);\n const result = execute();\n this.stopBatch(name, data);\n return result;\n }\n updateCellId(cell, newId) {\n return this.model.updateCellId(cell, newId);\n }\n // #endregion\n // #region view\n isFrozen() {\n return this.renderer.isFrozen();\n }\n freeze(options = {}) {\n this.renderer.freeze(options);\n return this;\n }\n unfreeze(options = {}) {\n this.renderer.unfreeze(options);\n return this;\n }\n isAsync() {\n return this.renderer.isAsync();\n }\n setAsync(async) {\n this.renderer.setAsync(async);\n return this;\n }\n findView(ref) {\n if (Cell.isCell(ref)) {\n return this.findViewByCell(ref);\n }\n return this.findViewByElem(ref);\n }\n findViews(ref) {\n if (Rectangle.isRectangleLike(ref)) {\n return this.findViewsInArea(ref);\n }\n if (Point.isPointLike(ref)) {\n return this.findViewsFromPoint(ref);\n }\n return [];\n }\n findViewByCell(cell) {\n return this.renderer.findViewByCell(cell);\n }\n findViewByElem(elem) {\n return this.renderer.findViewByElem(elem);\n }\n findViewsFromPoint(x, y) {\n const p = typeof x === 'number' ? { x, y: y } : x;\n return this.renderer.findViewsFromPoint(p);\n }\n findViewsInArea(x, y, width, height, options) {\n const rect = typeof x === 'number'\n ? {\n x,\n y: y,\n width: width,\n height: height,\n }\n : x;\n const localOptions = typeof x === 'number'\n ? options\n : y;\n return this.renderer.findViewsInArea(rect, localOptions);\n }\n isViewMounted(view) {\n return this.renderer.isViewMounted(view);\n }\n getMountedViews() {\n return this.renderer.getMountedViews();\n }\n getUnmountedViews() {\n return this.renderer.getUnmountedViews();\n }\n matrix(mat) {\n if (typeof mat === 'undefined') {\n return this.transform.getMatrix();\n }\n this.transform.setMatrix(mat);\n return this;\n }\n resize(width, height) {\n this.size.resize(width, height);\n return this;\n }\n resizeGraph(width, height) {\n this.size.resizeGraph(width, height);\n return this;\n }\n resizeScroller(width, height) {\n this.size.resizeScroller(width, height);\n return this;\n }\n resizePage(width, height) {\n this.size.resizePage(width, height);\n return this;\n }\n scale(sx, sy = sx, cx = 0, cy = 0) {\n if (typeof sx === 'undefined') {\n return this.transform.getScale();\n }\n this.transform.scale(sx, sy, cx, cy);\n return this;\n }\n zoom(factor, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n if (typeof factor === 'undefined') {\n return scroller.zoom();\n }\n scroller.zoom(factor, options);\n }\n else {\n if (typeof factor === 'undefined') {\n return this.transform.getZoom();\n }\n this.transform.zoom(factor, options);\n }\n return this;\n }\n zoomTo(factor, options = {}) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.zoom(factor, Object.assign(Object.assign({}, options), { absolute: true }));\n }\n else {\n this.transform.zoom(factor, Object.assign(Object.assign({}, options), { absolute: true }));\n }\n }\n zoomToRect(rect, options = {}) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.zoomToRect(rect, options);\n }\n else {\n this.transform.zoomToRect(rect, options);\n }\n return this;\n }\n zoomToFit(options = {}) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.zoomToFit(options);\n }\n else {\n this.transform.zoomToFit(options);\n }\n return this;\n }\n rotate(angle, cx, cy) {\n if (typeof angle === 'undefined') {\n return this.transform.getRotation();\n }\n this.transform.rotate(angle, cx, cy);\n return this;\n }\n translate(tx, ty) {\n if (typeof tx === 'undefined') {\n return this.transform.getTranslation();\n }\n this.transform.translate(tx, ty);\n return this;\n }\n translateBy(dx, dy) {\n const ts = this.translate();\n const tx = ts.tx + dx;\n const ty = ts.ty + dy;\n return this.translate(tx, ty);\n }\n /**\n * **Deprecation Notice:** `getArea` is deprecated and will be moved in next\n * major release. Use `getGraphArea()` instead.\n *\n * @deprecated\n */\n getArea() {\n return this.transform.getGraphArea();\n }\n getGraphArea() {\n return this.transform.getGraphArea();\n }\n getContentArea(options = {}) {\n return this.transform.getContentArea(options);\n }\n getContentBBox(options = {}) {\n return this.transform.getContentBBox(options);\n }\n fitToContent(gridWidth, gridHeight, padding, options) {\n return this.transform.fitToContent(gridWidth, gridHeight, padding, options);\n }\n scaleContentToFit(options = {}) {\n this.transform.scaleContentToFit(options);\n return this;\n }\n /**\n * Position the center of graph to the center of the viewport.\n */\n center(optons) {\n return this.centerPoint(optons);\n }\n centerPoint(x, y, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.centerPoint(x, y, options);\n }\n else {\n this.transform.centerPoint(x, y);\n }\n return this;\n }\n centerContent(options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.centerContent(options);\n }\n else {\n this.transform.centerContent(options);\n }\n return this;\n }\n centerCell(cell, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.centerCell(cell, options);\n }\n else {\n this.transform.centerCell(cell);\n }\n return this;\n }\n positionPoint(point, x, y, options = {}) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.positionPoint(point, x, y, options);\n }\n else {\n this.transform.positionPoint(point, x, y);\n }\n return this;\n }\n positionRect(rect, direction, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.positionRect(rect, direction, options);\n }\n else {\n this.transform.positionRect(rect, direction);\n }\n return this;\n }\n positionCell(cell, direction, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.positionCell(cell, direction, options);\n }\n else {\n this.transform.positionCell(cell, direction);\n }\n return this;\n }\n positionContent(pos, options) {\n const scroller = this.scroller.widget;\n if (scroller) {\n scroller.positionContent(pos, options);\n }\n else {\n this.transform.positionContent(pos, options);\n }\n return this;\n }\n // #endregion\n // #region coord\n getClientMatrix() {\n return this.coord.getClientMatrix();\n }\n /**\n * Returns coordinates of the graph viewport, relative to the window.\n */\n getClientOffset() {\n return this.coord.getClientOffset();\n }\n /**\n * Returns coordinates of the graph viewport, relative to the document.\n */\n getPageOffset() {\n return this.coord.getPageOffset();\n }\n snapToGrid(x, y) {\n return this.coord.snapToGrid(x, y);\n }\n pageToLocal(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.pageToLocalRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.pageToLocalRect(x, y, width, height);\n }\n return this.coord.pageToLocalPoint(x, y);\n }\n localToPage(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.localToPageRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.localToPageRect(x, y, width, height);\n }\n return this.coord.localToPagePoint(x, y);\n }\n clientToLocal(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.clientToLocalRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.clientToLocalRect(x, y, width, height);\n }\n return this.coord.clientToLocalPoint(x, y);\n }\n localToClient(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.localToClientRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.localToClientRect(x, y, width, height);\n }\n return this.coord.localToClientPoint(x, y);\n }\n localToGraph(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.localToGraphRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.localToGraphRect(x, y, width, height);\n }\n return this.coord.localToGraphPoint(x, y);\n }\n graphToLocal(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.graphToLocalRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.graphToLocalRect(x, y, width, height);\n }\n return this.coord.graphToLocalPoint(x, y);\n }\n clientToGraph(x, y, width, height) {\n if (Rectangle.isRectangleLike(x)) {\n return this.coord.clientToGraphRect(x);\n }\n if (typeof x === 'number' &&\n typeof y === 'number' &&\n typeof width === 'number' &&\n typeof height === 'number') {\n return this.coord.clientToGraphRect(x, y, width, height);\n }\n return this.coord.clientToGraphPoint(x, y);\n }\n // #endregion\n // #region defs\n defineFilter(options) {\n return this.defs.filter(options);\n }\n defineGradient(options) {\n return this.defs.gradient(options);\n }\n defineMarker(options) {\n return this.defs.marker(options);\n }\n // #endregion\n // #region grid\n getGridSize() {\n return this.grid.getGridSize();\n }\n setGridSize(gridSize) {\n this.grid.setGridSize(gridSize);\n return this;\n }\n showGrid() {\n this.grid.show();\n return this;\n }\n hideGrid() {\n this.grid.hide();\n return this;\n }\n clearGrid() {\n this.grid.clear();\n return this;\n }\n drawGrid(options) {\n this.grid.draw(options);\n return this;\n }\n // #endregion\n // #region background\n updateBackground() {\n this.background.update();\n return this;\n }\n drawBackground(options, onGraph) {\n const scroller = this.scroller.widget;\n if (scroller != null && (this.options.background == null || !onGraph)) {\n scroller.backgroundManager.draw(options);\n }\n else {\n this.background.draw(options);\n }\n return this;\n }\n clearBackground(onGraph) {\n const scroller = this.scroller.widget;\n if (scroller != null && (this.options.background == null || !onGraph)) {\n scroller.backgroundManager.clear();\n }\n else {\n this.background.clear();\n }\n return this;\n }\n // #endregion\n // #region clipboard\n isClipboardEnabled() {\n return !this.clipboard.disabled;\n }\n enableClipboard() {\n this.clipboard.enable();\n return this;\n }\n disableClipboard() {\n this.clipboard.disable();\n return this;\n }\n toggleClipboard(enabled) {\n if (enabled != null) {\n if (enabled !== this.isClipboardEnabled()) {\n if (enabled) {\n this.enableClipboard();\n }\n else {\n this.disableClipboard();\n }\n }\n }\n else if (this.isClipboardEnabled()) {\n this.disableClipboard();\n }\n else {\n this.enableClipboard();\n }\n return this;\n }\n isClipboardEmpty() {\n return this.clipboard.isEmpty();\n }\n getCellsInClipboard() {\n return this.clipboard.cells;\n }\n cleanClipboard() {\n this.clipboard.clean();\n return this;\n }\n copy(cells, options = {}) {\n this.clipboard.copy(cells, options);\n return this;\n }\n cut(cells, options = {}) {\n this.clipboard.cut(cells, options);\n return this;\n }\n paste(options = {}, graph = this) {\n return this.clipboard.paste(options, graph);\n }\n // #endregion\n // #region redo/undo\n isHistoryEnabled() {\n return !this.history.disabled;\n }\n enableHistory() {\n this.history.enable();\n return this;\n }\n disableHistory() {\n this.history.disable();\n return this;\n }\n toggleHistory(enabled) {\n if (enabled != null) {\n if (enabled !== this.isHistoryEnabled()) {\n if (enabled) {\n this.enableHistory();\n }\n else {\n this.disableHistory();\n }\n }\n }\n else if (this.isHistoryEnabled()) {\n this.disableHistory();\n }\n else {\n this.enableHistory();\n }\n return this;\n }\n undo(options = {}) {\n this.history.undo(options);\n return this;\n }\n undoAndCancel(options = {}) {\n this.history.cancel(options);\n return this;\n }\n redo(options = {}) {\n this.history.redo(options);\n return this;\n }\n canUndo() {\n return this.history.canUndo();\n }\n canRedo() {\n return this.history.canRedo();\n }\n cleanHistory(options = {}) {\n this.history.clean(options);\n }\n // #endregion\n // #region keyboard\n isKeyboardEnabled() {\n return !this.keyboard.disabled;\n }\n enableKeyboard() {\n this.keyboard.enable();\n return this;\n }\n disableKeyboard() {\n this.keyboard.disable();\n return this;\n }\n toggleKeyboard(enabled) {\n if (enabled != null) {\n if (enabled !== this.isKeyboardEnabled()) {\n if (enabled) {\n this.enableKeyboard();\n }\n else {\n this.disableKeyboard();\n }\n }\n }\n else if (this.isKeyboardEnabled()) {\n this.disableKeyboard();\n }\n else {\n this.enableKeyboard();\n }\n return this;\n }\n bindKey(keys, callback, action) {\n this.keyboard.on(keys, callback, action);\n return this;\n }\n unbindKey(keys, action) {\n this.keyboard.off(keys, action);\n return this;\n }\n // #endregion\n // #region mousewheel\n isMouseWheelEnabled() {\n return !this.mousewheel.disabled;\n }\n enableMouseWheel() {\n this.mousewheel.enable();\n return this;\n }\n disableMouseWheel() {\n this.mousewheel.disable();\n return this;\n }\n toggleMouseWheel(enabled) {\n if (enabled == null) {\n if (this.isMouseWheelEnabled()) {\n this.disableMouseWheel();\n }\n else {\n this.enableMouseWheel();\n }\n }\n else if (enabled) {\n this.enableMouseWheel();\n }\n else {\n this.disableMouseWheel();\n }\n return this;\n }\n // #endregion\n // #region panning\n isPannable() {\n const scroller = this.scroller.widget;\n if (scroller) {\n return this.scroller.pannable;\n }\n return this.panning.pannable;\n }\n enablePanning() {\n const scroller = this.scroller.widget;\n if (scroller) {\n this.scroller.enablePanning();\n }\n else {\n this.panning.enablePanning();\n }\n return this;\n }\n disablePanning() {\n const scroller = this.scroller.widget;\n if (scroller) {\n this.scroller.disablePanning();\n }\n else {\n this.panning.disablePanning();\n }\n return this;\n }\n togglePanning(pannable) {\n if (pannable == null) {\n if (this.isPannable()) {\n this.disablePanning();\n }\n else {\n this.enablePanning();\n }\n }\n else if (pannable !== this.isPannable()) {\n if (pannable) {\n this.enablePanning();\n }\n else {\n this.disablePanning();\n }\n }\n return this;\n }\n // #endregion\n // #region scroller\n lockScroller() {\n var _a;\n (_a = this.scroller.widget) === null || _a === void 0 ? void 0 : _a.lock();\n }\n unlockScroller() {\n var _a;\n (_a = this.scroller.widget) === null || _a === void 0 ? void 0 : _a.unlock();\n }\n updateScroller() {\n var _a;\n (_a = this.scroller.widget) === null || _a === void 0 ? void 0 : _a.update();\n }\n getScrollbarPosition() {\n const scroller = this.scroller.widget;\n return scroller.scrollbarPosition();\n }\n setScrollbarPosition(left, top, options) {\n const scroller = this.scroller.widget;\n scroller.scrollbarPosition(left, top, options);\n return this;\n }\n /**\n * Try to scroll to ensure that the position (x,y) on the graph (in local\n * coordinates) is at the center of the viewport. If only one of the\n * coordinates is specified, only scroll in the specified dimension and\n * keep the other coordinate unchanged.\n */\n scrollToPoint(x, y, options) {\n const scroller = this.scroller.widget;\n scroller.scrollToPoint(x, y, options);\n return this;\n }\n /**\n * Try to scroll to ensure that the center of graph content is at the\n * center of the viewport.\n */\n scrollToContent(options) {\n const scroller = this.scroller.widget;\n scroller.scrollToContent(options);\n return this;\n }\n /**\n * Try to scroll to ensure that the center of cell is at the center of\n * the viewport.\n */\n scrollToCell(cell, options) {\n const scroller = this.scroller.widget;\n scroller.scrollToCell(cell, options);\n return this;\n }\n transitionToPoint(x, y, options) {\n const scroller = this.scroller.widget;\n scroller.transitionToPoint(x, y, options);\n return this;\n }\n transitionToRect(rect, options = {}) {\n const scroller = this.scroller.widget;\n scroller.transitionToRect(rect, options);\n return this;\n }\n // #endregion\n // #region selection\n isSelectionEnabled() {\n return !this.selection.disabled;\n }\n enableSelection() {\n this.selection.enable();\n return this;\n }\n disableSelection() {\n this.selection.disable();\n return this;\n }\n toggleSelection(enabled) {\n if (enabled != null) {\n if (enabled !== this.isSelectionEnabled()) {\n if (enabled) {\n this.enableSelection();\n }\n else {\n this.disableSelection();\n }\n }\n }\n else if (this.isSelectionEnabled()) {\n this.disableSelection();\n }\n else {\n this.enableSelection();\n }\n return this;\n }\n isMultipleSelection() {\n return this.selection.isMultiple();\n }\n enableMultipleSelection() {\n this.selection.enableMultiple();\n return this;\n }\n disableMultipleSelection() {\n this.selection.disableMultiple();\n return this;\n }\n toggleMultipleSelection(multiple) {\n if (multiple != null) {\n if (multiple !== this.isMultipleSelection()) {\n if (multiple) {\n this.enableMultipleSelection();\n }\n else {\n this.disableMultipleSelection();\n }\n }\n }\n else if (this.isMultipleSelection()) {\n this.disableMultipleSelection();\n }\n else {\n this.enableMultipleSelection();\n }\n return this;\n }\n isSelectionMovable() {\n return this.selection.widget.options.movable !== false;\n }\n enableSelectionMovable() {\n this.selection.widget.options.movable = true;\n return this;\n }\n disableSelectionMovable() {\n this.selection.widget.options.movable = false;\n return this;\n }\n toggleSelectionMovable(movable) {\n if (movable != null) {\n if (movable !== this.isSelectionMovable()) {\n if (movable) {\n this.enableSelectionMovable();\n }\n else {\n this.disableSelectionMovable();\n }\n }\n }\n else if (this.isSelectionMovable()) {\n this.disableSelectionMovable();\n }\n else {\n this.enableSelectionMovable();\n }\n return this;\n }\n isRubberbandEnabled() {\n return !this.selection.rubberbandDisabled;\n }\n enableRubberband() {\n this.selection.enableRubberband();\n return this;\n }\n disableRubberband() {\n this.selection.disableRubberband();\n return this;\n }\n toggleRubberband(enabled) {\n if (enabled != null) {\n if (enabled !== this.isRubberbandEnabled()) {\n if (enabled) {\n this.enableRubberband();\n }\n else {\n this.disableRubberband();\n }\n }\n }\n else if (this.isRubberbandEnabled()) {\n this.disableRubberband();\n }\n else {\n this.enableRubberband();\n }\n return this;\n }\n isStrictRubberband() {\n return this.selection.widget.options.strict === true;\n }\n enableStrictRubberband() {\n this.selection.widget.options.strict = true;\n return this;\n }\n disableStrictRubberband() {\n this.selection.widget.options.strict = false;\n return this;\n }\n toggleStrictRubberband(strict) {\n if (strict != null) {\n if (strict !== this.isStrictRubberband()) {\n if (strict) {\n this.enableStrictRubberband();\n }\n else {\n this.disableStrictRubberband();\n }\n }\n }\n else if (this.isStrictRubberband()) {\n this.disableStrictRubberband();\n }\n else {\n this.enableStrictRubberband();\n }\n return this;\n }\n setRubberbandModifiers(modifiers) {\n this.selection.setModifiers(modifiers);\n }\n setSelectionFilter(filter) {\n this.selection.setFilter(filter);\n return this;\n }\n setSelectionDisplayContent(content) {\n this.selection.setContent(content);\n return this;\n }\n isSelectionEmpty() {\n return this.selection.isEmpty();\n }\n cleanSelection(options) {\n this.selection.clean(options);\n return this;\n }\n resetSelection(cells, options) {\n this.selection.reset(cells, options);\n return this;\n }\n getSelectedCells() {\n return this.selection.cells;\n }\n getSelectedCellCount() {\n return this.selection.length;\n }\n isSelected(cell) {\n return this.selection.isSelected(cell);\n }\n select(cells, options) {\n this.selection.select(cells, options);\n return this;\n }\n unselect(cells, options) {\n this.selection.unselect(cells, options);\n return this;\n }\n // #endregion\n // #region snapline\n isSnaplineEnabled() {\n return !this.snapline.widget.disabled;\n }\n enableSnapline() {\n this.snapline.widget.enable();\n return this;\n }\n disableSnapline() {\n this.snapline.widget.disable();\n return this;\n }\n toggleSnapline(enabled) {\n if (enabled != null) {\n if (enabled !== this.isSnaplineEnabled()) {\n if (enabled) {\n this.enableSnapline();\n }\n else {\n this.disableSnapline();\n }\n }\n }\n else {\n if (this.isSnaplineEnabled()) {\n this.disableSnapline();\n }\n else {\n this.enableSnapline();\n }\n return this;\n }\n }\n hideSnapline() {\n this.snapline.widget.hide();\n return this;\n }\n setSnaplineFilter(filter) {\n this.snapline.widget.setFilter(filter);\n return this;\n }\n isSnaplineOnResizingEnabled() {\n return this.snapline.widget.options.resizing === true;\n }\n enableSnaplineOnResizing() {\n this.snapline.widget.options.resizing = true;\n return this;\n }\n disableSnaplineOnResizing() {\n this.snapline.widget.options.resizing = false;\n return this;\n }\n toggleSnaplineOnResizing(enableOnResizing) {\n if (enableOnResizing != null) {\n if (enableOnResizing !== this.isSnaplineOnResizingEnabled()) {\n if (enableOnResizing) {\n this.enableSnaplineOnResizing();\n }\n else {\n this.disableSnaplineOnResizing();\n }\n }\n }\n else if (this.isSnaplineOnResizingEnabled()) {\n this.disableSnaplineOnResizing();\n }\n else {\n this.enableSnaplineOnResizing();\n }\n return this;\n }\n isSharpSnapline() {\n return this.snapline.widget.options.sharp === true;\n }\n enableSharpSnapline() {\n this.snapline.widget.options.sharp = true;\n return this;\n }\n disableSharpSnapline() {\n this.snapline.widget.options.sharp = false;\n return this;\n }\n toggleSharpSnapline(sharp) {\n if (sharp != null) {\n if (sharp !== this.isSharpSnapline()) {\n if (sharp) {\n this.enableSharpSnapline();\n }\n else {\n this.disableSharpSnapline();\n }\n }\n }\n else if (this.isSharpSnapline()) {\n this.disableSharpSnapline();\n }\n else {\n this.enableSharpSnapline();\n }\n return this;\n }\n getSnaplineTolerance() {\n return this.snapline.widget.options.tolerance;\n }\n setSnaplineTolerance(tolerance) {\n this.snapline.widget.options.tolerance = tolerance;\n return this;\n }\n // #endregion\n // #region tools\n removeTools() {\n this.emit('tools:remove');\n return this;\n }\n hideTools() {\n this.emit('tools:hide');\n return this;\n }\n showTools() {\n this.emit('tools:show');\n return this;\n }\n // #endregion\n // #region format\n toSVG(callback, options = {}) {\n this.format.toSVG(callback, options);\n }\n toDataURL(callback, options) {\n this.format.toDataURL(callback, options);\n }\n toPNG(callback, options = {}) {\n this.format.toPNG(callback, options);\n }\n toJPEG(callback, options = {}) {\n this.format.toJPEG(callback, options);\n }\n // #endregion\n // #region print\n printPreview(options) {\n this.print.show(options);\n }\n // #endregion\n // #region dispose\n dispose() {\n this.clearCells();\n this.off();\n this.css.dispose();\n this.hook.dispose();\n this.defs.dispose();\n this.grid.dispose();\n this.coord.dispose();\n this.transform.dispose();\n this.knob.dispose();\n this.highlight.dispose();\n this.background.dispose();\n this.clipboard.dispose();\n this.snapline.dispose();\n this.selection.dispose();\n this.history.dispose();\n this.keyboard.dispose();\n this.mousewheel.dispose();\n this.print.dispose();\n this.format.dispose();\n this.minimap.dispose();\n this.panning.dispose();\n this.scroller.dispose();\n this.view.dispose();\n this.renderer.dispose();\n this.size.dispose();\n }\n}\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"lockScroller\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"unlockScroller\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"updateScroller\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"getScrollbarPosition\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"setScrollbarPosition\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"scrollToPoint\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"scrollToContent\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"scrollToCell\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"transitionToPoint\", null);\n__decorate([\n Decorator.checkScroller()\n], Graph.prototype, \"transitionToRect\", null);\n__decorate([\n Basecoat.dispose()\n], Graph.prototype, \"dispose\", null);\n(function (Graph) {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n Graph.View = GraphView;\n Graph.Hook = HookManager;\n Graph.Renderer = ViewRenderer;\n Graph.Keyboard = Shortcut;\n Graph.MouseWheel = Wheel;\n Graph.BaseManager = Base;\n Graph.DefsManager = Defs;\n Graph.GridManager = Grid;\n Graph.CoordManager = Coord;\n Graph.PrintManager = Print;\n Graph.FormatManager = Format;\n Graph.MiniMapManager = MiniMap;\n Graph.HistoryManager = History;\n Graph.SnaplineManager = Snapline;\n Graph.ScrollerManager = Scroller;\n Graph.ClipboardManager = Clipboard;\n Graph.TransformManager = Transform;\n Graph.HighlightManager = Highlight;\n Graph.BackgroundManager = Background;\n Graph.SelectionManager = Selection;\n})(Graph || (Graph = {}));\n(function (Graph) {\n Graph.toStringTag = `X6.${Graph.name}`;\n function isGraph(instance) {\n if (instance == null) {\n return false;\n }\n if (instance instanceof Graph) {\n return true;\n }\n const tag = instance[Symbol.toStringTag];\n const graph = instance;\n if ((tag == null || tag === Graph.toStringTag) &&\n graph.hook != null &&\n graph.view != null &&\n graph.model != null) {\n return true;\n }\n return false;\n }\n Graph.isGraph = isGraph;\n})(Graph || (Graph = {}));\n(function (Graph) {\n function render(options, data) {\n const graph = options instanceof HTMLElement\n ? new Graph({ container: options })\n : new Graph(options);\n if (data != null) {\n graph.fromJSON(data);\n }\n return graph;\n }\n Graph.render = render;\n})(Graph || (Graph = {}));\n(function (Graph) {\n Graph.registerNode = Node.registry.register;\n Graph.registerEdge = Edge.registry.register;\n Graph.registerView = CellView.registry.register;\n Graph.registerAttr = Registry.Attr.registry.register;\n Graph.registerGrid = Registry.Grid.registry.register;\n Graph.registerFilter = Registry.Filter.registry.register;\n Graph.registerNodeTool = Registry.NodeTool.registry.register;\n Graph.registerEdgeTool = Registry.EdgeTool.registry.register;\n Graph.registerBackground = Registry.Background.registry.register;\n Graph.registerHighlighter = Registry.Highlighter.registry.register;\n Graph.registerPortLayout = Registry.PortLayout.registry.register;\n Graph.registerPortLabelLayout = Registry.PortLabelLayout.registry.register;\n Graph.registerMarker = Registry.Marker.registry.register;\n Graph.registerRouter = Registry.Router.registry.register;\n Graph.registerConnector = Registry.Connector.registry.register;\n Graph.registerAnchor = Registry.NodeAnchor.registry.register;\n Graph.registerEdgeAnchor = Registry.EdgeAnchor.registry.register;\n Graph.registerConnectionPoint = Registry.ConnectionPoint.registry.register;\n Graph.registerConnectionStrategy = Registry.ConnectionStrategy.registry.register;\n Graph.registerHTMLComponent = HTML.componentRegistry.register;\n})(Graph || (Graph = {}));\n(function (Graph) {\n Graph.unregisterNode = Node.registry.unregister;\n Graph.unregisterEdge = Edge.registry.unregister;\n Graph.unregisterView = CellView.registry.unregister;\n Graph.unregisterAttr = Registry.Attr.registry.unregister;\n Graph.unregisterGrid = Registry.Grid.registry.unregister;\n Graph.unregisterFilter = Registry.Filter.registry.unregister;\n Graph.unregisterNodeTool = Registry.NodeTool.registry.unregister;\n Graph.unregisterEdgeTool = Registry.EdgeTool.registry.unregister;\n Graph.unregisterBackground = Registry.Background.registry.unregister;\n Graph.unregisterHighlighter = Registry.Highlighter.registry.unregister;\n Graph.unregisterPortLayout = Registry.PortLayout.registry.unregister;\n Graph.unregisterPortLabelLayout = Registry.PortLabelLayout.registry.unregister;\n Graph.unregisterMarker = Registry.Marker.registry.unregister;\n Graph.unregisterRouter = Registry.Router.registry.unregister;\n Graph.unregisterConnector = Registry.Connector.registry.unregister;\n Graph.unregisterAnchor = Registry.NodeAnchor.registry.unregister;\n Graph.unregisterEdgeAnchor = Registry.EdgeAnchor.registry.unregister;\n Graph.unregisterConnectionPoint = Registry.ConnectionPoint.registry.unregister;\n Graph.unregisterConnectionStrategy = Registry.ConnectionStrategy.registry.unregister;\n Graph.unregisterHTMLComponent = HTML.componentRegistry.unregister;\n})(Graph || (Graph = {}));\n//# sourceMappingURL=graph.js.map","import { ArrayExt } from '../../util';\nimport { Config } from '../../global/config';\nimport { Graph } from '../../graph/graph';\nimport { Model } from '../../model/model';\nexport class Clipboard {\n constructor() {\n this.cells = [];\n }\n copy(cells, graph, options = {}) {\n this.options = Object.assign({}, options);\n const model = Model.isModel(graph) ? graph : graph.model;\n const cloned = model.cloneSubGraph(cells, options);\n // sort asc by cell type\n this.cells = ArrayExt.sortBy(Object.keys(cloned).map((key) => cloned[key]), (cell) => (cell.isEdge() ? 2 : 1));\n this.serialize(options);\n }\n cut(cells, graph, options = {}) {\n this.copy(cells, graph, options);\n const model = Graph.isGraph(graph) ? graph.model : graph;\n model.batchUpdate('cut', () => {\n cells.forEach((cell) => cell.remove());\n });\n }\n paste(graph, options = {}) {\n const localOptions = Object.assign(Object.assign({}, this.options), options);\n const { offset, edgeProps, nodeProps } = localOptions;\n let dx = 20;\n let dy = 20;\n if (offset) {\n dx = typeof offset === 'number' ? offset : offset.dx;\n dy = typeof offset === 'number' ? offset : offset.dy;\n }\n this.deserialize(localOptions);\n const cells = this.cells;\n cells.forEach((cell) => {\n cell.model = null;\n cell.removeProp('zIndex');\n if (dx || dy) {\n cell.translate(dx, dy);\n }\n if (nodeProps && cell.isNode()) {\n cell.prop(nodeProps);\n }\n if (edgeProps && cell.isEdge()) {\n cell.prop(edgeProps);\n }\n });\n const model = Graph.isGraph(graph) ? graph.model : graph;\n model.batchUpdate('paste', () => {\n model.addCells(this.cells);\n });\n this.copy(cells, graph, options);\n return cells;\n }\n serialize(options) {\n if (options.useLocalStorage !== false) {\n Storage.save(this.cells);\n }\n }\n deserialize(options) {\n if (options.useLocalStorage) {\n const cells = Storage.fetch();\n if (cells) {\n this.cells = cells;\n }\n }\n }\n isEmpty() {\n return this.cells.length <= 0;\n }\n clean() {\n this.options = {};\n this.cells = [];\n Storage.clean();\n }\n}\nvar Storage;\n(function (Storage) {\n const LOCAL_STORAGE_KEY = `${Config.prefixCls}.clipboard.cells`;\n function save(cells) {\n if (window.localStorage) {\n const data = cells.map((cell) => cell.toJSON());\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(data));\n }\n }\n Storage.save = save;\n function fetch() {\n if (window.localStorage) {\n const raw = localStorage.getItem(LOCAL_STORAGE_KEY);\n const cells = raw ? JSON.parse(raw) : [];\n if (cells) {\n return Model.fromJSON(cells);\n }\n }\n }\n Storage.fetch = fetch;\n function clean() {\n if (window.localStorage) {\n localStorage.removeItem(LOCAL_STORAGE_KEY);\n }\n }\n Storage.clean = clean;\n})(Storage || (Storage = {}));\n//# sourceMappingURL=index.js.map","import { ObjectExt, FunctionExt } from '../../util';\nimport { Rectangle } from '../../geometry';\nimport { Widget, Handle } from '../common';\nimport { NodePreset } from './node-preset';\nimport { EdgePreset } from './edge-preset';\nexport class Halo extends Widget {\n get type() {\n return this.options.type || 'surround';\n }\n get handleOptions() {\n return this.options;\n }\n init(options) {\n this.options = ObjectExt.merge(Halo.defaultOptions, this.cell.isNode()\n ? new NodePreset(this).getPresets()\n : this.cell.isEdge()\n ? new EdgePreset(this).getPresets()\n : null, options);\n this.render();\n this.initHandles();\n this.update();\n this.startListening();\n }\n startListening() {\n const model = this.model;\n const graph = this.graph;\n const cell = this.view.cell;\n cell.on('removed', this.remove, this);\n model.on('reseted', this.remove, this);\n graph.on('halo:destroy', this.remove, this);\n model.on('*', this.update, this);\n graph.on('scale', this.update, this);\n graph.on('translate', this.update, this);\n super.startListening();\n }\n stopListening() {\n const model = this.model;\n const graph = this.graph;\n const cell = this.view.cell;\n this.undelegateEvents();\n cell.off('removed', this.remove, this);\n model.off('reseted', this.remove, this);\n graph.off('halo:destroy', this.remove, this);\n model.off('*', this.update, this);\n graph.off('scale', this.update, this);\n graph.off('translate', this.update, this);\n super.stopListening();\n }\n render() {\n const options = this.options;\n const cls = this.prefixClassName('widget-halo');\n this.view.addClass(Private.NODE_CLS);\n this.container = document.createElement('div');\n this.$container = this.$(this.container)\n .addClass(cls)\n .attr('data-shape', this.view.cell.shape);\n if (options.className) {\n this.$container.addClass(options.className);\n }\n this.$handleContainer = this.$('<div/>')\n .addClass(`${cls}-handles`)\n .appendTo(this.container);\n this.$content = this.$('<div/>')\n .addClass(`${cls}-content`)\n .appendTo(this.container);\n this.$container.appendTo(this.graph.container);\n return this;\n }\n remove() {\n this.stopBatch();\n this.view.removeClass(Private.NODE_CLS);\n return super.remove();\n }\n update() {\n if (this.isRendered()) {\n this.updateContent();\n const bbox = this.getBBox();\n const tinyThreshold = this.options.tinyThreshold || 0;\n const smallThreshold = this.options.smallThreshold || 0;\n this.$handleContainer.toggleClass(`${this.handleClassName}-tiny`, bbox.width < tinyThreshold && bbox.height < tinyThreshold);\n const className = `${this.handleClassName}-small`;\n this.$handleContainer.toggleClass(className, !this.$handleContainer.hasClass(className) &&\n bbox.width < smallThreshold &&\n bbox.height < smallThreshold);\n this.$container.css({\n width: bbox.width,\n height: bbox.height,\n left: bbox.x,\n top: bbox.y,\n });\n if (this.hasHandle('unlink')) {\n this.toggleUnlink();\n }\n if (this.type === 'surround' || this.type === 'toolbar') {\n if (this.hasHandle('fork')) {\n this.toggleFork();\n }\n }\n }\n }\n updateContent() {\n const content = this.options.content;\n if (typeof content === 'function') {\n const ret = FunctionExt.call(content, this, this.view, this.$content[0]);\n if (ret) {\n this.$content.html(ret);\n }\n }\n else if (content) {\n this.$content.html(content);\n }\n else {\n this.$content.remove();\n }\n }\n getBBox() {\n const view = this.view;\n const bbox = this.options.bbox;\n const rect = typeof bbox === 'function' ? FunctionExt.call(bbox, this, view) : bbox;\n return Rectangle.create(Object.assign({ x: 0, y: 0, width: 1, height: 1 }, rect));\n }\n removeCell() {\n this.cell.remove();\n }\n toggleFork() {\n const cell = this.view.cell.clone();\n const view = this.graph.hook.createCellView(cell);\n const valid = this.graph.hook.validateConnection(this.view, null, view, null, 'target');\n this.$handleContainer.children('.fork').toggleClass('hidden', !valid);\n view.remove();\n }\n toggleUnlink() {\n const hasEdges = this.model.getConnectedEdges(this.view.cell).length > 0;\n this.$handleContainer.children('.unlink').toggleClass('hidden', !hasEdges);\n }\n // #region batch\n startBatch() {\n this.model.startBatch('halo', {\n halo: this.cid,\n });\n }\n stopBatch() {\n if (this.model.hasActiveBatch('halo')) {\n this.model.stopBatch('halo', {\n halo: this.cid,\n });\n }\n }\n}\n(function (Halo) {\n Halo.defaultOptions = {\n type: 'surround',\n clearAll: true,\n clearOnBlankMouseDown: true,\n useCellGeometry: false,\n clone: (cell) => cell.clone().removeZIndex(),\n };\n})(Halo || (Halo = {}));\nObject.getOwnPropertyNames(Handle.prototype).forEach((name) => {\n if (name !== 'constructor') {\n Object.defineProperty(Halo.prototype, name, Object.getOwnPropertyDescriptor(Handle.prototype, name));\n }\n});\nvar Private;\n(function (Private) {\n Private.NODE_CLS = 'has-widget-halo';\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","import { Util } from '../../global';\nimport { StringExt, FunctionExt } from '../../util';\nimport { Point, Rectangle, Angle } from '../../geometry';\nimport { Cell } from '../../model/cell';\nimport { notify } from '../transform/util';\nexport class NodePreset {\n constructor(halo) {\n this.halo = halo;\n }\n get options() {\n return this.halo.options;\n }\n get graph() {\n return this.halo.graph;\n }\n get model() {\n return this.halo.model;\n }\n get view() {\n return this.halo.view;\n }\n get cell() {\n return this.halo.cell;\n }\n get node() {\n return this.cell;\n }\n getPresets() {\n return {\n className: 'type-node',\n handles: [\n {\n name: 'remove',\n position: 'nw',\n events: {\n mousedown: this.removeCell.bind(this),\n },\n icon: null,\n },\n {\n name: 'resize',\n position: 'se',\n events: {\n mousedown: this.startResize.bind(this),\n mousemove: this.doResize.bind(this),\n mouseup: this.stopResize.bind(this),\n },\n icon: null,\n },\n {\n name: 'clone',\n position: 'n',\n events: {\n mousedown: this.startClone.bind(this),\n mousemove: this.doClone.bind(this),\n mouseup: this.stopClone.bind(this),\n },\n icon: null,\n },\n {\n name: 'link',\n position: 'e',\n events: {\n mousedown: this.startLink.bind(this),\n mousemove: this.doLink.bind(this),\n mouseup: this.stopLink.bind(this),\n },\n icon: null,\n },\n {\n name: 'fork',\n position: 'ne',\n events: {\n mousedown: this.startFork.bind(this),\n mousemove: this.doFork.bind(this),\n mouseup: this.stopFork.bind(this),\n },\n icon: null,\n },\n {\n name: 'unlink',\n position: 'w',\n events: {\n mousedown: this.unlink.bind(this),\n },\n icon: null,\n },\n {\n name: 'rotate',\n position: 'sw',\n events: {\n mousedown: this.startRotate.bind(this),\n mousemove: this.doRotate.bind(this),\n mouseup: this.stopRotate.bind(this),\n },\n icon: null,\n },\n ],\n bbox(view) {\n if (this.options.useCellGeometry) {\n const node = view.cell;\n return node.getBBox();\n }\n return view.getBBox();\n },\n content(view) {\n const template = StringExt.template('x: <%= x %>, y: <%= y %>, width: <%= width %>, height: <%= height %>, angle: <%= angle %>');\n const cell = view.cell;\n const bbox = cell.getBBox();\n return template({\n x: Math.floor(bbox.x),\n y: Math.floor(bbox.y),\n width: Math.floor(bbox.width),\n height: Math.floor(bbox.height),\n angle: Math.floor(cell.getAngle()),\n });\n },\n magnet(view) {\n return view.container;\n },\n tinyThreshold: 40,\n smallThreshold: 80,\n loopEdgePreferredSide: 'top',\n loopEdgeWidth: 40,\n rotateGrid: 15,\n rotateEmbeds: false,\n };\n }\n removeCell() {\n this.model.removeConnectedEdges(this.cell);\n this.cell.remove();\n }\n // #region create edge\n startLink({ x, y }) {\n this.halo.startBatch();\n const graph = this.graph;\n const edge = this.createEdgeConnectedToSource();\n edge.setTarget({ x, y });\n this.model.addEdge(edge, {\n validation: false,\n halo: this.halo.cid,\n async: false,\n });\n graph.view.undelegateEvents();\n this.edgeView = graph.renderer.findViewByCell(edge);\n this.edgeView.prepareArrowheadDragging('target', {\n x,\n y,\n fallbackAction: 'remove',\n });\n }\n createEdgeConnectedToSource() {\n const magnet = this.getMagnet(this.view, 'source');\n const terminal = this.getEdgeTerminal(this.view, magnet);\n const edge = this.graph.hook.getDefaultEdge(this.view, magnet);\n edge.setSource(terminal);\n return edge;\n }\n getMagnet(view, terminal) {\n const magnet = this.options.magnet;\n if (typeof magnet === 'function') {\n const val = FunctionExt.call(magnet, this.halo, view, terminal);\n if (val instanceof SVGElement) {\n return val;\n }\n }\n throw new Error('`magnet()` has to return an SVGElement');\n }\n getEdgeTerminal(view, magnet) {\n const terminal = {\n cell: view.cell.id,\n };\n if (magnet !== view.container) {\n const port = magnet.getAttribute('port');\n if (port) {\n terminal.port = port;\n }\n else {\n terminal.selector = view.getSelector(magnet);\n }\n }\n return terminal;\n }\n doLink({ e, x, y }) {\n if (this.edgeView) {\n this.edgeView.onMouseMove(e, x, y);\n }\n }\n stopLink({ e, x, y }) {\n const edgeView = this.edgeView;\n if (edgeView) {\n edgeView.onMouseUp(e, x, y);\n const edge = edgeView.cell;\n if (edge.hasLoop()) {\n this.makeLoopEdge(edge);\n }\n this.halo.stopBatch();\n this.halo.trigger('action:edge:addde', { edge });\n this.edgeView = null;\n }\n this.graph.view.delegateEvents();\n }\n makeLoopEdge(edge) {\n let vertex1 = null;\n let vertex2 = null;\n const loopEdgeWidth = this.options.loopEdgeWidth;\n const graphOptions = this.graph.options;\n const graphRect = new Rectangle(0, 0, graphOptions.width, graphOptions.height);\n const bbox = this.graph.graphToLocal(this.view.getBBox());\n const found = [\n this.options.loopEdgePreferredSide,\n 'top',\n 'bottom',\n 'left',\n 'right',\n ].some((position) => {\n let point = null;\n let dx = 0;\n let dy = 0;\n switch (position) {\n case 'top':\n point = new Point(bbox.x + bbox.width / 2, bbox.y - loopEdgeWidth);\n dx = loopEdgeWidth / 2;\n break;\n case 'bottom':\n point = new Point(bbox.x + bbox.width / 2, bbox.y + bbox.height + loopEdgeWidth);\n dx = loopEdgeWidth / 2;\n break;\n case 'left':\n point = new Point(bbox.x - loopEdgeWidth, bbox.y + bbox.height / 2);\n dy = loopEdgeWidth / 2;\n break;\n case 'right':\n point = new Point(bbox.x + bbox.width + loopEdgeWidth, bbox.y + bbox.height / 2);\n dy = loopEdgeWidth / 2;\n break;\n default:\n break;\n }\n if (point) {\n vertex1 = point.translate(-dx, -dy);\n vertex2 = point.translate(dx, dy);\n return (graphRect.containsPoint(vertex1) && graphRect.containsPoint(vertex2));\n }\n return false;\n });\n if (found && vertex1 && vertex2) {\n edge.setVertices([vertex1, vertex2]);\n }\n }\n // #endregion\n // #region resize\n startResize({ e }) {\n this.halo.startBatch();\n this.flip = [1, 0, 0, 1, 1, 0, 0, 1][Math.floor(Angle.normalize(this.node.getAngle()) / 45)];\n this.view.addClass('node-resizing');\n notify('node:resize', e, this.view);\n }\n doResize({ e, dx, dy }) {\n const size = this.node.getSize();\n const width = Math.max(size.width + (this.flip ? dx : dy), 1);\n const height = Math.max(size.height + (this.flip ? dy : dx), 1);\n this.node.resize(width, height, {\n absolute: true,\n });\n notify('node:resizing', e, this.view);\n }\n stopResize({ e }) {\n this.view.removeClass('node-resizing');\n notify('node:resized', e, this.view);\n this.halo.stopBatch();\n }\n // #endregion\n // #region clone\n startClone({ e, x, y }) {\n this.halo.startBatch();\n const options = this.options;\n const cloned = options.clone(this.cell, {\n clone: true,\n });\n if (!Cell.isCell(cloned)) {\n throw new Error(\"option 'clone()' has to return a cell\");\n }\n this.centerNodeAtCursor(cloned, x, y);\n this.model.addCell(cloned, {\n halo: this.halo.cid,\n async: false,\n });\n const cloneView = this.graph.renderer.findViewByCell(cloned);\n cloneView.onMouseDown(e, x, y);\n this.halo.setEventData(e, { cloneView });\n }\n centerNodeAtCursor(cell, x, y) {\n const center = cell.getBBox().getCenter();\n const dx = x - center.x;\n const dy = y - center.y;\n cell.translate(dx, dy);\n }\n doClone({ e, x, y }) {\n const view = this.halo.getEventData(e).cloneView;\n if (view) {\n view.onMouseMove(e, x, y);\n }\n }\n stopClone({ e, x, y }) {\n const nodeView = this.halo.getEventData(e).cloneView;\n if (nodeView) {\n nodeView.onMouseUp(e, x, y);\n }\n this.halo.stopBatch();\n }\n // #endregion\n // #region fork\n startFork({ e, x, y }) {\n this.halo.startBatch();\n const cloned = this.options.clone(this.cell, {\n fork: true,\n });\n if (!Cell.isCell(cloned)) {\n throw new Error(\"option 'clone()' has to return a cell\");\n }\n this.centerNodeAtCursor(cloned, x, y);\n this.model.addCell(cloned, {\n halo: this.halo.cid,\n async: false,\n });\n const edge = this.createEdgeConnectedToSource();\n const cloneView = this.graph.renderer.findViewByCell(cloned);\n const magnet = this.getMagnet(cloneView, 'target');\n const terminal = this.getEdgeTerminal(cloneView, magnet);\n edge.setTarget(terminal);\n this.model.addEdge(edge, {\n halo: this.halo.cid,\n async: false,\n });\n cloneView.onMouseDown(e, x, y);\n this.halo.setEventData(e, { cloneView });\n }\n doFork({ e, x, y }) {\n const view = this.halo.getEventData(e).cloneView;\n if (view) {\n view.onMouseMove(e, x, y);\n }\n }\n stopFork({ e, x, y }) {\n const view = this.halo.getEventData(e).cloneView;\n if (view) {\n view.onMouseUp(e, x, y);\n }\n this.halo.stopBatch();\n }\n // #endregion\n // #region rotate\n startRotate({ e, x, y }) {\n this.halo.startBatch();\n const center = this.node.getBBox().getCenter();\n const nodes = [this.node];\n if (this.options.rotateEmbeds) {\n this.node\n .getDescendants({\n deep: true,\n })\n .reduce((memo, cell) => {\n if (cell.isNode()) {\n memo.push(cell);\n }\n return memo;\n }, nodes);\n }\n this.halo.setEventData(e, {\n center,\n nodes,\n rotateStartAngles: nodes.map((node) => node.getAngle()),\n clientStartAngle: new Point(x, y).theta(center),\n });\n nodes.forEach((node) => {\n const view = this.graph.findViewByCell(node);\n if (view) {\n view.addClass('node-rotating');\n notify('node:rotate', e, view);\n }\n });\n }\n doRotate({ e, x, y }) {\n const data = this.halo.getEventData(e);\n const delta = data.clientStartAngle - new Point(x, y).theta(data.center);\n data.nodes.forEach((node, index) => {\n const startAngle = data.rotateStartAngles[index];\n const targetAngle = Util.snapToGrid(startAngle + delta, this.options.rotateGrid);\n node.rotate(targetAngle, {\n absolute: true,\n center: data.center,\n halo: this.halo.cid,\n });\n notify('node:rotating', e, this.graph.findViewByCell(node));\n });\n }\n stopRotate({ e }) {\n const data = this.halo.getEventData(e);\n data.nodes.forEach((node) => {\n const view = this.graph.findViewByCell(node);\n view.removeClass('node-rotating');\n notify('node:rotated', e, view);\n });\n this.halo.stopBatch();\n }\n // #endregion\n // #region unlink\n unlink() {\n this.halo.startBatch();\n this.model.removeConnectedEdges(this.cell);\n this.halo.stopBatch();\n }\n}\n//# sourceMappingURL=node-preset.js.map","export class EdgePreset {\n constructor(halo) {\n this.halo = halo;\n }\n get options() {\n return this.halo.options;\n }\n get graph() {\n return this.halo.graph;\n }\n get model() {\n return this.halo.model;\n }\n get view() {\n return this.halo.view;\n }\n get cell() {\n return this.halo.cell;\n }\n get edge() {\n return this.cell;\n }\n getPresets() {\n return {\n className: 'type-edge',\n handles: [\n {\n name: 'remove',\n position: 'nw',\n icon: null,\n events: {\n mousedown: this.removeEdge.bind(this),\n },\n },\n {\n name: 'direction',\n position: 'se',\n icon: null,\n events: {\n mousedown: this.directionSwap.bind(this),\n },\n },\n ],\n content: false,\n bbox(view) {\n return view.graph.localToGraph(view.getPointAtRatio(0.5));\n },\n tinyThreshold: -1,\n smallThreshold: -1,\n };\n }\n removeEdge() {\n this.cell.remove();\n }\n directionSwap() {\n const source = this.edge.getSource();\n const target = this.edge.getTarget();\n this.edge.prop({\n source: target,\n target: source,\n });\n }\n}\n//# sourceMappingURL=edge-preset.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Util } from '../../global';\nimport { FunctionExt } from '../../util';\nimport { Rectangle } from '../../geometry';\nimport { View } from '../../view/view';\nimport { Graph } from '../../graph/graph';\nexport class Dnd extends View {\n constructor(options) {\n super();\n this.options = Object.assign(Object.assign({}, Dnd.defaults), options);\n this.container = document.createElement('div');\n this.$container = this.$(this.container).addClass(this.prefixClassName('widget-dnd'));\n this.draggingGraph = new Graph(Object.assign(Object.assign({}, this.options.delegateGraphOptions), { container: document.createElement('div'), width: 1, height: 1 }));\n this.$container.append(this.draggingGraph.container);\n }\n get targetScroller() {\n const target = this.options.target;\n return Graph.isGraph(target) ? target.scroller.widget : target;\n }\n get targetGraph() {\n const target = this.options.target;\n return Graph.isGraph(target) ? target : target.graph;\n }\n get targetModel() {\n return this.targetGraph.model;\n }\n get snapline() {\n return this.targetGraph.snapline.widget;\n }\n start(node, evt) {\n const e = evt;\n e.preventDefault();\n this.targetModel.startBatch('dnd');\n this.$container\n .addClass('dragging')\n .appendTo(this.options.containerParent || document.body);\n this.sourceNode = node;\n this.prepareDragging(node, e.clientX, e.clientY);\n const local = this.updateNodePosition(e.clientX, e.clientY);\n if (this.isSnaplineEnabled()) {\n this.snapline.captureCursorOffset({\n e,\n node,\n cell: node,\n view: this.draggingView,\n x: local.x,\n y: local.y,\n });\n this.draggingNode.on('change:position', this.snap, this);\n }\n this.delegateDocumentEvents(Dnd.documentEvents, e.data);\n }\n isSnaplineEnabled() {\n return this.snapline && !this.snapline.disabled;\n }\n prepareDragging(sourceNode, clientX, clientY) {\n const draggingGraph = this.draggingGraph;\n const draggingModel = draggingGraph.model;\n const draggingNode = this.options.getDragNode(sourceNode, {\n sourceNode,\n draggingGraph,\n targetGraph: this.targetGraph,\n });\n draggingNode.position(0, 0);\n let padding = 5;\n if (this.isSnaplineEnabled()) {\n padding += this.snapline.options.tolerance || 0;\n }\n if (this.isSnaplineEnabled() || this.options.scaled) {\n const scale = this.targetGraph.transform.getScale();\n draggingGraph.scale(scale.sx, scale.sy);\n padding *= Math.max(scale.sx, scale.sy);\n }\n else {\n draggingGraph.scale(1, 1);\n }\n this.clearDragging();\n if (this.options.animation) {\n this.$container.stop(true, true);\n }\n draggingModel.resetCells([draggingNode]);\n const delegateView = draggingGraph.findViewByCell(draggingNode);\n delegateView.undelegateEvents();\n delegateView.cell.off('changed');\n draggingGraph.fitToContent({\n padding,\n allowNewOrigin: 'any',\n });\n const bbox = delegateView.getBBox();\n this.geometryBBox = delegateView.getBBox({ useCellGeometry: true });\n this.delta = this.geometryBBox.getTopLeft().diff(bbox.getTopLeft());\n this.draggingNode = draggingNode;\n this.draggingView = delegateView;\n this.draggingBBox = draggingNode.getBBox();\n this.padding = padding;\n this.originOffset = this.updateGraphPosition(clientX, clientY);\n }\n updateGraphPosition(clientX, clientY) {\n const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n const delta = this.delta;\n const nodeBBox = this.geometryBBox;\n const padding = this.padding || 5;\n const offset = {\n left: clientX - delta.x - nodeBBox.width / 2 - padding,\n top: clientY - delta.y - nodeBBox.height / 2 - padding + scrollTop,\n };\n if (this.draggingGraph) {\n this.$container.offset(offset);\n }\n return offset;\n }\n updateNodePosition(x, y) {\n const local = this.targetGraph.clientToLocal(x, y);\n const bbox = this.draggingBBox;\n local.x -= bbox.width / 2;\n local.y -= bbox.height / 2;\n this.draggingNode.position(local.x, local.y);\n return local;\n }\n snap({ cell, current, options, }) {\n const node = cell;\n if (options.snapped) {\n const bbox = this.draggingBBox;\n node.position(bbox.x + options.tx, bbox.y + options.ty, { silent: true });\n this.draggingView.translate();\n node.position(current.x, current.y, { silent: true });\n this.snapOffset = {\n x: options.tx,\n y: options.ty,\n };\n }\n else {\n this.snapOffset = null;\n }\n }\n onDragging(evt) {\n const draggingView = this.draggingView;\n if (draggingView) {\n evt.preventDefault();\n const e = this.normalizeEvent(evt);\n const clientX = e.clientX;\n const clientY = e.clientY;\n this.updateGraphPosition(clientX, clientY);\n const local = this.updateNodePosition(clientX, clientY);\n const embeddingMode = this.targetGraph.options.embedding.enabled;\n const isValidArea = (embeddingMode || this.isSnaplineEnabled()) &&\n this.isInsideValidArea({\n x: clientX,\n y: clientY,\n });\n if (embeddingMode) {\n draggingView.setEventData(e, {\n graph: this.targetGraph,\n candidateEmbedView: this.candidateEmbedView,\n });\n const data = draggingView.getEventData(e);\n if (isValidArea) {\n draggingView.processEmbedding(e, data);\n }\n else {\n draggingView.clearEmbedding(data);\n }\n this.candidateEmbedView = data.candidateEmbedView;\n }\n // update snapline\n if (this.isSnaplineEnabled()) {\n if (isValidArea) {\n this.snapline.snapOnMoving({\n e,\n view: draggingView,\n x: local.x,\n y: local.y,\n });\n }\n else {\n this.snapline.hide();\n }\n }\n }\n }\n onDragEnd(evt) {\n const draggingNode = this.draggingNode;\n if (draggingNode) {\n const e = this.normalizeEvent(evt);\n const draggingView = this.draggingView;\n const draggingBBox = this.draggingBBox;\n const snapOffset = this.snapOffset;\n let x = draggingBBox.x;\n let y = draggingBBox.y;\n if (snapOffset) {\n x += snapOffset.x;\n y += snapOffset.y;\n }\n draggingNode.position(x, y, { silent: true });\n const ret = this.drop(draggingNode, { x: e.clientX, y: e.clientY });\n const callback = (node) => {\n if (node) {\n this.onDropped(draggingNode);\n if (this.targetGraph.options.embedding.enabled && draggingView) {\n draggingView.setEventData(e, {\n cell: node,\n graph: this.targetGraph,\n candidateEmbedView: this.candidateEmbedView,\n });\n draggingView.finalizeEmbedding(e, draggingView.getEventData(e));\n }\n }\n else {\n this.onDropInvalid();\n }\n this.candidateEmbedView = null;\n this.targetModel.stopBatch('dnd');\n };\n if (FunctionExt.isAsync(ret)) {\n // stop dragging\n this.undelegateDocumentEvents();\n ret.then(callback); // eslint-disable-line\n }\n else {\n callback(ret);\n }\n }\n }\n clearDragging() {\n if (this.draggingNode) {\n this.sourceNode = null;\n this.draggingNode.remove();\n this.draggingNode = null;\n this.draggingView = null;\n this.delta = null;\n this.padding = null;\n this.snapOffset = null;\n this.originOffset = null;\n this.undelegateDocumentEvents();\n }\n }\n onDropped(draggingNode) {\n if (this.draggingNode === draggingNode) {\n this.clearDragging();\n this.$container.removeClass('dragging').remove();\n }\n }\n onDropInvalid() {\n const draggingNode = this.draggingNode;\n if (draggingNode) {\n const anim = this.options.animation;\n if (anim) {\n const duration = (typeof anim === 'object' && anim.duration) || 150;\n const easing = (typeof anim === 'object' && anim.easing) || 'swing';\n this.draggingView = null;\n this.$container.animate(this.originOffset, duration, easing, () => this.onDropped(draggingNode));\n }\n else {\n this.onDropped(draggingNode);\n }\n }\n }\n isInsideValidArea(p) {\n let targetRect;\n const targetGraph = this.targetGraph;\n const targetScroller = this.targetScroller;\n if (targetScroller) {\n if (targetScroller.options.autoResize) {\n targetRect = this.getDropArea(targetScroller.container);\n }\n else {\n const outter = this.getDropArea(targetScroller.container);\n targetRect = this.getDropArea(targetGraph.container).intersectsWithRect(outter);\n }\n }\n else {\n targetRect = this.getDropArea(targetGraph.container);\n }\n return targetRect && targetRect.containsPoint(p);\n }\n getDropArea(elem) {\n const $elem = this.$(elem);\n const offset = $elem.offset();\n const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n const scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;\n return Rectangle.create({\n x: offset.left + parseInt($elem.css('border-left-width'), 10) - scrollLeft,\n y: offset.top + parseInt($elem.css('border-top-width'), 10) - scrollTop,\n width: $elem.innerWidth(),\n height: $elem.innerHeight(),\n });\n }\n drop(draggingNode, pos) {\n if (this.isInsideValidArea(pos)) {\n const targetGraph = this.targetGraph;\n const targetModel = targetGraph.model;\n const local = targetGraph.clientToLocal(pos);\n const sourceNode = this.sourceNode;\n const droppingNode = this.options.getDropNode(draggingNode, {\n sourceNode,\n draggingNode,\n targetGraph: this.targetGraph,\n draggingGraph: this.draggingGraph,\n });\n const bbox = droppingNode.getBBox();\n local.x += bbox.x - bbox.width / 2;\n local.y += bbox.y - bbox.height / 2;\n const gridSize = this.snapOffset ? 1 : targetGraph.getGridSize();\n droppingNode.position(Util.snapToGrid(local.x, gridSize), Util.snapToGrid(local.y, gridSize));\n droppingNode.removeZIndex();\n const validateNode = this.options.validateNode;\n const ret = validateNode\n ? validateNode(droppingNode, {\n sourceNode,\n draggingNode,\n droppingNode,\n targetGraph,\n draggingGraph: this.draggingGraph,\n })\n : true;\n if (typeof ret === 'boolean') {\n if (ret) {\n targetModel.addCell(droppingNode, { stencil: this.cid });\n return droppingNode;\n }\n return null;\n }\n return FunctionExt.toDeferredBoolean(ret).then((valid) => {\n if (valid) {\n targetModel.addCell(droppingNode, { stencil: this.cid });\n return droppingNode;\n }\n return null;\n });\n }\n return null;\n }\n onRemove() {\n if (this.draggingGraph) {\n this.draggingGraph.view.remove();\n this.draggingGraph.dispose();\n }\n }\n dispose() {\n this.remove();\n }\n}\n__decorate([\n View.dispose()\n], Dnd.prototype, \"dispose\", null);\n(function (Dnd) {\n Dnd.defaults = {\n animation: false,\n getDragNode: (sourceNode) => sourceNode.clone(),\n getDropNode: (draggingNode) => draggingNode.clone(),\n };\n Dnd.documentEvents = {\n mousemove: 'onDragging',\n touchmove: 'onDragging',\n mouseup: 'onDragEnd',\n touchend: 'onDragEnd',\n touchcancel: 'onDragEnd',\n };\n})(Dnd || (Dnd = {}));\n//# sourceMappingURL=index.js.map","import { Model } from '../model/model';\nexport function grid(cells, options = {}) {\n const model = Model.isModel(cells)\n ? cells\n : new Model().resetCells(cells, {\n sort: false,\n dryrun: true,\n });\n const nodes = model.getNodes();\n const columns = options.columns || 1;\n const rows = Math.ceil(nodes.length / columns);\n const dx = options.dx || 0;\n const dy = options.dy || 0;\n const centre = options.center !== false;\n const resizeToFit = options.resizeToFit === true;\n const marginX = options.marginX || 0;\n const marginY = options.marginY || 0;\n const columnWidths = [];\n let columnWidth = options.columnWidth;\n if (columnWidth === 'compact') {\n for (let j = 0; j < columns; j += 1) {\n const items = GridLayout.getNodesInColumn(nodes, j, columns);\n columnWidths.push(GridLayout.getMaxDim(items, 'width') + dx);\n }\n }\n else {\n if (columnWidth == null || columnWidth === 'auto') {\n columnWidth = GridLayout.getMaxDim(nodes, 'width') + dx;\n }\n for (let i = 0; i < columns; i += 1) {\n columnWidths.push(columnWidth);\n }\n }\n const columnLefts = GridLayout.accumulate(columnWidths, marginX);\n const rowHeights = [];\n let rowHeight = options.rowHeight;\n if (rowHeight === 'compact') {\n for (let i = 0; i < rows; i += 1) {\n const items = GridLayout.getNodesInRow(nodes, i, columns);\n rowHeights.push(GridLayout.getMaxDim(items, 'height') + dy);\n }\n }\n else {\n if (rowHeight == null || rowHeight === 'auto') {\n rowHeight = GridLayout.getMaxDim(nodes, 'height') + dy;\n }\n for (let i = 0; i < rows; i += 1) {\n rowHeights.push(rowHeight);\n }\n }\n const rowTops = GridLayout.accumulate(rowHeights, marginY);\n model.startBatch('layout');\n nodes.forEach((node, index) => {\n const rowIndex = index % columns;\n const columnIndex = Math.floor(index / columns);\n const columnWidth = columnWidths[rowIndex];\n const rowHeight = rowHeights[columnIndex];\n let cx = 0;\n let cy = 0;\n let size = node.getSize();\n if (resizeToFit) {\n let width = columnWidth - 2 * dx;\n let height = rowHeight - 2 * dy;\n const calcHeight = size.height * (size.width ? width / size.width : 1);\n const calcWidth = size.width * (size.height ? height / size.height : 1);\n if (rowHeight < calcHeight) {\n width = calcWidth;\n }\n else {\n height = calcHeight;\n }\n size = {\n width,\n height,\n };\n node.setSize(size, options);\n }\n if (centre) {\n cx = (columnWidth - size.width) / 2;\n cy = (rowHeight - size.height) / 2;\n }\n node.position(columnLefts[rowIndex] + dx + cx, rowTops[columnIndex] + dy + cy, options);\n });\n model.stopBatch('layout');\n}\nvar GridLayout;\n(function (GridLayout) {\n function getMaxDim(nodes, name) {\n return nodes.reduce((memo, node) => Math.max(node.getSize()[name], memo), 0);\n }\n GridLayout.getMaxDim = getMaxDim;\n function getNodesInRow(nodes, rowIndex, columnCount) {\n const res = [];\n for (let i = columnCount * rowIndex, ii = i + columnCount; i < ii; i += 1) {\n res.push(nodes[i]);\n }\n return res;\n }\n GridLayout.getNodesInRow = getNodesInRow;\n function getNodesInColumn(nodes, columnIndex, columnCount) {\n const res = [];\n for (let i = columnIndex, ii = nodes.length; i < ii; i += columnCount) {\n res.push(nodes[i]);\n }\n return res;\n }\n GridLayout.getNodesInColumn = getNodesInColumn;\n function accumulate(items, start) {\n return items.reduce((memo, item, i) => {\n memo.push(memo[i] + item);\n return memo;\n }, [start || 0]);\n }\n GridLayout.accumulate = accumulate;\n})(GridLayout || (GridLayout = {}));\n//# sourceMappingURL=grid.js.map","import { FunctionExt } from '../../util';\nimport { grid } from '../../layout/grid';\nimport { Node } from '../../model/node';\nimport { Model } from '../../model/model';\nimport { View } from '../../view/view';\nimport { Graph } from '../../graph/graph';\nimport { Dnd } from '../dnd';\nexport class Stencil extends View {\n constructor(options) {\n super();\n this.graphs = {};\n this.$groups = {};\n this.options = Object.assign(Object.assign({}, Stencil.defaultOptions), options);\n this.dnd = new Dnd(this.options);\n this.onSearch = FunctionExt.debounce(this.onSearch, 200);\n this.container = document.createElement('div');\n this.$container = this.$(this.container)\n .addClass(this.prefixClassName(ClassNames.base))\n .attr('data-not-found-text', this.options.notFoundText || 'No matches found');\n this.options.collapsable =\n options.collapsable &&\n options.groups &&\n options.groups.some((group) => group.collapsable !== false);\n if (this.options.collapsable) {\n this.$container.addClass('collapsable');\n const collapsed = options.groups &&\n options.groups.every((group) => group.collapsed || group.collapsable === false);\n if (collapsed) {\n this.$container.addClass('collapsed');\n }\n }\n this.$('<div/>')\n .addClass(this.prefixClassName(ClassNames.title))\n .html(this.options.title)\n .appendTo(this.$container);\n if (options.search) {\n this.$container.addClass('searchable').append(this.renderSearch());\n }\n this.$content = this.$('<div/>')\n .addClass(this.prefixClassName(ClassNames.content))\n .appendTo(this.$container);\n const globalGraphOptions = options.stencilGraphOptions || {};\n if (options.groups && options.groups.length) {\n options.groups.forEach((group) => {\n const $group = this.$('<div/>')\n .addClass(this.prefixClassName(ClassNames.group))\n .attr('data-name', group.name);\n if ((group.collapsable == null && options.collapsable) ||\n group.collapsable !== false) {\n $group.addClass('collapsable');\n }\n $group.toggleClass('collapsed', group.collapsed === true);\n const $title = this.$('<h3/>')\n .addClass(this.prefixClassName(ClassNames.groupTitle))\n .html(group.title || group.name);\n const $content = this.$('<div/>').addClass(this.prefixClassName(ClassNames.groupContent));\n const graphOptionsInGroup = group.graphOptions;\n const graph = new Graph(Object.assign(Object.assign(Object.assign({}, globalGraphOptions), graphOptionsInGroup), { container: document.createElement('div'), model: globalGraphOptions.model || new Model(), width: group.graphWidth || options.stencilGraphWidth, height: group.graphHeight || options.stencilGraphHeight, interacting: false, preventDefaultBlankAction: false }));\n $content.append(graph.container);\n $group.append($title, $content).appendTo(this.$content);\n this.$groups[group.name] = $group;\n this.graphs[group.name] = graph;\n });\n }\n else {\n const graph = new Graph(Object.assign(Object.assign({}, globalGraphOptions), { container: document.createElement('div'), model: globalGraphOptions.model || new Model(), width: options.stencilGraphWidth, height: options.stencilGraphHeight, interacting: false, preventDefaultBlankAction: false }));\n this.$content.append(graph.container);\n this.graphs[Private.defaultGroupName] = graph;\n }\n this.startListening();\n return this;\n }\n get targetScroller() {\n const target = this.options.target;\n return Graph.isGraph(target) ? target.scroller.widget : target;\n }\n get targetGraph() {\n const target = this.options.target;\n return Graph.isGraph(target) ? target : target.graph;\n }\n get targetModel() {\n return this.targetGraph.model;\n }\n renderSearch() {\n return this.$('<div/>')\n .addClass(this.prefixClassName(ClassNames.search))\n .append(this.$('<input/>')\n .attr({\n type: 'search',\n placeholder: this.options.placeholder || 'Search',\n })\n .addClass(this.prefixClassName(ClassNames.searchText)));\n }\n startListening() {\n const title = this.prefixClassName(ClassNames.title);\n const searchText = this.prefixClassName(ClassNames.searchText);\n const groupTitle = this.prefixClassName(ClassNames.groupTitle);\n this.delegateEvents({\n [`click .${title}`]: 'onTitleClick',\n [`touchstart .${title}`]: 'onTitleClick',\n [`click .${groupTitle}`]: 'onGroupTitleClick',\n [`touchstart .${groupTitle}`]: 'onGroupTitleClick',\n [`input .${searchText}`]: 'onSearch',\n [`focusin .${searchText}`]: 'onSearchFocusIn',\n [`focusout .${searchText}`]: 'onSearchFocusOut',\n });\n Object.keys(this.graphs).forEach((groupName) => {\n const graph = this.graphs[groupName];\n graph.on('cell:mousedown', this.onDragStart, this);\n });\n }\n stopListening() {\n this.undelegateEvents();\n Object.keys(this.graphs).forEach((groupName) => {\n const graph = this.graphs[groupName];\n graph.off('cell:mousedown', this.onDragStart, this);\n });\n }\n load(data, groupName) {\n if (Array.isArray(data)) {\n this.loadGroup(data, groupName);\n }\n else if (this.options.groups) {\n Object.keys(this.options.groups).forEach((groupName) => {\n if (data[groupName]) {\n this.loadGroup(data[groupName], groupName);\n }\n });\n }\n return this;\n }\n loadGroup(cells, groupName) {\n const model = this.getModel(groupName);\n if (model) {\n const nodes = cells.map((cell) => Node.isNode(cell) ? cell : Node.create(cell));\n model.resetCells(nodes);\n }\n const group = this.getGroup(groupName);\n let height = this.options.stencilGraphHeight;\n if (group && group.graphHeight != null) {\n height = group.graphHeight;\n }\n const layout = (group && group.layout) || this.options.layout;\n if (layout && model) {\n FunctionExt.call(layout, this, model, group);\n }\n if (!height) {\n const graph = this.getGraph(groupName);\n graph.fitToContent({\n minWidth: graph.options.width,\n gridHeight: 1,\n padding: (group && group.graphPadding) ||\n this.options.stencilGraphPadding ||\n 10,\n });\n }\n return this;\n }\n onDragStart(args) {\n const { e, node } = args;\n this.dnd.start(node, e);\n }\n filter(keyword, filter) {\n const found = Object.keys(this.graphs).reduce((memo, groupName) => {\n const graph = this.graphs[groupName];\n const name = groupName === Private.defaultGroupName ? null : groupName;\n const items = graph.model.getNodes().filter((cell) => {\n let matched = false;\n if (typeof filter === 'function') {\n matched = FunctionExt.call(filter, this, cell, keyword, name, this);\n }\n else if (typeof filter === 'boolean') {\n matched = filter;\n }\n else {\n matched = this.isCellMatched(cell, keyword, filter, keyword.toLowerCase() !== keyword);\n }\n const view = graph.renderer.findViewByCell(cell);\n if (view) {\n view.$(view.container).toggleClass('unmatched', !matched);\n }\n return matched;\n });\n const found = items.length > 0;\n const options = this.options;\n const model = new Model();\n model.resetCells(items);\n if (options.layout) {\n FunctionExt.call(options.layout, this, model, this.getGroup(groupName));\n }\n if (this.$groups[groupName]) {\n this.$groups[groupName].toggleClass('unmatched', !found);\n }\n graph.fitToContent({\n gridWidth: 1,\n gridHeight: 1,\n padding: options.stencilGraphPadding || 10,\n });\n return memo || found;\n }, false);\n this.$container.toggleClass('not-found', !found);\n }\n isCellMatched(cell, keyword, filters, ignoreCase) {\n if (keyword && filters) {\n return Object.keys(filters).some((shape) => {\n if (shape === '*' || cell.shape === shape) {\n const filter = filters[shape];\n if (typeof filter === 'boolean') {\n return filter;\n }\n const paths = Array.isArray(filter) ? filter : [filter];\n return paths.some((path) => {\n let val = cell.getPropByPath(path);\n if (val != null) {\n val = `${val}`;\n if (!ignoreCase) {\n val = val.toLowerCase();\n }\n return val.indexOf(keyword) >= 0;\n }\n return false;\n });\n }\n return false;\n });\n }\n return true;\n }\n onSearch(evt) {\n this.filter(evt.target.value, this.options.search);\n }\n onSearchFocusIn() {\n this.$container.addClass('is-focused');\n }\n onSearchFocusOut() {\n this.$container.removeClass('is-focused');\n }\n onTitleClick() {\n if (this.options.collapsable) {\n this.$container.toggleClass('collapsed');\n if (this.$container.hasClass('collapsed')) {\n this.collapseGroups();\n }\n else {\n this.expandGroups();\n }\n }\n }\n onGroupTitleClick(evt) {\n const $group = this.$(evt.target).closest(`.${this.prefixClassName(ClassNames.group)}`);\n this.toggleGroup($group.attr('data-name') || '');\n const allCollapsed = Object.keys(this.$groups).every((name) => {\n const group = this.getGroup(name);\n const $group = this.$groups[name];\n return ((group && group.collapsable === false) || $group.hasClass('collapsed'));\n });\n this.$container.toggleClass('collapsed', allCollapsed);\n }\n getModel(groupName) {\n const graph = this.getGraph(groupName);\n return graph ? graph.model : null;\n }\n getGraph(groupName) {\n return this.graphs[groupName || Private.defaultGroupName];\n }\n getGroup(groupName) {\n const groups = this.options.groups;\n if (groupName != null && groups && groups.length) {\n return groups.find((group) => group.name === groupName);\n }\n return null;\n }\n toggleGroup(groupName) {\n if (this.isGroupCollapsed(groupName)) {\n this.expandGroup(groupName);\n }\n else {\n this.collapseGroup(groupName);\n }\n return this;\n }\n collapseGroup(groupName) {\n if (this.isGroupCollapsable(groupName)) {\n const $group = this.$groups[groupName];\n if ($group && !this.isGroupCollapsed(groupName)) {\n this.trigger('group:collapse', { name: groupName });\n $group.addClass('collapsed');\n }\n }\n return this;\n }\n expandGroup(groupName) {\n if (this.isGroupCollapsable(groupName)) {\n const $group = this.$groups[groupName];\n if ($group && this.isGroupCollapsed(groupName)) {\n this.trigger('group:expand', { name: groupName });\n $group.removeClass('collapsed');\n }\n }\n return this;\n }\n isGroupCollapsable(groupName) {\n const $group = this.$groups[groupName];\n return $group.hasClass('collapsable');\n }\n isGroupCollapsed(groupName) {\n const $group = this.$groups[groupName];\n return $group && $group.hasClass('collapsed');\n }\n collapseGroups() {\n Object.keys(this.$groups).forEach((groupName) => this.collapseGroup(groupName));\n return this;\n }\n expandGroups() {\n Object.keys(this.$groups).forEach((groupName) => this.expandGroup(groupName));\n return this;\n }\n resizeGroup(groupName, size) {\n const graph = this.graphs[groupName];\n if (graph) {\n graph.resize(size.width, size.height);\n }\n return this;\n }\n onRemove() {\n Object.keys(this.graphs).forEach((groupName) => {\n const graph = this.graphs[groupName];\n graph.view.remove();\n delete this.graphs[groupName];\n });\n this.dnd.remove();\n this.stopListening();\n this.undelegateDocumentEvents();\n }\n}\n(function (Stencil) {\n Stencil.defaultOptions = Object.assign({ stencilGraphWidth: 200, stencilGraphHeight: 800, title: 'Stencil', collapsable: false, placeholder: 'Search', notFoundText: 'No matches found', layout(model, group) {\n const options = {\n columnWidth: this.options.stencilGraphWidth / 2 - 10,\n columns: 2,\n rowHeight: 80,\n resizeToFit: false,\n dx: 10,\n dy: 10,\n };\n grid(model, Object.assign(Object.assign(Object.assign({}, options), this.options.layoutOptions), (group ? group.layoutOptions : {})));\n } }, Dnd.defaults);\n})(Stencil || (Stencil = {}));\nvar ClassNames;\n(function (ClassNames) {\n ClassNames.base = 'widget-stencil';\n ClassNames.title = `${ClassNames.base}-title`;\n ClassNames.search = `${ClassNames.base}-search`;\n ClassNames.searchText = `${ClassNames.search}-text`;\n ClassNames.content = `${ClassNames.base}-content`;\n ClassNames.group = `${ClassNames.base}-group`;\n ClassNames.groupTitle = `${ClassNames.group}-title`;\n ClassNames.groupContent = `${ClassNames.group}-content`;\n})(ClassNames || (ClassNames = {}));\nvar Private;\n(function (Private) {\n Private.defaultGroupName = '__default__';\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","/* eslint-disable */\n/**\n * Auto generated version file, do not modify it!\n */\nconst version = '1.30.1';\nexport { version };\n//# sourceMappingURL=version.js.map","import { Config } from './config';\nimport { version } from './version';\nfunction track() {\n if (Config.trackable) {\n const host = 'https://kcart.alipay.com/web/bi.do';\n const img = new Image();\n const metadata = Object.assign(Object.assign({}, Config.trackInfo), { version, pg: document.URL, r: new Date().getTime(), x6: true, page_type: 'syslog' });\n const data = encodeURIComponent(JSON.stringify([metadata]));\n img.src = `${host}?BIProfile=merge&d=${data}`;\n }\n}\nif (process.env.NODE_ENV !== 'development' && Config.trackable) {\n setTimeout(track, 3000);\n}\n//# sourceMappingURL=track.js.map","\r\nexport const formatter = {\r\n formatColumnType(column) {\r\n const ignoreLengthTypes = ['timestamp', 'json', 'bool']\r\n // 长度\r\n if (column.decimalDigits == null || column.decimalDigits == 0 || ignoreLengthTypes.some(type => type == column.type.toLowerCase())) {\r\n return column.type + '('+column.size+')' \r\n } else {\r\n return column.type + '('+column.size+', '+column.decimalDigits+')'\r\n }\r\n },\r\n\r\n formatColumnName(column, withComment) {\r\n if (withComment) {\r\n if (column.comment && column.comment != '') {\r\n return column.name + ' /* ' + column.comment +' */'\r\n }\r\n } \r\n return column.name\r\n }\r\n}","import { render } from \"./Diagram.vue?vue&type=template&id=2323b64a\"\nimport script from \"./Diagram.vue?vue&type=script&lang=js\"\nexport * from \"./Diagram.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\r\n <!-- remarks -->\r\n <el-drawer\r\n v-model=\"show\"\r\n size=\"50%\"\r\n >\r\n <template #title>\r\n <h2>{{ title }}</h2>\r\n </template>\r\n <el-row v-for=\"(remark, index) in pageData.content\" :key=\"index\">\r\n <el-col>\r\n <el-card shadow=\"never\" class=\"remark-card\"> \r\n <template #header>\r\n <div class=\"remark-header\">\r\n <span>\r\n <span class=\"remark-user\">{{remark.remarkBy.nickname}}</span> \r\n <span class=\"remark-time\">{{remark.createAt}}</span>\r\n </span>\r\n <span v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+groupId, 'GROUP_MEMBER?groupId='+groupId]\">\r\n<el-popconfirm\r\n confirm-button-text=\"确定\"\r\n cancel-button-text=\"取消\"\r\n icon=\"InfoFilled\"\r\n icon-color=\"red\"\r\n title=\"确定要删除该记录吗?\"\r\n @confirm=\"onDeleteRemark(remark.id)\"\r\n >\r\n <template #reference>\r\n <el-button type=\"danger\" icon=\"Delete\" circle plain size=\"small\"></el-button>\r\n </template>\r\n </el-popconfirm>\r\n </span>\r\n \r\n </div>\r\n </template>\r\n <div class=\"item text remark-content\">\r\n {{ remark.remark }}\r\n </div>\r\n </el-card>\r\n </el-col>\r\n </el-row>\r\n <el-row v-if=\"pageData.content.length == 0\">\r\n <el-col>\r\n <el-empty></el-empty>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row>\r\n <el-col>\r\n <el-pagination layout=\"prev, pager, next\" \r\n :hide-on-single-page=\"false\"\r\n :currentPage=\"pageData.page\" \r\n :page-size=\"pageData.size\" \r\n :page-count=\"pageData.totalPages\"\r\n @current-change=\"onRemarkPageChange\">\r\n </el-pagination>\r\n </el-col>\r\n </el-row>\r\n <el-divider></el-divider>\r\n <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+this.groupId, 'GROUP_MEMBER?groupId='+this.groupId]\">\r\n <el-col>\r\n <el-input\r\n v-model=\"formData.remark\"\r\n :rows=\"5\"\r\n type=\"textarea\" \r\n placeholder=\"请输入内容\"\r\n />\r\n </el-col>\r\n </el-row>\r\n <el-divider></el-divider>\r\n\r\n <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+this.groupId, 'GROUP_MEMBER?groupId='+this.groupId]\">\r\n <el-col>\r\n <el-button @click=\"onCreateRemark\">提交</el-button>\r\n </el-col>\r\n </el-row>\r\n </el-drawer>\r\n</template>\r\n\r\n<style>\r\n.text {\r\n font-size: 14px;\r\n line-height: 1.3rem;\r\n}\r\n\r\n.item {\r\n margin-top: 10px;\r\n margin-right: 40px;\r\n}\r\n\r\n.remark-card {\r\n margin-bottom: 30px;\r\n}\r\n\r\n.remark-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.remark-header .remark-user {\r\n color: rgb(109, 109, 109);\r\n}\r\n\r\n.remark-header .remark-time {\r\n color: rgb(109, 109, 109);\r\n font-size: 0.8rem;\r\n margin-left: 10px;\r\n}\r\n\r\n.remark-content {\r\n white-space: pre-wrap;\r\n text-align: left;\r\n}\r\n\r\n</style>\r\n\r\n<script>\r\nimport { listRemarks, createRemark, deleteRemark } from '@/api/DocumentRemark'\r\n\r\n\r\nexport default {\r\n props: ['groupId', 'projectId', 'tableName', 'columnName', 'isShowDrawer'],\r\n emits: ['onClose'],\r\n\r\n data() {\r\n return {\r\n formData: {\r\n remark: null,\r\n },\r\n pageFilter: {\r\n page: 0,\r\n size: 5,\r\n tableName: null,\r\n columnName: null\r\n },\r\n pageData: {\r\n content: [],\r\n page: 0,\r\n size: 10,\r\n totalPages: 0\r\n },\r\n show: this.isShowDrawer,\r\n }\r\n },\r\n\r\n computed: {\r\n title() {\r\n const columnName = this.columnName ? '.'+this.columnName:''\r\n return \"[\"+this.tableName+columnName+\"]\"\r\n }\r\n },\r\n\r\n watch: {\r\n 'isShowDrawer': {\r\n deep: false,\r\n handler(val) {\r\n if (val) {\r\n this.showRemarkDrawer()\r\n }\r\n }\r\n },\r\n\r\n show: {\r\n deep: false,\r\n handler(val) {\r\n if (!val) {\r\n this.closeRemarkDrawer(val)\r\n } else {\r\n this.showRemarkDrawer()\r\n }\r\n }\r\n }\r\n },\r\n\r\n methods: {\r\n onCreateRemark() {\r\n if(!this.formData.remark || this.formData.remark == '') {\r\n this.$message.error('内容不能为空')\r\n return\r\n }\r\n const body = {\r\n tableName: this.pageFilter.tableName,\r\n columnName: this.pageFilter.columnName,\r\n remark: this.formData.remark\r\n }\r\n createRemark(this.groupId, this.projectId, body).then(resp => {\r\n if(!resp.errCode) {\r\n this.formData.remark = null\r\n this.$message.success('提交成功')\r\n this.onRemarkPageChange(1)\r\n }\r\n })\r\n },\r\n onDeleteRemark(remarkId) {\r\n deleteRemark(this.groupId, this.projectId, remarkId).then(resp => {\r\n if(!resp.errCode) {\r\n this.$message.success('删除成功')\r\n this.onRemarkPageChange(1)\r\n }\r\n })\r\n },\r\n onRemarkPageChange(currentPage) {\r\n this.pageFilter.page = currentPage - 1\r\n listRemarks(this.groupId, this.projectId, this.pageFilter).then(resp => {\r\n this.pageData = resp.data\r\n this.pageData.page = resp.data.number + 1\r\n })\r\n },\r\n\r\n showRemarkDrawer() {\r\n if (this.tableName) {\r\n this.pageFilter.tableName = this.tableName\r\n } else {\r\n this.pageFilter.tableName = null\r\n }\r\n if(this.columnName) {\r\n this.pageFilter.columnName = this.columnName\r\n } else {\r\n this.pageFilter.columnName = null\r\n }\r\n\r\n listRemarks(this.groupId, this.projectId, this.pageFilter).then(resp => {\r\n this.pageData = resp.data\r\n this.pageData.page = resp.data.number + 1\r\n this.show = true\r\n })\r\n },\r\n\r\n closeRemarkDrawer() {\r\n this.$emit('onClose', this.show)\r\n }\r\n }\r\n}\r\n</script>","import axios from '@/utils/fetch';\r\n\r\nconst base = '/api/v1.0'\r\n\r\nexport const deleteRemark = (groupId, projectId, remarkId) => {\r\n return axios.delete(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks/'+remarkId)\r\n}\r\n\r\nexport const createRemark = (groupId, projectId, body) => {\r\n return axios.post(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', body)\r\n}\r\n\r\nexport const listRemarks = (groupId, projectId, parameters) => {\r\n return axios.get(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', {\r\n params: parameters\r\n })\r\n}\r\n\r\n","import { render } from \"./DocumentRemark.vue?vue&type=template&id=06ea5702\"\nimport script from \"./DocumentRemark.vue?vue&type=script&lang=js\"\nexport * from \"./DocumentRemark.vue?vue&type=script&lang=js\"\n\nimport \"./DocumentRemark.vue?vue&type=style&index=0&id=06ea5702&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\r\n <el-row v-if=\"overviewData\" style=\"margin-top:0px !important;\">\r\n <el-col :span=\"24\">\r\n <!-- database overview -->\r\n <h2 id=\"overview[-1]\">Overview</h2>\r\n <el-descriptions :column=\"1\" size=\"large\" border>\r\n <el-descriptions-item label=\"Database Name\" label-align=\"left\" width='200px'>{{ overviewData.databaseName }}</el-descriptions-item>\r\n <el-descriptions-item label=\"Product Name\" label-align=\"left\">{{ overviewData.productName }}</el-descriptions-item>\r\n <el-descriptions-item label=\"Product Version\" label-align=\"left\">{{ overviewData.productVersion }}</el-descriptions-item>\r\n <el-descriptions-item label=\"Document Version\" label-align=\"left\">{{ overviewData.documentVersion }}</el-descriptions-item>\r\n <el-descriptions-item label=\"Create At\" label-align=\"left\">{{ overviewData.createAt }}</el-descriptions-item>\r\n </el-descriptions>\r\n <h3>Tables</h3>\r\n <el-table :data=\"tableList\" border stripe width='80%'>\r\n <el-table-column type=\"index\" />\r\n <el-table-column prop=\"name\" label=\"Name\" min-width=\"160\" resizable />\r\n <el-table-column prop=\"type\" label=\"Type\" width=\"200\" resizable />\r\n <el-table-column prop=\"comment\" label=\"comment\" min-width=\"160\" resizable />\r\n <el-table-column prop=\"remark\" label=\"discussion\" min-width=\"120\" resizable >\r\n <template v-slot=\"scope\">\r\n <el-button @click=\"onRemark(scope.row.name)\" size=\"small\" icon=\"chat-line-round\"></el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-col>\r\n </el-row>\r\n <el-row v-for=\"tableMeta in tablesData\" :key=\"tableMeta.id\" style=\"margin-top:0px !important;\">\r\n <el-col :span=\"24\">\r\n <h2 :id=\"tableMeta.name+'['+tableMeta.id+']'\">{{ tableMeta.name }}</h2>\r\n <h3 v-if=\"tableMeta.columns.length > 0\">Columns</h3>\r\n <el-table :data=\"tableMeta.columns\" border stripe fit width='80%'>\r\n <el-table-column type=\"index\" />\r\n <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\r\n <el-table-column prop=\"type\" :formatter=\"columnTypeFormat\" label=\"Type\" width=\"140\" />\r\n <el-table-column label=\"Primary Key\" width=\"120\"> \r\n <template v-slot=\"scope\">\r\n <el-tooltip content=\"YES\" v-if=\"scope.row.isPrimaryKey\">\r\n <el-tag>\r\n PK\r\n </el-tag>\r\n </el-tooltip>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"nullable\" label=\"Is Nullable\" width=\"120\">\r\n <template v-slot=\"scope\">\r\n <!-- {{ scope.row.nullable == 'YES' ? 'YES':''}} -->\r\n <el-tooltip content=\"NO\" v-if=\"scope.row.nullable != 'YES'\">\r\n <el-tag type=\"info\">\r\n <del><em>null</em></del>\r\n </el-tag>\r\n </el-tooltip>\r\n <el-tooltip content=\"YES\" v-else>\r\n <el-tag type=\"danger\">\r\n <em>null</em>\r\n </el-tag>\r\n </el-tooltip>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"autoIncrement\" label=\"Auto Increment\" width=\"140\">\r\n <template v-slot=\"scope\">\r\n <el-tag v-if=\"scope.row.autoIncrement == 'YES'\">\r\n YES\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"defaultValue\" label=\"default\" min-width=\"120\" />\r\n <el-table-column prop=\"comment\" label=\"comment\" />\r\n <el-table-column prop=\"remark\" label=\"discussion\" min-width=\"60\" resizable>\r\n <template v-slot=\"scope\">\r\n <el-button @click=\"onRemark(tableMeta.name, scope.row.name)\" size=\"small\" icon=\"chat-line-round\"></el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n \r\n <div v-if=\"tableMeta.indexes.length > 0\">\r\n <h3>Indexes</h3> \r\n <el-table :data=\"tableMeta.indexes\" border stripe fit width='80%'>\r\n <el-table-column type=\"index\" />\r\n <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\r\n <el-table-column prop=\"isUnique\" label=\"Is Unique\" width=\"120\">\r\n <template v-slot=\"scope\">\r\n <el-tooltip content=\"YES\" v-if=\"scope.row.isUnique\">\r\n <el-tag>\r\n UK\r\n </el-tag>\r\n </el-tooltip>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"Columns\" min-width=\"150\">\r\n <template v-slot=\"scope\">\r\n <el-space>\r\n <el-tag v-for=\"(item, index) in scope.row.columnNames\" :key=\"index\" type=\"info\">\r\n {{ item }}\r\n </el-tag>\r\n </el-space>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </div>\r\n \r\n <div v-if=\"tableMeta.triggers.length > 0\">\r\n <h3>Triggers</h3>\r\n <el-table :data=\"tableMeta.triggers\" stripe fit border width='80%'>\r\n <el-table-column type=\"index\" />\r\n <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\r\n <el-table-column prop=\"timing\" label=\"timing\" />\r\n <el-table-column prop=\"manipulation\" label=\"manipulation\" width=\"120\" />\r\n <el-table-column prop=\"statement\" label=\"statement\" />\r\n <el-table-column prop=\"creatAt\" label=\"creatAt\" width=\"150\" />\r\n </el-table>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n</template>\r\n\r\n<script>\r\n\r\nexport default {\r\n props: ['overviewData', 'tablesData'],\r\n emits: ['onRemark'],\r\n\r\n computed: {\r\n tableList() {\r\n return this.overviewData.tables.filter(d => d.id != -1)\r\n }\r\n },\r\n methods: {\r\n\r\n onRemark(tableName, columnName) {\r\n this.$emit('onRemark', tableName, columnName)\r\n },\r\n\r\n columnNameArray(columnNames) {\r\n if (columnNames) {\r\n return columnNames.split(',')\r\n } else {\r\n return []\r\n }\r\n },\r\n\r\n columnTypeFormat(column){\r\n if (column.decimalDigits == null) {\r\n return column.type + '('+column.size+')' \r\n } else {\r\n return column.type + '('+column.size+', '+column.decimalDigits+')'\r\n }\r\n },\r\n }\r\n}\r\n\r\n</script>","import { render } from \"./DocumentList.vue?vue&type=template&id=b26328e6\"\nimport script from \"./DocumentList.vue?vue&type=script&lang=js\"\nexport * from \"./DocumentList.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Document.vue?vue&type=template&id=3f912d54\"\nimport script from \"./Document.vue?vue&type=script&lang=js\"\nexport * from \"./Document.vue?vue&type=script&lang=js\"\n\nimport \"./Document.vue?vue&type=style&index=0&id=3f912d54&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["global","bind","call","toObject","callWithSafeIterationClosing","isArrayIteratorMethod","isConstructor","lengthOfArrayLike","createProperty","getIterator","getIteratorMethod","Array","module","exports","arrayLike","O","IS_CONSTRUCTOR","this","argumentsLength","arguments","length","mapfn","undefined","mapping","result","step","iterator","next","value","iteratorMethod","index","done","toAbsoluteIndex","max","Math","start","end","k","fin","n","arraySlice","floor","mergeSort","array","comparefn","middle","insertionSort","merge","element","j","i","left","right","llength","rlength","lindex","rindex","anObject","iteratorClose","fn","ENTRIES","error","toPropertyKey","definePropertyModule","createPropertyDescriptor","object","key","propertyKey","f","fails","wellKnownSymbol","IS_PURE","ITERATOR","url","URL","searchParams","pathname","forEach","toJSON","sort","href","get","String","URLSearchParams","username","host","hash","uncurryThis","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","RangeError","exec","fromCharCode","charCodeAt","join","push","replace","split","toLowerCase","ucs2decode","string","output","counter","extra","digitToBasic","digit","adapt","delta","numPoints","firstTime","encode","input","currentValue","inputLength","bias","basicLength","handledCPCount","m","handledCPCountPlusOne","q","t","qMinusT","baseMinusT","label","encoded","labels","$","$filter","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","filter","callbackfn","from","checkCorrectnessOfIteration","INCORRECT_ITERATION","iterable","stat","apply","fixRegExpWellKnownSymbolLogic","isRegExp","requireObjectCoercible","speciesConstructor","advanceStringIndex","toLength","toString","getMethod","callRegExpExec","regexpExec","stickyHelpers","UNSUPPORTED_Y","MAX_UINT32","min","$push","stringSlice","slice","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","re","originalExec","SPLIT","nativeSplit","maybeCallNative","internalSplit","separator","limit","lim","match","lastIndex","lastLength","flags","ignoreCase","multiline","unicode","sticky","lastLastIndex","separatorCopy","RegExp","source","splitter","rx","S","res","C","unicodeMatching","p","A","e","z","getBuiltIn","USE_NATIVE_URL","redefine","redefineAll","setToStringTag","createIteratorConstructor","InternalStateModule","anInstance","isCallable","hasOwn","classof","isObject","$toString","create","arraySort","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","setInternalState","set","getInternalParamsState","getterFor","getInternalIteratorState","n$Fetch","N$Request","Headers","RequestPrototype","prototype","HeadersPrototype","TypeError","decodeURIComponent","encodeURIComponent","charAt","shift","splice","plus","sequences","percentSequence","bytes","percentDecode","sequence","deserialize","it","find","replacements","replacer","serialize","validateArgumentsLength","passed","required","URLSearchParamsIterator","params","kind","type","entries","state","entry","URLSearchParamsState","init","parseObject","parseQuery","bindURL","update","entryIterator","entryNext","first","second","query","attribute","attributes","updateURL","URLSearchParamsConstructor","URLSearchParamsPrototype","append","name","getAll","has","found","val","a","b","callback","boundFunction","keys","values","enumerable","headersHas","headersSet","wrapRequestOptions","headers","body","fetch","RequestConstructor","constructor","Request","getState","EOF","DESCRIPTORS","defineProperties","assign","arrayFrom","codeAt","toASCII","URLSearchParamsModule","getInternalURLState","getInternalSearchParamsState","NativeURL","parseInt","pow","numberToString","pop","unshift","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseIPv4","partsLength","numbers","part","radix","number","ipv4","parts","parseIPv6","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","chr","findLongestZeroSequence","ipv6","maxIndex","maxLength","currStart","currLength","serializeHost","ignore0","C0ControlPercentEncodeSet","fragmentPercentEncodeSet","pathPercentEncodeSet","userinfoPercentEncodeSet","percentEncode","code","specialSchemes","ftp","file","http","https","ws","wss","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","isSingleDot","segment","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","URLState","isBase","baseState","failure","urlString","parse","stateOverride","codePoints","bufferCodePoints","buffer","seenAt","seenBracket","seenPasswordToken","scheme","password","port","path","fragment","cannotBeABaseURL","isSpecial","includesCredentials","codePoint","encodedCodePoints","parseHost","shortenPath","cannotHaveUsernamePasswordPort","pathSize","setHref","getOrigin","URLConstructor","origin","getProtocol","setProtocol","protocol","getUsername","setUsername","getPassword","setPassword","getHost","setHost","getHostname","setHostname","hostname","getPort","setPort","getPathname","setPathname","getSearch","setSearch","search","getSearchParams","facade","getHash","setHash","that","URLPrototype","accessorDescriptor","getter","setter","configurable","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","sham","factory","nullLowestDeltaTimeout","lowestDelta","toFix","toBind","document","documentMode","event","fixHooks","mouseHooks","special","mousewheel","version","setup","addEventListener","handler","onmousewheel","data","getLineHeight","getPageHeight","teardown","removeEventListener","removeData","elem","$elem","$parent","css","height","settings","adjustOldDeltas","normalizeOffset","orgEvent","window","args","deltaX","deltaY","absDelta","offsetX","offsetY","fix","detail","wheelDelta","wheelDeltaY","wheelDeltaX","axis","HORIZONTAL_AXIS","deltaMode","lineHeight","pageHeight","abs","shouldAdjustOldDeltas","getBoundingClientRect","boundingRect","clientX","clientY","top","deltaFactor","clearTimeout","setTimeout","nullLowestDelta","dispatch","handle","extend","trigger","unmousewheel","unbind","w","Error","noGlobal","arr","getProto","Object","getPrototypeOf","flat","concat","indexOf","class2type","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","src","nonce","noModule","DOMEval","node","doc","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","jQuery","selector","context","isArrayLike","jquery","toArray","num","pushStack","elems","ret","prevObject","each","map","eq","last","even","grep","_elem","odd","len","options","copy","copyIsArray","clone","deep","isPlainObject","isArray","expando","random","isReady","msg","noop","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","invert","callbackInverse","matches","callbackExpect","arg","guid","Symbol","_i","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","pushNative","list","booleans","whitespace","identifier","pseudos","rwhitespace","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","rcssescape","fcssescape","ch","asCodePoint","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","childNodes","els","seed","nid","groups","newSelector","newContext","ownerDocument","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","querySelectorAll","qsaError","removeAttribute","cache","cacheLength","markFunction","assert","el","addHandle","attrs","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","attachEvent","className","createComment","getById","getElementsByName","attrId","getAttributeNode","tag","tmp","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","matcher","unmatched","lang","elemLang","location","activeElement","hasFocus","tabIndex","checked","selected","selectedIndex","_matchIndexes","radio","checkbox","image","submit","reset","tokens","combinator","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","filters","parseOnly","soFar","preFilters","cached","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","rneedsContext","needsContext","rsingleTag","winnow","qualifier","not","self","rootjQuery","root","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","createOptions","_","flag","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","empty","disable","lock","fireWith","Deferred","func","tuples","always","deferred","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","mightThrow","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","catch","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","acceptData","owner","Data","uid","defineProperty","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","JSON","dataAttr","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","clearQueue","count","defer","pnum","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","show","hide","toggle","rcheckableType","rtagName","rscriptType","createDocumentFragment","div","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","safeActiveElement","err","on","types","one","origFn","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","Event","handleObjIn","eventHandle","events","handleObj","handlers","namespaces","origType","elemData","triggered","bindType","delegateCount","mappedTypes","origCount","removeEvent","nativeEvent","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","button","addProp","hook","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","eventPhase","metaKey","pageX","pageY","shiftKey","view","charCode","keyCode","buttons","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","focus","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","vendorPropName","capName","finalPropName","final","cssProps","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","ceil","getWidthOrHeight","boxSizingNeeded","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","origName","isCustomProp","setProperty","isFinite","scrollboxSizeBuggy","margin","padding","border","prefix","suffix","expand","expanded","propHooks","run","percent","eased","duration","pos","fx","scrollTop","scrollLeft","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","defaultPrefilter","opts","oldfire","propTween","restoreDisplay","isBox","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","properties","stopped","prefilters","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","complete","timer","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","bool","attrNames","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","serializeArray","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","throws","active","lastModified","etag","isLocal","processData","async","contentType","accepts","json","ajaxSetup","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","overrideMimeType","status","abort","statusText","finalText","crossDomain","hasContent","ifModified","beforeSend","success","send","nativeStatusText","modified","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","errorCallback","open","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","_jQuery","_$","noConflict","_REVERSE_MAP","_MAP","_KEYCODE_MAP","_SHIFT_MAP","_SPECIAL_ALIASES","navigator","platform","Mousetrap","action","_bindMultiple","_directMap","_callbacks","stopCallback","_belongsTo","composedPath","initialEventTarget","tagName","isContentEditable","handleKey","_handleKey","addKeycodes","documentMousetrap","_addEvent","_characterFromEvent","character","_modifiersMatch","modifiers1","modifiers2","_eventModifiers","modifiers","_preventDefault","_stopPropagation","cancelBubble","_isModifier","_getReverseMap","_pickBestAction","_keysFromString","combination","_getKeyInfo","ancestor","targetElement","_resetTimer","_sequenceLevels","_ignoreNextKeyup","_ignoreNextKeypress","_nextExpectedAction","_resetSequences","doNotReset","activeSequences","_getMatches","sequenceName","level","seq","deleteCombo","combo","deleteSequence","_fireCallback","srcElement","_handleKeyEvent","_resetSequenceTimer","_bindSequence","_increaseSequence","nextAction","_callbackAndReset","isFinal","wrappedCallback","_bindSingle","info","callbacks","maxLevel","processedSequenceCallback","ignoreThisKeypress","combinations","class","$setup","_createBlock","_component_el_empty","description","_createVNode","_component_el_button","icon","size","onClick","loading","handleSync","_component_el_skeleton","rows","_component_el_container","_component_el_aside","_component_el_space","direction","alignment","_component_el_switch","isMultiSelectionMode","$event","onChange","multiSelectionModeChanging","_component_el_tree","ref","checkedNodes","treeProps","onNodeClick","onCheckChange","default","_createElementVNode","_component_el_tooltip","comment","effect","_toDisplayString","_component_el_header","groupId","export","_component_el_select","documentFilter","placeholder","clearable","_createElementBlock","_Fragment","_renderList","versions","_component_el_option","createAt","loadingVersions","_component_el_main","_component_el_tabs","_component_el_tab_pane","_component_DocumentList","tablesData","tables","overviewData","overview","onOnRemark","lazy","_component_el_row","_component_el_col","span","showComment","_component_diagram","_component_document_remark","projectId","tableName","columnName","isShowDrawer","onOnClose","getTables","documentId","tableIds","axios","getSimpleOneByProjectId","parameters","syncByProjectId","getVersionByProjectId","exportDocument","fileDownload","urlObj","webkitURL","link","Blob","download","ua","userAgent","Platform","IS_MAC","appVersion","IS_IOS","IS_WINDOWS","IS_IE","IS_IE11","IS_EDGE","IS_NETSCAPE","IS_CHROME_APP","chrome","app","runtime","IS_CHROME","IS_OPERA","IS_FIREFOX","IS_SAFARI","SUPPORT_TOUCH","SUPPORT_POINTER","PointerEvent","SUPPORT_PASSIVE","NO_FOREIGNOBJECT","createElementNS","SUPPORT_FOREIGNOBJECT","getHMRStatus","mod","hot","isApplyingHMR","TAGNAMES","change","isEventSupported","eventName","isSupported","ns","passive","NodeList","docFrag","isNode","Node","Element","Document","DocumentFragment","freeGlobal","freeSelf","Function","objectProto","nativeObjectToString","symToStringTag","getRawTag","isOwn","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","asyncTag","funcTag","genTag","proxyTag","MAX_SAFE_INTEGER","isLength","coreJsData","maskSrcKey","isMasked","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","getValue","getNative","nativeCreate","hashClear","__data__","hashDelete","HASH_UNDEFINED","hashGet","hashHas","hashSet","Hash","clear","listCacheClear","other","assocIndexOf","arrayProto","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","isKeyable","getMapData","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","baseFindIndex","predicate","fromIndex","fromRight","baseIsNaN","strictIndexOf","baseIndexOf","arrayIncludes","arrayIncludesWith","comparator","cacheHas","setToArray","INFINITY","createSet","LARGE_ARRAY_SIZE","baseUniq","iteratee","includes","isCommon","seen","outer","seenIndex","uniq","arrayPush","isObjectLike","argsTag","baseIsArguments","propertyIsEnumerable","isArguments","spreadableSymbol","isFlattenable","baseFlatten","isStrict","identity","thisArg","nativeMax","overRest","transform","otherArgs","constant","baseSetToString","HOT_COUNT","HOT_SPAN","nativeNow","shortOut","lastCalled","stamp","setToString","baseRest","isArrayLikeObject","union","arrays","symbolTag","isSymbol","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","nativeFloor","nativeMin","baseSortedIndexBy","retHighest","low","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","mid","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","HALF_MAX_ARRAY_LENGTH","baseSortedIndex","sortedIndex","stackClear","stackDelete","stackGet","stackHas","stackSet","pairs","Stack","arraySome","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","equalArrays","bitmask","customizer","equalFunc","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","stringTag","arrayBufferTag","dataViewTag","symbolProto","symbolValueOf","valueOf","equalByTag","byteLength","byteOffset","convert","stacked","baseGetAllKeys","keysFunc","symbolsFunc","arrayFilter","resIndex","stubArray","nativeGetSymbols","getOwnPropertySymbols","getSymbols","symbol","baseTimes","stubFalse","freeExports","freeModule","moduleExports","Buffer","nativeIsBuffer","isBuffer","reIsUint","isIndex","arrayTag","objectTag","weakMapTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","typedArrayTags","baseIsTypedArray","baseUnary","freeProcess","nodeUtil","require","binding","nodeIsTypedArray","isTypedArray","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","isPrototype","overArg","nativeKeys","baseKeys","getAllKeys","equalObjects","objProps","objLength","othProps","objStacked","skipCtor","objValue","objCtor","othCtor","DataView","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","ctorString","baseIsEqualDeep","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsEqual","baseIsMatch","matchData","noCustomizer","srcValue","isStrictComparable","getMatchData","matchesStrictComparable","baseMatches","reIsDeepProp","reIsPlainProp","isKey","FUNC_ERROR_TEXT","memoize","resolver","memoized","Cache","MAX_MEMOIZE_SIZE","memoizeCapped","rePropName","reEscapeChar","stringToPath","quote","subString","arrayMap","symbolToString","baseToString","castPath","toKey","baseGet","baseHasIn","hasPath","hasFunc","hasIn","baseMatchesProperty","baseProperty","basePropertyDeep","property","baseIteratee","sortedIndexBy","createBaseFor","baseFor","baseForOwn","createBaseEach","eachFunc","baseEach","baseMap","baseSortBy","comparer","compareAscending","valIsDefined","valIsReflexive","compareMultiple","orders","objCriteria","criteria","othCriteria","ordersLength","order","baseOrderBy","iteratees","isIterateeCall","sortBy","baseAssignValue","arrayAggregator","accumulator","baseAggregator","createAggregator","initializer","groupBy","baseDifference","valuesLength","valuesIndex","difference","baseHas","assignValue","baseSet","nested","newValue","basePickBy","paths","basePick","flatten","flatRest","pick","nativeKeysIn","baseKeysIn","isProto","keysIn","assignMergeValue","allocUnsafe","cloneBuffer","isDeep","cloneArrayBuffer","arrayBuffer","cloneTypedArray","typedArray","copyArray","objectCreate","baseCreate","getPrototype","initCloneObject","objectCtorString","safeGet","copyObject","isNew","toPlainObject","baseMergeDeep","srcIndex","mergeFunc","isTyped","baseMerge","createAssigner","assigner","sources","guard","isEqual","isEmpty","arrayEach","baseAssign","baseAssignIn","copySymbols","getSymbolsIn","copySymbolsIn","getAllKeysIn","initCloneArray","cloneDataView","dataView","reFlags","cloneRegExp","regexp","cloneSymbol","initCloneByTag","baseIsMap","nodeIsMap","isMap","baseIsSet","nodeIsSet","isSet","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","cloneableTags","baseClone","isFlat","isFull","isFunc","subValue","cloneDeep","defaults","propsIndex","propsLength","customDefaultsMerge","mergeWith","defaultsDeep","applyMixins","derivedCtor","baseCtors","baseCtor","getOwnPropertyNames","getOwnPropertyDescriptor","extendStatics","setPrototypeOf","__proto__","d","inherit","cls","isNativeClass","createClass","getByPath","setByPath","lastKey","diver","unsetByPath","propertyToRemove","basePropertyOf","htmlEscapes","escapeHtmlChar","reUnescapedHtml","reHasUnescapedHtml","htmlUnescapes","reEscapedHtml","baseClamp","lower","upper","reWhitespace","trimmedEndIndex","reTrimStart","baseTrim","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","isBinary","baseSlice","castSlice","rsAstralRange","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboRange","rsVarRange","rsZWJ","reHasUnicode","hasUnicode","baseIsRegExp","nodeIsRegExp","asciiToArray","rsAstral","rsCombo","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsOptJoin","rsSeq","rsSymbol","reUnicode","unicodeToArray","stringToArray","assignInWith","domExcTag","isError","attempt","baseValues","customDefaultsAssignIn","stringEscapes","escapeStringChar","reInterpolate","reEscape","reEvaluate","templateSettings","INVALID_TEMPL_VAR_ERROR_TEXT","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reForbiddenIdentifierChars","reEsTemplate","reNoMatch","reUnescapedString","template","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","idCounter","uniqueId","arrayReduce","initAccum","deburredLetters","deburrLetter","reLatin","reComboMark","deburr","reAsciiWord","asciiWords","reHasUnicodeWord","hasUnicodeWord","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsBreakRange","rsApos","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsOrdLower","rsOrdUpper","rsEmoji","reUnicodeWord","unicodeWords","words","reApos","createCompounder","createCaseFirst","methodName","strSymbols","trailing","upperFirst","startCase","word","capitalize","upperCase","lowerCase","lowerFirst","cacheStringFunction","str","hit","kebabCase","pascalCase","hashcode","isUnicoded","ii","characterCode","unescape","uuid","r","sanitizeHTML","startsWith","getSpellingSuggestion","candidates","getName","maximumLengthDifference","bestCandidate","bestDistance","justCheckExactMatches","nameLowerCase","candidate","candidateName","candidateNameLowerCase","distance","levenshteinWithMax","s1","s2","previous","big","c1","minJ","maxJ","colMin","dist","isNumber","clamp","normalizePercentage","Number","parseCssNumeric","units","getUnit","normalizeSides","bottom","vertical","horizontal","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","baseDelay","ctx","isAsyncLike","isAsync","Promise","toAsyncBoolean","inputs","hasAsync","some","deferres","all","reduce","memo","every","toDeferredBoolean","rclass","rnotwhite","fillSpaces","oldValue","metches","ensureId","isSVGGraphicsElement","getScreenCTM","SVGElement","svg","xmlns","xlink","xhtml","svgVersion","createSvgElement","createSvgDocument","setAttributeNS","parser","instance","lowercase","previousSibling","findOne","querySelector","findParentByClass","terminator","ownerSVGElement","child","isHTMLElement","HTMLElement","qualified","qualifyAttr","hasAttributeNS","local","removeAttributeNS","hasAttribute","setAttributes","combinedKey","kebablizeAttrs","styleToObject","styleString","section","pair","mergeAttrs","so","tt","ss","annotate","annotations","compacted","curr","batch","jj","annotation","includeAnnotationIndices","stringify","sanitize","JSONExt","DataUri","millimeterSize","isPrimitive","deepEqual","a1","a2","deepArrayEqual","deepObjectEqual","deepCopy","deepArrayCopy","deepObjectCopy","emptyObject","freeze","emptyArray","isDataUrl","substr","imageToDataUri","onError","onLoad","FileReader","reader","dataUri","readAsDataURL","u8a","CHUNK_SZ","c","subarray","meta","Uint8Array","base64","btoa","dataUriToBlob","dataUrl","uri","mime","decodedString","atob","ia","downloadBlob","blob","fileName","msSaveBlob","downloadDataUri","parseViewBox","getNumber","svgToDataUrl","viewBox","getNumberFromViewBox","getNumberFromMatches","reg","h","decoded","header","supportedUnits","px","mm","cm","in","pt","pc","Unit","cssWidth","cssHeight","toPx","raf","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","lastTime","currTime","getTime","timeToCall","caf","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","msCancelAnimationFrame","msCancelRequestAnimationFrame","oCancelAnimationFrame","oCancelRequestAnimationFrame","mozCancelAnimationFrame","mozCancelRequestAnimationFrame","getSelection","Angle","precision","isInteger","toFixed","mmin","mmax","NaN","snapToGrid","gridSize","containsPoint","point","x","y","squaredLength","p1","p2","dx","dy","toDeg","rad","normalize","angle","toRad","deg","over360","Geometry","Point","super","toStringTag","translate","rotate","degree","center","sx","sy","points","Infinity","squaredDistance","sqrt","manhattanDistance","magnitude","theta","atan2","angleBetween","equals","vectorAngle","zero","toPolar","changeInAngle","adhereToRect","bearing","lat1","lat2","lon1","lon2","dLon","sin","brng","bearings","cross","dot","lerp","move","reflection","gx","gy","isPoint","isPointLike","isPointData","fromPolar","org","o","equalPoints","x1","x2","y1","y2","rotateEx","Rectangle","topLeft","topCenter","topRight","bottomLeft","bottomCenter","bottomRight","corner","rightMiddle","leftMiddle","topLine","Line","rightLine","bottomLine","leftLine","getTopLeft","getTopCenter","getTopRight","getCenter","getCenterX","getCenterY","getBottomLeft","getBottomCenter","getBottomRight","getCorner","getRightMiddle","getLeftMiddle","getTopLine","getRightLine","getBottomLine","getLeftLine","bbox","st","minX","minY","maxX","maxY","inflate","tx","ty","p3","p4","rotate90","moveAndExpand","getMaxScaleToFit","ox","oy","sx1","sx2","sx3","sx4","sy1","sy2","sy3","sy4","getMaxUniformScaleToFit","containsRect","w1","h1","w2","h2","intersectsWithLine","line","rectLines","dedupeArr","intersectsWithLineFromCenterToPoint","sides","connector","intersection","intersectsWithRect","isIntersectWithRect","myOrigin","myCorner","rOrigin","rCorner","xx","yy","newx","newy","newwidth","newheight","originX","originY","cornerX","cornerY","getNearestSideToPoint","distLeft","distRight","distTop","distBottom","side","getNearestPointToPoint","isRectangle","isRectangleLike","fromSize","fromPositionAndSize","fromEllipse","ellipse","setLength","total","parallel","isDifferentiable","eRef","sRef","vector","closestPoint","pointAt","closestPointNormalizedLength","closestPointLength","closestPointTangent","tangentAt","product","ratio","pointAtLength","fromStart","rate","divideAt","dividerPoint","divideAtLength","intersect","shape","pt1Dir","pt2Dir","det","deltaPt","alpha","beta","pointOffset","determinant","pointSquaredDistance","pointDistance","tangentStart","tangentLine","tangentAtLength","relativeCcw","dx1","dy1","dx2","dy2","ccw","isLine","Ellipse","normalizedDistance","intersections","ry","mDir","mDiff","ta","tb","mSquared","aSquared","bSquared","tangentTheta","x0","y0","cx","cy","refPointDelta","q1","q3","fromRect","isEllipse","Polyline","cpLength","minSqrDistance","lineLength","cpNormalizedLength","cp","sqrDistance","startIndex","intersectionCount","endIndex","xDifference","rayEnd","ray","int","lastPoint","lastValidLine","simplify","threshold","currentIndex","firstIndex","middleIndex","firstPoint","middlePoint","chord","closestPointDistance","toHull","startPoint","sortedRecords","record1","record2","insidePoints","hullRecords","getKey","record","currentRecord","currentPoint","correctTurnFound","lastHullRecord","lastHullPoint","secondLastHullRecord","secondLastHullPoint","crossProduct","THRESHOLD","lowestHullIndex","indexOfLowestHullIndexRecord","currentHullIndex","hullPointRecordsReordered","newFirstChunk","newSecondChunk","hullPoints","isPolyline","polyline","svgString","coords","Curve","controlPoint1","controlPoint2","PRECISION","x3","y3","tvalues","bounds","t1","t2","b2ac","sqrtb2ac","mt","jlen","X","Y","pointAtT","closestPointT","getOptions","lengthAtT","getPrecision","subdivisions","getDivisions","precisionRatio","investigatedSubdivision","investigatedSubdivisionStartT","investigatedSubdivisionEndT","distFromStart","distFromEnd","chordLength","minSumDist","piece","division","startDist","endDist","sumDist","endpointDistance","startPrecisionRatio","endPrecisionRatio","hasRequiredPrecision","hasMiniStartDistance","hasMiniEndDistance","hasMiniDistance","divided","divide","startDist1","endDist1","sumDist1","startDist2","endDist2","sumDist2","tangentAtT","toPolyline","divideAtT","tAt","tAtLength","dividerPoints","getSkeletonPoints","startControl1","startControlPoint1","startControl2","startControlPoint2","divider","dividerControl1","dividerControlPoint1","dividerControl2","dividerControlPoint2","control1","control2","midpoint1","midpoint2","midpoint3","subControl1","subControl2","divideLine","getSubdivisions","previousLength","iteration","divisions","subCurve","skeletonPoints","baselinePointDistFromStart","baselinePointDistFromEnd","newBaselinePointDistFromStart","newBaselinePointDistFromEnd","baseline1Length","baseline2Length","toPoints","isCurve","curve","getFirstControlPoints","rhs","getCurveControlPoints","knots","firstControlPoints","secondControlPoints","throughPoints","controlPoints","curves","Segment","isVisible","isSegment","isSubpathStart","endPoint","previousSegment","LineTo","arg0","segments","Close","subpathStartSegment","MoveTo","CurveTo","arg1","arg2","arg3","arg4","arg5","c2","q2c","ax","ay","v13","v23","a2c","largeArcFlag","sweepFlag","recursive","v120","xy","f1","f2","rx2","ry2","asin","df","f2old","x2old","y2old","tan","hx","hy","m1","m2","m3","m4","newres","pathData","spaces","segmentReg","commandParamReg","paramsCount","segmetns","cmd","command","pathString","pathArray","mx","my","bx","by","qx","qy","processPath","pcom","nx","ny","T","Q","fixArc","pp","pi","commands","prevCommand","seg","seglen","normalizePathData","regexSupportedData","isValid","draw","initialMove","close","exclude","rounded","arcSize","p0","wp","nx1","ny1","nx2","ny2","drawPoints","pts","arcToCurves","r1","r2","cty","cpsi","spsi","rxd","ryd","rxdd","rydd","r1x","r2y","lamda","sds","seif","txd","tyd","dr","sse","segr","cpsir1","cpsir2","spsir1","spsir2","mc","ms","drawArc","startX","startY","xAxisRotation","stopX","stopY","Path","previousObj","appendSegment","createSegment","moveTo","lineTo","curveTo","arcTo","endX","endY","quadTo","sub","segmentBBox","lastSegment","currentSegment","nextSegment","prepareSegment","insertSegment","removeSegment","fixIndex","removedSegment","updateSubpathStartSegment","replaceSegment","replacedSegment","updateSubpathStart","getSegment","segmentAt","segmentIndexAt","segmentAtLength","segmentIndexAtLength","segmentSubdivisions","lastVisibleIndex","getSegmentSubdivisions","minSquaredDistance","segmentClosestPointT","segmentClosestPoint","segmentIndex","polylines","toPolylines","numIntersections","pathLength","lastVisibleSegment","numSegments","tValue","dividedSegmentIndex","lastValidSegment","lastValidSegmentIndex","pathCopy","divisionStartIndex","divisionMidIndex","divisionEndIndex","movetoEnd","secondPathSegmentIndexConversion","originalSegment","convertedSegment","firstPath","secondPath","partialPoints","otherSegments","isPath","commandRe","argRe","Vector","isVector","importNode","matrix","getTransformToElement","toNode","SVGSVGElement","defs","defsNode","toNodes","vels","vel","currentChild","eachChild","toLocalPoint","toGeometryShape","translateCenterToPoint","getBBox","translateAndAutoOrient","reference","animateTransform","animateAlongPath","normalizePath","withoutTransformations","sample","SVGPathElement","toPath","toPathData","createTextPathNode","textPath","annotateTextLine","lineNode","lineAnnotations","eol","baseSize","tspanNode","maxFontSize","fontMetrics","lastJ","fontSize","annotationAttrs","vTSpan","annotationClass","createVectors","markup","svgDoc","childNode","emRegex","emToPx","em","numerical","calculateDY","linesMetrics","baseSizePx","lineMetrics","flMaxFont","rLineHeights","lineHeightPx","iLineHeight","llMaxFont","verticalAnchor","textVerticalAnchor","namedVerticalAnchor","iai","defaultLineHeight","autoLineHeight","displayEmpty","strFontSize","containerNode","annotatedY","lines","lastI","lineClassName","lineNodeStyle","fillOpacity","strokeOpacity","baseVal","rh","firstLine","splitText","hyphen","separators","seps","char","valids","substring","breakText","svgDocument","telem","tspan","tnode","shouldAppend","breakWord","full","lineSeprators","partIndex","currentSeparator","wordIndex","lineIndex","wordCount","getComputedTextLength","isPartition","isCharacter","heightValue","lastLineIndex","lastLine","overflowLine","ellipsis","fullLastLine","fixedLastLine","lastChar","lastCharIndex","KAPPA","getNumbericAttribute","getTotalLength","samples","getPointAtLength","lineToPathData","polygonToPathData","polygon","getPointsFromSvgElement","svgPointsToPath","polylineToPathData","nodePoints","numberOfItems","getItem","circleToPathData","circle","cd","ellipseToPathData","cdx","cdy","rectangleToPathData","rectToPathData","topRx","bottomRx","topRy","bottomRy","createSlicePathData","innerRadius","outerRadius","startAngle","endAngle","svgArcMax","r0","a0","da","c0","s0","transformRegex","transformSeparatorRegex","transformationListRegex","createSVGPoint","createSVGMatrix","mat","createSVGTransform","DOMMatrix","createSVGTransformFromMatrix","transformStringToMatrix","transformationString","transformationMatch","ctm","scaleNonUniform","skewX","skewY","multiply","matrixToTransformString","parseTransformString","translation","rotation","decomposedMatrix","decomposeMatrix","translateX","translateY","scaleX","scaleY","transformations","translateMatch","rotateMatch","scaleMatch","deltaTransformPoint","py","matrixToScale","matrixToRotation","matrixToTranslation","transformPoint","matrixTransform","transformLine","transformRectangle","corner1","corner2","corner3","corner4","__rest","clientLeft","clientTop","clientWidth","clientHeight","outputBBox","getBoundingOffsetRect","childBBox","targetCTM","nodeCTM","inverse","globalPoint","globalToLocalMatrix","createAnimation","setupAnimation","repeat","ani","beginElement","endElement","mpath","animators","animationID","id2anim","getTargets","animator","Animator","register","offsetLeft","offsetTop","absolute","transformList","svgTransform","appendItem","transformAttr","newTx","newTy","newTranslate","newAngle","newOrigin","newRotate","newScale","translateToOrigin","setTranslate","rotateAroundOrigin","setRotate","translateFromOrigin","finalPosition","setMatrix","MouseWheelHandle","onWheelCallback","onWheelGuard","animationFrameId","onWheel","didWheel","enable","changed","createSensor","sensor","listeners","pointerEvents","zIndex","listener","destroy","ResizeObserver","observe","disconnect","SizeSensor","Scheduler","WeakMap","delete","cb","deadline","performance","peek","postMessage","MessageChannel","port1","port2","onmessage","flushTask","job","shouldYield","scheduleTask","task","_a","_b","scheduling","isInputPending","Registry","unregister","names","force","exist","onDuplicated","entity","onConflict","onNotFound","suggestion","getSpellingSuggestionForName","prefixed","xlinkHref","xlinkShow","xlinkRole","xlinkType","xlinkArcrole","xlinkTitle","xlinkActuate","xmlSpace","xmlBase","xmlLang","preserveAspectRatio","requiredExtension","requiredFeatures","systemLanguage","externalResourcesRequired","refX","positionWrapper","refY","refDx","refDy","refWidth","setWrapper","refHeight","refRx","refRy","refRInscribed","attrName","widthFn","heightFn","refBBox","refRCircumscribed","percentage","diagonalLength","rValue","refCx","refCy","refDResetOffset","dWrapper","resetOffset","refDKeepOffset","refPointsResetOffset","pointsWrapper","refPointsKeepOffset","refR","refD","refPoints","refX2","refY2","refWidth2","refHeight2","refOrigin","attrValue","shapeWrapper","shapeConstructor","cacheName","cachedShape","shapeBBox","shapeOrigin","fitScale","pathConstructor","fill","qualify","graph","defineGradient","stroke","cell","isEdge","edgeView","sourcePoint","targetPoint","gradientUnits","textWrap","textHash","pathNode","wrappedText","txt","fontFamily","isTextInUse","title","titleElem","titleNode","xAlign","offsetWrapper","yAlign","defineFilter","offset1","offset2","block","createClassicMarker","classic","factor","localAttrs","diamond","flip","opened","fliped","radius","circlePlus","radiusX","radiusy","Marker","presets","registry","sourceMarker","marker","createMarker","targetMarker","vertexMarker","manual","def","others","preset","normalizeAttr","defineMarker","strokeWidth","isEdgeView","connection","stubs","getConnectionLength","getConnection","sourceParts","targetParts","getConnectionPathData","atConnectionLengthKeepGradient","atConnectionWrapper","atConnectionLengthIgnoreGradient","atConnectionRatioKeepGradient","atConnectionRatioIgnoreGradient","atConnectionLength","atConnectionRatio","zeroVector","tangent","Attr","isValidDefinition","color","thickness","fixedDot","mesh","doubleMesh","Grid","patterns","getString","outline","highlight","stdDeviation","dropShadow","grayScale","amount","g","sepia","saturate","hueRotate","amount2","brightness","contrast","Filter","flipX","img","canvas","getContext","drawImage","flipY","flipXY","setTransform","watermark","radians","stepX","stepY","Background","Config","prefixCls","autoInsertCSS","useCSSSelector","trackable","trackInfo","track","enabled","Util","normalizeMarker","makeTree","collector","createNode","edge","createEdge","defaultClassName","cellView","magnet","unhighlight","magnetEl","defaultOptions","Private","getHighlighterId","hasCache","magnetVel","magnetBBox","isEdgeElement","highlightMatrix","paddingMatrix","removeHandler","removeHighlighter","model","setCache","Highlighter","normalizePoint","toResult","rawArgs","highlighter","portsPositionArgs","elemBBox","groupPositionArgs","stepAngle","ellipseLayout","ellipseSpread","stepFn","compensateRotate","lineLayout","strict","PortLayout","portPosition","outside","outsideLayout","outsideOriented","inside","insideLayout","insideOriented","autoOrient","bboxAngles","getBBoxAngles","textAnchor","orientAngle","tl","bl","br","radial","radialLayout","radialOriented","portCenterOffset","PortLabelLayout","Color","fromString","blend","weight","lighten","rgba","darken","toHex","hex","toRGBA","toHSLA","rgba2hsla","toCSS","ignoreAlpha","rgb","toGrey","makeGrey","fromArray","fromHex","hex2rgb","fromRGBA","hue2rgb","h6","fromHSLA","hsla2rgba","named","randomHex","letters","randomRGBA","bw","pound","rgb2hex","bits","mask","bgr","pad","amt","lum","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","Events","emit","Disposable","disposed","_disposed","dispose","descriptor","DisposableSet","isDisposed","items","Set","Basecoat","Disablable","_disabled","Dijkstra","Timing","Interp","LocalStorage","__decorate","decorators","desc","Reflect","decorate","Dictionary","PriorityQueue","defaultComparator","heapify","priority","bubbleUp","peekPriority","updatePriority","oldPriority","comp","bubbleDown","minIndex","adjacencyList","u","scanned","neighbours","alt","quad","cubic","inout","t3","exponential","bounce","reflect","back","elastic","easeInSine","easeOutSine","easeInOutSine","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInExpo","easeOutExpo","easeInOutExpo","scaledTime","scaledTime1","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","scaledTime2","easeInElastic","easeOutElastic","easeInOutElastic","easeOutBounce","easeInBounce","easeInOutBounce","ma","mb","pb","aa","bb","ca","ra","rd","ga","gd","ba","bd","loadIndex","setItem","docKey","indexKey","docs","localStorage","removeItem","View","cid","views","confirmUpdate","unmount","removeEventListeners","onRemove","setClass","classList","setStyle","setAttrs","findAttr","rootElem","findByAttr","getSelector","prevSelector","nth","prefixClassName","delegateEvents","undelegateEvents","getEventHandler","delegateEvent","getEventNamespace","delegateDocumentEvents","addEventListeners","undelegateDocumentEvents","undelegateEvent","getEventTarget","fromPoint","elementFromPoint","setEventData","propagationStopped","getEventData","eventData","currentData","normalizeEvent","isSvgElement","isCSSSelector","normalizedEvent","touchEvt","useElement","correspondingUseElement","getView","terminal","toPercentage","pin","strategy","pinEdgeTerminal","pinNodeTerminal","getAngle","getUnrotatedBBoxOfElement","anchor","totalLength","pinRelative","pinAbsolute","ConnectionStrategy","Markup","clean","elemCache","pathCache","getMatrix","rotatableNode","getShape","getBoundingRect","isJSONMarkup","isStringMarkup","parseStringMarkup","sanitized","parseJSONMarkup","defines","define","groupSelector","nodeGroups","groupName","createContainer","renderMarkup","parseLabelStringMarkup","parseNode","xml2json","attrMap","markupMap","childMarkup","mk","getPortContainerMarkup","getPortMarkup","getPortLabelMarkup","getEdgeMarkup","getEdgeToolMarkup","getEdgeVertexMarkup","getEdgeArrowheadMarkup","getForeignObjectMarkup","bare","background","AttrManager","getDefinition","getAttrDefinition","processAttrs","normal","specials","definition","normalName","CASE_SENSITIVE_ATTR","setDefine","DELAY_ATTRS","offsetDefine","positionDefine","mergeProcessedAttrs","allProcessedAttrs","roProcessedAttrs","findAttrs","cellAttrs","rootNode","selectorCache","selectedLength","sortIndex","reduceRight","updateRelativeAttrs","processedAttrs","rawAttrs","nodeAttrs","positionAttrs","offsetAttrs","delayAttrs","nodeTransform","nodeMatrix","nodePosition","getScaleOfElement","scalableNode","positioned","ts","offseted","nodeBoundingRect","getBoundingRectOfElement","nodeBBox","updateDelayAttrs","forceSync","nodesAttrs","nodesAllAttrs","specialItems","processed","nodeAllAttrs","refSelector","refNode","processedAttributes","findIndex","bboxCache","rotatableMatrix","unrotatedRefBBox","isRefNodeRotatable","rootBBox","caller","FlagManager","actions","bootstrap","getFlag","hasAction","removeAction","getBootstrapFlag","getChangedFlag","hasChanged","CellView","ensureOptions","setContainer","ensureContainer","static","mergeActions","arr1","arr2","getDefaults","documentEvents","removeTools","rootSelector","getConstructor","getContainerTagName","getContainerStyle","getContainerAttrs","getContainerClassName","isNodeView","render","handleAction","additionalRemovedActions","removedFlags","onAttrsChange","updated","dirty","toolId","renderer","requestViewUpdate","can","feature","interacting","cleanCache","getCache","getDataOfElement","getMatrixOfElement","getShapeOfElement","getBBoxOfElement","rm","getRootRotatedMatrix","tm","getRootTranslatedMatrix","useCellGeometry","localToGraph","getPosition","findMagnet","updateAttrs","prepareHighlight","partial","notifyUnhighlight","getEdgeTerminal","portId","hasPort","customizeEdgeTerminal","getStrategy","connecting","getMagnetFromEdgeTerminal","findPortElem","revert","vTarget","stage","onComplete","hasTools","tools","addTools","config","ToolsView","isToolsView","hideTools","showTools","mount","updateTools","renderTools","getTools","getEventArgs","onDblClick","onContextMenu","onMouseDown","cachedModelForMouseEvent","startBatch","onMouseUp","stopBatch","onMouseMove","onMouseOver","onMouseOut","onMouseEnter","onMouseLeave","onMouseWheel","onCustomEvent","onMagnetMouseDown","onMagnetDblClick","onMagnetContextMenu","onLabelMouseDown","checkMouseleave","dumpView","findViewByElem","Flag","isCellView","ctor","svgContainer","htmlContainer","normalizedTools","ToolItem","isToolItem","tool","NodeTool","EdgeTool","isSVGElement","focusedTool","blurredTool","hasSVG","hasHTML","decorator","getAnchor","terminalView","terminalMagnet","getViewBBox","quick","toolsView","onRender","focusOpacity","getClassName","Button","updatePosition","getEdgeMatrix","getNodeMatrix","getTangentAtRatio","getTangentAtLength","btn","mousedown","touchstart","Remove","cursor","ui","Boundary","Vertices","handles","vertices","getVertices","addable","updatePath","resetHandles","renderHandles","updateHandles","stopHandleListening","vertex","createHandle","processHandle","onToolItemCreated","startHandleListening","onHandleChange","onHandleChanging","onHandleChanged","onHandleRemove","getNeighborPoints","sourceAnchor","targetAnchor","getMouseEventArgs","notifyMouseDown","snapVertex","setVertexAt","notifyMouseMove","removeRedundancies","verticesRemoved","removeRedundantLinearVertices","vertexAdded","notifyMouseUp","onChanged","snapRadius","neighbors","removable","removeVertexAt","onPathMouseDown","getVertexIndex","insertVertex","Handle","dblclick","mousemove","touchmove","mouseup","touchend","touchcancel","onDoubleClick","pathClassName","Segments","nextVertex","renderHandle","updateHandle","shiftHandleIndexes","resetAnchor","snapHandle","anchorFn","sourceView","sourceBBox","changeSourceAnchor","deleteSourceAnchor","sourceAnchorPosition","sourceMagnet","sourceAnchorDef","targetView","targetBBox","changeTargetAnchor","deleteTargetAnchor","targetAnchorPosition","targetMagnet","targetAnchorDef","setVertices","segmentLine","getClosestPoint","Anchor","toggleArea","getTerminalView","updateAnchor","updateArea","anchorNode","getTerminalAnchor","customAnchor","anchorAttrs","customAnchorAttrs","defaultAnchorAttrs","areaNode","area","terminalCell","getTerminalMagnet","areaPadding","restrictArea","rewrite","terminalType","clientToLocal","snapFn","snap","pointAtConnection","rotatedCoords","toolView","isSource","refIndex","getVertexAt","SourceAnchor","TargetAnchor","Arrowhead","getPointAtRatio","prepareArrowheadDragging","SourceArrowhead","TargetArrowhead","CellEditor","labelIndex","autoFocus","editor","contentEditable","parentElement","isEdgeLabel","backgroundColor","innerText","onDocumentMouseDown","setText","removeTool","selectText","range","createRange","selectNodeContents","removeAllRanges","addRange","NodeEditor","EdgeEditor","appendLabel","boundary","createBBoxAnchor","refView","refPoint","fixedAt","getPointAtEdge","isPercentage","orthogonal","orth","nodeCenter","endType","getConnectionPoint","middleSide","midSide","NodeAnchor","OFFSET","getConnectionSubdivisions","vLine","hLine","vIntersections","hIntersections","fallbackAt","EdgeAnchor","getStrokeWidth","findShapeNode","nextElementSibling","stroked","bboxRaw","lineRaw","localShape","magnetMatrix","translateMatrix","rotateMatrix","targetMatrix","localMatrix","localLine","localRef","insideout","localBBox","pathOptions","extrapolate","cpOffset","alignLine","coordinate","alignOffset","align","ConnectionPoint","oneSide","coord","dim","getPointBBox","getPaddingBox","getSourceBBox","getTargetBBox","getSourceAnchor","getTargetAnchor","route","isOrthogonal","getBearing","insideNode","nodeToNode","nodeToVertex","isOrthogonalLoop","vertexToNode","vertexToVertex","opposites","N","E","W","freeJoin","getBBoxSize","d1","d2","opposite","fromBBox","toBBox","freePoints","freeBearingPoints","fromBorder","toBorder","startRoute","endRoute","reversed","maxLoopCount","maxDirectionChange","perpendicular","excludeTerminals","excludeShapes","excludeHiddenNodes","startDirections","endDirections","directionMap","cost","directions","penalties","paddingBox","fallbackRouter","draggingRouter","resolveOptions","point1","point2","OPEN","CLOSE","SortedSet","isOpen","isClose","ObstacleMap","mapGridSize","build","excludedTerminals","getCell","excludedAncestors","getSourceCellId","getAncestors","getTargetCellId","getNodes","excType","excTerminal","excAncestor","excHidden","excluded","isAccessible","rects","getSourceEndpoint","getTargetEndpoint","getDirectionAngle","directionCount","grid","quadrant","angleTheta","fixAngleEnd","normalizedAngle","diffX","diffY","gridStepsX","gridStepsY","distanceX","distanceY","getDirectionChange","angle1","angle2","getGridOffsets","gridOffsetX","gridOffsetY","getGrid","getGridDimension","roundedDiff","remainder","correction","snapGrid","getCost","anchors","getRectPoints","directionList","centerVector","rectPoints","ending","intersectionLine","farthestIntersectionDistance","farthestIntersection","reconstructRoute","tailPoint","prevDiff","currentKey","leadPoint","fromDiff","findRoute","sourceEndpoint","targetEndpoint","startPoints","endPoints","openSet","costs","previousRouteDirectionAngle","previousDirectionAngle","isPathBeginning","directionChange","numDirections","endPointsKeys","sameStartEndPoints","loopsRemaining","currentParent","currentCost","isStartPoint","isRouteBeginning","skipEndCheck","directionAngle","neighborPoint","neighborKey","isEndPoint","endDirectionAngle","endDirectionChange","neighborCost","neighborPenalty","costFromStart","fallbackRoute","router","optionsRaw","oldVertices","newVertices","partialRoute","isEndingAtPoint","dragFrom","dragTo","manhattan","diagonalCost","l1","l2","intersectionPoint","directionFrom","metro","linkView","er","offsetRaw","sourceX","targetX","sourceDelta","targetDelta","sourceY","targetY","rollup","center1","center2","loop","halfHeight","validate","angles","line1","line2","intersects1","intersects2","intersects","Router","routePoints","f13","f23","prevDistance","nextDistance","startMove","endMove","roundedStart","roundedEnd","smooth","controlPointX","controlPointY","CLOSE_PROXIMITY_PADDING","F13","F23","setupUpdating","updateList","_jumpOverUpdateList","createLines","findLineIntersections","crossCheckLines","crossCheckLine","getDistence","createJumps","jumpSize","skippedPoints","jumpStart","jumpEnd","nextPoint","endDistance","startDistance","jumpLine","jumppedLines","buildPath","jumpType","xAxisRotate","centerLine","halfLine","xOffset","yOffset","nextLine","buildRoundedSegment","jumpover","ignoreConnectors","allLinks","getEdges","thisIndex","defaultConnector","edges","getConnector","linkViews","findViewByCell","thisLines","linkLines","jumpingLines","lineIntersections","Connector","ids","targetValue","delim","startValue","getPropByPath","localOptions","timing","getTiming","getInterp","interp","iterate","elaspe","setPropByPath","getArgs","commonArgs","jumpedToEnd","stopArgs","Store","pending","changing","mutate","unset","silent","changes","pendingOptions","store","getPrevious","subset","pathArrayLength","propertyPath","propertyValue","propertyPathArray","nextKey","isArrayIndex","merged","removeByPath","getChanges","ShareRegistry","Cell","metadata","preprocess","postprocess","_model","ignoreIdCheck","applyPropHooks","isSameStore","getProp","setProp","_children","_parent","removePropByPath","getZIndex","removeZIndex","setZIndex","toFront","cells","getMaxZIndex","getDescendants","breadthFirst","batchUpdate","toBack","getMinZIndex","getMarkup","removeMarkup","setMarkup","getAttrs","removeAttrs","overwrite","replaceAttrs","getAttrHooks","getAttrByPath","prefixAttrPath","setAttrByPath","removeAttrByPath","setVisible","toggleVisible","setData","replaceData","updateData","getParent","getChildren","getParentId","parentId","childrenIds","hasParent","isParentOf","isChildOf","filterChild","getChildCount","getChildIndex","getChildAt","ancestors","isDescendantOf","isAncestorOf","descendant","getCommonAncestor","setParent","setChildren","unembed","embed","addTo","isCell","addChild","addCell","insertTo","insertChild","oldParent","incomings","getIncomingEdges","outgoings","getOutgoingEdges","updateParent","removeFromParent","removeChildAt","removeCell","transition","stopTransition","getTransitions","toolItems","setTools","normalizeTools","hasTool","nameOrIndex","cellType","defaultAttrs","finalAttrs","defaultAttr","subName","finalProps","keepId","deepClone","findView","execute","getCellsBBox","cloneCells","cloneMap","sourceId","targetId","setSource","getSource","setTarget","getTarget","embeds","edgeRegistry","nodeRegistry","setEdgeRegistry","setNodeRegistry","PortManager","ports","getPorts","getGroup","getPortsByGroup","group","getPortsLayoutByGroup","groupPosition","groupPositionName","layoutFn","portsArgs","groupArgs","layouts","portLayout","portSize","portAttrs","labelSize","labelLayout","getPortLabelLayout","parseGroup","parsePort","getLabel","getPortPosition","createPosition","setDefault","getPortLabelPosition","setDefaults","initPorts","getSize","setSize","resize","currentSize","fixedPoint","imageFixedPoint","atan","setPosition","scaledBBox","currentPosition","parentPosition","translateBy","restrict","translatedPosition","currentAngle","getTerminal","getPortsPosition","portCenter","fit","portContainerMarkup","setPortContainerMarkup","getDefaultPortContainerMarkup","portMarkup","setPortMarkup","getDefaultPortMarkup","portLabelMarkup","setPortLabelMarkup","getDefaultPortLabelMarkup","getPortAt","hasPorts","getPortIndex","layout","getPortProp","prefixPortPath","setPortProp","removePortProp","portProp","addPort","addPorts","insertPort","removePort","removePortAt","removePorts","portsForRemoval","currentPorts","remainingPorts","getParsedPorts","getParsedGroups","updatePortData","processRemovedPort","currentItemsMap","removed","getConnectedEdges","incoming","getTargetPortId","outgoing","getSourcePortId","validatePorts","errors","generatePortId","added","prevPort","curPort","constructorName","Base","setLabel","removeLabel","bodyAttr","labelAttr","noText","getImageUrlHook","imageUrl","imageWidth","imageHeight","createShape","ignoreMarkup","Edge","sourceCell","sourcePort","targetCell","targetPort","isValidId","onLabelsChanged","onVertexsChanged","setTerminal","getSourcePoint","getTerminalPoint","getTargetPoint","getTerminalCell","getSourceCell","getTargetCell","cellId","getSourceNode","getTerminalNode","getTargetNode","visited","getRouter","removeRouter","setRouter","removeConnector","setConnector","removeStrategy","setStrategy","getDefaultLabel","defaultLabel","getLabels","setLabels","parseLabel","insertLabel","getLabelAt","setLabelAt","removeLabelAt","parseStringLabel","label1","label2","vertexMarkup","getVertexMarkup","setVertexMarkup","getDefaultVertexMarkup","vertice","appendVertex","getDefaultMarkup","toolMarkup","getToolMarkup","setToolMarkup","getDefaultToolMarkup","doubleToolMarkup","getDoubleToolMarkup","setDoubleToolMarkup","getDefaultDoubleToolMarkup","arrowheadMarkup","getArrowheadMarkup","setArrowheadMarkup","getDefaultArrowheadMarkup","applyToPoints","worker","getPolyline","newParent","prevParent","hasLoop","getFragmentAncestor","isFragmentDescendantOf","equalTerminals","b1","formated","EdgeView","POINT_ROUNDING","markerCache","sourceDef","targetDef","updateTerminalProperties","isViewMounted","renderVertexMarkers","onLabelsChange","updateToolsPosition","renderExternalTools","shouldRerenderLabels","renderLabels","updateLabels","updateLabelPositions","previousLabels","containers","renderStringMarkup","renderJSONMarkup","renderArrowheadMarkers","labelCache","labelSelectors","normalizeLabelMarkup","parseLabelMarkup","labelNode","customizeLabels","labelMarkup","hasChildNodes","canLabelMove","mergeLabelAttrs","hasCustomMarkup","labelAttrs","defaultLabelAttrs","onEdgeLabelRendered","$container","toolCache","doubleTools","tool2","tool2Cache","arrowheads","sourceArrowhead","targetArrowhead","partialAttrs","updateConnection","updateConnectionPath","updateArrowheadMarkers","rawCount","simplifiedPoints","simplifiedCount","connectionWrap","translateAndAutoOrientArrows","getTerminalConnectionPoint","translateConnectionPoints","findAnchors","findRoutePoints","connectionPoints","findConnectionPoints","markerPoints","findMarkerPoints","findPath","firstVertex","lastVertex","findAnchorsOrdered","firstType","secondType","secondPoint","firstAnchor","secondAnchor","firstTerminal","secondTerminal","firstView","secondView","firstMagnet","secondMagnet","firstRef","secondRef","sourceEdgeAnchor","targetEdgeAnchor","edgeAnchor","defaultRouter","sourceTerminal","targetTerminal","firstRoutePoint","lastRoutePoint","sourcePointRef","sourceLine","connectionPointDef","connectionPoint","sourceConnectionPoint","targetConnectionPointDef","targetConnectionPoint","targetPointRef","targetLine","updateMarkerAttr","getLineWidth","sourceMarkerElem","targetMarkerElem","sourceMarkerPoint","targetMarkerPoint","defaultPosition","normalizeLabelPosition","labelPosition","getLabelTransformationMatrix","toolsOffset","connectionLength","shortLength","longLength","doubleToolsOffset","nodeId","viewKey","updateTerminalMagnet","getCellById","endView","propName","sourceArrow","targetArrow","getLabelPositionAngle","getLabelPositionArgs","getDefaultLabelPositionArgs","mergeLabelPositionArgs","labelPositionArgs","defaultLabelPositionArgs","addLabel","localX","localY","localAngle","positionArgs","getLabelPosition","addVertex","sendToken","rorate","dur","repeatCount","calcMode","keyPoints","keyTimes","vToken","getClosestPointLength","getClosestPointRatio","isOffsetAbsolute","absoluteOffset","isDistanceRelative","absoluteDistance","isDistanceAbsoluteReverse","reverseDistance","labelPoint","labelOffset","labelDistance","labelOffsetDiff","labelAngle","offsetCoord","isKeepGradient","keepGradient","isEnsureLegibility","ensureLegibility","pathOpt","getLabelCoordinates","vertexLength","currentVertex","currentLength","notifyUnhandledMouseDown","startVertexDragging","handleVertexRemoving","handleVertexAdding","startArrowheadDragging","startEdgeDragging","dragVertex","dragLabel","dragArrowhead","dragEdge","stopVertexDragging","stopLabelDragging","stopArrowheadDragging","stopEdgeDragging","startLabelDragging","moving","isNewEdge","initialMagnet","initialTerminal","fallbackAction","getValidateConnectionArgs","createValidateConnectionArgs","beforeArrowheadDragging","highlightAvailableMagnets","afterArrowheadDragging","unhighlightAvailableMagnets","arrowheadDragging","currentMagnet","currentView","validateConnection","arrowheadDragged","snapArrowhead","findViewsInArea","prevView","closestView","prevMagnet","closestMagnet","minDistance","snapArrowheadEnd","finishEmbedding","embedding","fallbackConnection","notifyConnectionEvent","currentTerminal","previousCell","previousPort","previousView","previousPoint","currentCell","currentPort","previousMagnet","getCells","marked","magnets","availableMagnets","valid","validateEdge","positionAngle","delegateDragEvents","originLabel","sampleInterval","NodeView","scalableSelector","rotatableSelector","defaultPortMarkup","defaultPortLabelMarkup","defaultPortContainerMarkup","portsCache","updateClassName","cleanPortsCache","renderPorts","updateTransform","updateSize","updateTranslation","updateRotation","getTranslationString","getRotationString","rot","scalableBBox","rotatableBBox","portRoot","portContentElement","portSelectors","portContentSelectors","initializePorts","refreshPorts","portElement","getPortsContainer","references","portsGropsByZ","autoZIndexKey","getPortElement","appendPorts","updatePorts","refs","createPortElement","renderResult","portLabelElement","portLabelSelectors","onPortRendered","labelContainer","contentContainer","contentSelectors","updatePortGroup","metrics","metric","applyPortTransform","initialAngle","startNodeDragging","dragMagnet","dragNode","stopMagnetDragging","stopNodeDragging","onMagnetClick","getMouseMovedCount","clickThreshold","startMagnetDragging","prepareEmbedding","localPoint","processEmbedding","findParent","getNodesUnderNode","frontOnly","newCandidateView","prevCandidateView","candidateEmbedView","validateEmbeding","childView","parentView","clearEmbedding","candidateParent","candidateView","finalizeEmbedding","previousParent","getDelegatedView","validateMagnet","magnetThreshold","startConnectting","createEdgeFromMagnet","getDefaultEdge","autoScrollGraph","notifyNodeMove","widget","movable","selectedCells","getSelectedCells","getRestrictArea","getGridSize","posX","posY","scroller","autoScroll","viewName","Text","Collection","localIndex","entities","sortable","sortAttr","existing","dryrun","removeCells","unreference","at","notifyCellEvent","Model","batches","addings","sortOnChangeZ","onCellAdded","onCellRemoved","onReset","onEdgeTerminalChanged","disconnectEdges","disconnectConnectedEdges","removeConnectedEdges","prepareCell","resetCells","v1","v2","addNode","addEdge","addCells","maxPosition","updateCellId","newId","newCell","getFirstCell","getLastCell","getCellsFromCache","cellIds","indirect","collect","isOutgoing","descendants","embedsCache","collectSub","enclosed","isBoundary","isOrigin","getBoundaryNodes","getRoots","getLeafs","isRoot","isLeaf","getNeighbors","isNeighbor","cell1","cell2","getSuccessors","successors","matchDistance","isSuccessor","getPredecessors","predecessors","isPredecessor","getSubGraph","subgraph","cloneSubGraph","getNodesFromPoint","getNodesInArea","getEdgesInArea","getAllCellsBBox","breadthFirstSearch","depthFirstSearch","neighbor","getShortestPath","directed","resizeCells","fromJSON","hasActiveBatch","isModel","contentSelector","registryName","TextBlock","getContent","setContent","updateContent","foreignObject","textAlign","verticalAlign","contentAction","textAttrs","headerText","bodyText","CYLINDER_TILT","lateral","kappa","xLeft","xCenter","xRight","ySideTop","yCurveTop","ySideBottom","yCurveBottom","knob","Poly","getPoints","setPoints","removePoints","pointsToString","bg","boxSizing","alignItems","justifyContent","wrapValue","wrapAttrs","strokeLinecap","strokeLinejoin","shadow","HTML","getHTML","setHTML","removeHTML","shouldUpdate","shouldUpdateHTMLComponent","renderHTMLComponent","foContent","$wrap","component","getHTMLComponent","fo","componentRegistry","AutoSave","throttle","changeCount","timestamp","onModelChanged","dt","save","Decorator","GraphView","viewport","primer","overlay","restore","snapshoot","guarded","preventDefaultDblClick","preventDefaultContextMenu","mouseMovedCount","startPosition","preventDefaultMouseDown","preventDefaultBlankAction","moveThreshold","relatedView","handleMagnetEvent","magnetElem","magnetValue","onImageDragStart","cloned","contextmenu","mouseover","mouseout","DOMMouseScroll","checkScroller","warning","CSSManager","ensure","styleElement","ClassNames","handleClassName","pie","defaultPieOptions","handleOptions","initHandles","toggles","pieToggle","$pieToggles","applyAttrs","setPieIcons","$handleContainer","onHandleMouseDown","triggerHandleAction","onHandleMouseMove","onHandleMouseUp","onPieToggleMouseDown","toggleState","pieSlice","getHandle","contect","$icons","bgImg","$imgs","getHandleIdx","hasHandle","$handle","sliceAngle","curRad","nextRad","vSvg","vPath","iconSize","vImg","vText","updateHandleIcon","addHandles","removeHandles","removeHandle","getHandleElem","changeHandle","newHandle","toggleHandle","iconSelected","selectHandle","deselectHandle","deselectAllHandles","pieSliceImg","isRendered","pieToggleOpened","pieOpended","$toggle","$element","Widget","clearAll","removeInstances","instanceCache","dic","ensureCache","startListening","clearOnBlankMouseDown","stopListening","Knob","onTransform","onTransformed","onKnobMouseDown","onKnobMouseUp","KNOB","knobbing","KNOBBING","ClassName","zoom","MiniMap","updateViewport","graphContainer","$viewport","scalable","zoomHandle","sourceGraph","targetGraphOptions","graphOptions","frozen","rotating","resizing","selecting","snapline","clipboard","history","targetGraph","createGraph","Graph","unfreeze","updatePaper","$graphContainer","onSourceGraphTransform","targetGraphTransforming","getScale","maxHeight","resizeGraph","clientToLocalPoint","geometry","innerWidth","innerHeight","startAction","doAction","startScale","startGeometry","frameId","minScale","maxScale","stopAction","centerPoint","Snapline","tolerance","parseFilter","containerClassName","verticalClassName","horizontalClassName","setFilter","$horizontal","$vertical","captureCursorOffset","snapOnMoving","onBatchStop","filterShapes","filterCells","filterFunction","snapOnResizing","isNodeMovable","snapped","trueDirection","nodeBbox","nodeBBoxRotated","nodeTopLeft","nodeBottomRight","verticalLeft","verticalTop","verticalHeight","horizontalTop","horizontalLeft","horizontalWidth","snapOrigin","relativeDirection","isIgnored","snapBBox","snapTopLeft","snapBottomRight","distances","dWidth","dHeight","quadrant13","newWidth","newHeight","minHeight","snaplines","newRotatedBBox","delegatedView","cellBBox","verticalFix","horizontalFix","targetNode","snapCenter","newCenter","newX","newY","snapNode","sharp","hasScroller","resetTimer","Renderer","resetUpdates","resetViews","isFrozen","updateViewsAsync","onSortModel","onModelReseted","onCellZIndexChanged","onCellVisibleChanged","updates","priorities","mounted","mountedCids","unmounted","unmountedCids","freezeKey","animationId","SORT_DELAYING_BATCHES","sortViews","removeZPivots","updateDelayingBatches","UPDATE_DELAYING_BATCHES","updateViews","sortDelayingBatches","renderView","FLAG_REMOVE","sorting","FLAG_INSERT","processEdgeOnTerminalVisibleChanged","removeView","getOpposite","isEdgeTerminalVisible","requestConnectedEdgesUpdate","flagLabels","scheduleViewUpdate","forcePostponedViewUpdate","sourceFlag","targetFlag","currentFlag","onViewUpdated","stats","registerMountedView","updateView","dumpViews","checkView","requireView","insertView","batchCount","updatedCount","MIN_PRIORITY","updateViewsBatch","batchSize","UPDATE_BATCH_SIZE","mountedCount","unmountedCount","postponedCount","main","isUnmounted","registerUnmountedView","leftoverFlag","onViewPostponed","beforeFn","checkout","checkViewImpl","mountedBatchSize","MOUNT_BATCH_SIZE","unmountedBatchSize","progressFn","getMountedViews","getUnmountedViews","checkMountedViews","viewportFn","unmountCount","shouldMount","checkUnmountedViews","mountCount","mounting","afterFn","setAsync","removeViews","createCellView","isExactSorting","sortViewsExact","sortElements","placements","cellA","cellB","z1","z2","addZPivot","zPivots","pivots","pivot","neighborZ","currentZ","layer","neighborPivot","findViewsFromPoint","findEdgeViewsInArea","BackgroundManager","updateBackgroundImage","backgroundSize","backgroundPosition","drawBackgroundImage","HTMLImageElement","backgroundImage","optionsCache","backgroundRepeat","quality","HTMLCanvasElement","toDataURL","updateBackgroundColor","updateBackgroundOptions","Scroller","containerClass","pageVisible","pagedClass","$content","contentClass","$background","backgroundClass","backgroundManager","autoResize","onScale","onResize","storeScrollPosition","restoreScrollPosition","onRenderDone","onUpdate","delegateBackgroundEvents","undelegateBackgroundEvents","enableAutoResize","disableAutoResize","evts","delegatedHandlers","onBackgroundEvent","cachedCenterPoint","updatePageBreak","updateScale","autoResizeOptions","fitTocontentOptions","cachedScrollLeft","cachedScrollTop","storeClientSize","cachedClientSize","restoreClientSize","beforeManipulation","afterManipulation","updatePageSize","pageWidth","pageBreak","graphWidth","graphHeight","hasPageBreak","getClientSize","resizeOptions","gridWidth","gridHeight","allowNewOrigin","fitToContent","getFitToContentOptions","contentArea","scrollbarPosition","scrollToPoint","scrollToContent","getContentArea","scrollToCell","optons","tWidth","tHeight","visibleCenter","getVisibleArea","positionPoint","getPadding","clientSize","addPadding","centerContent","positionContent","centerCell","positionCell","positionRect","clientRect","targetRect","rawDiff","scaleGrid","clampScale","fy","zoomToRect","viewportArea","scaleContentToFitImpl","zoomToFit","transitionToPoint","transformOrigin","targetScale","localToBackgroundPoint","onTransitionEnd","transitionClassName","transitionEventName","syncTransition","transitionDuration","transitionDelay","transitionTimingFunction","removeTransition","transitionToRect","rectangle","MIN_VALUE","PIXEL_SIZE","startPanning","pan","stopPanning","scrollerX","scrollerY","isCellVisible","isPointVisible","unlock","panningClass","pannableClass","minVisibleWidth","minVisibleHeight","Selection","depthComparator","boxCount","boxClassName","$boxes","onGraphTransformed","onModelUpdated","onReseted","onCollectionUpdated","onNodePositionChanged","onCellChanged","updateSelectionBoxes","showNodeSelectionBox","allowTranslating","translating","translateSelectedNodes","unselect","isSelected","prevMap","nextMap","updateContainer","startSelecting","stopSelecting","pageToLocal","getCellViewsInArea","hideRubberband","client","following","updateSelectedNodesPosition","notifyBoxEvent","onSelectionBoxMouseDown","startTranslating","activeView","getCellViewFromElem","getSelectionOffset","totalBBox","minDx","minDy","maxDx","maxDy","boxesUpdated","$selectionContainer","adjustSelection","showRubberband","updateContainerPosition","otherOptions","rubberNode","rubberEdge","getSelectedClassName","addCellSelectedClassName","removeCellUnSelectedClassName","destroySelectionBox","canShowSelectionBox","destroyAllSelectionBoxes","rubberband","showSelected","inner","$selectionContent","boxContent","showEdgeSelectionBox","createSelectionBox","listenCellRemoveEvent","deleteSelectedCells","startRotate","doRotate","rotated","stopRotate","startResize","bboxes","doResize","resized","stopResize","Transform","resizeClassName","rotateClassName","$knob","$rotate","$resizes","POSITIONS","NODE_CLS","orthogonalResizing","resizable","rotatable","updateResizerDirections","startHandle","stopHandle","DIRECTIONS","prevShift","getTrueDirection","toValidResizeDirection","startResizing","prepareResizing","resizeX","resizeY","startRotating","restrictedResizing","autoScrollOnResizing","currentBBox","requestedSize","rawWidth","rawHeight","candidateWidth","candidateHeight","allowReverse","reverted","revertedDir","rotateGrid","Options","parseOptionGroup","panning","minimap","keyboard","defaultGrid","booleas","scaling","highlighting","nodeAvailable","magnetAvailable","multi","dangling","allowLoop","allowNode","allowEdge","allowPort","transforming","restricted","multiple","selectCellOnMoved","selectNodeOnMoved","selectEdgeOnMoved","eventTypes","zoomAtMousePosition","edgeLabelMovable","DefsManager","isDefined","filterId","filterUnits","gradient","stops","markerUnits","markerOrient","markerId","pathMarker","orient","GridManager","setGridSize","resolveGrid","getInstance","patternUnits","patternElem","XMLSerializer","serializeToString","CoordManager","getClientMatrix","getClientOffset","getPageOffset","scrollX","scrollY","localToGraphPoint","localToClientPoint","localToPagePoint","localToGraphRect","localRect","localToClientRect","localToPageRect","graphToLocalPoint","graphPoint","clientPoint","clientToGraphPoint","pageToLocalPoint","pagePoint","graphToLocalRect","graphRect","clientToLocalRect","clientToGraphRect","pageToLocalRect","pageOffset","ModifierKey","SnaplineManager","createSnapline","or","and","or1","or2","and1","and2","equal","isMatch","ScrollerManager","widgetOptions","pannable","createScroller","preparePanning","onRightMouseDown","allowPanning","allowRubberband","isPanning","dataset","enablePanning","disablePanning","ClipboardManager","commonOptions","instanceOptions","createClipboard","cut","paste","HighlightManager","highlights","onCellHighlight","onCellUnhighlight","resolved","resolveHighlighter","highlighterDef","TransformManager","widgets","Map","isSelectionEnabled","onNodeMouseUp","onNodeSelected","onNodeUnSelected","createTransform","viewportTransformString","viewportMatrix","getCTM","getComputedSize","getTranslation","getZoom","getRotation","setOrigin","paddings","sizeChanged","originChanged","scaleContentToFit","contentBBox","contentLocalOrigin","getContentBBox","graphToLocal","minScaleX","maxScaleX","minScaleY","maxScaleY","fittingBox","computedSize","currentTranslate","currentScale","newSX","newSY","newOX","newOY","getGraphArea","SelectionManager","movedMap","unselectMap","rubberbandDisabled","createSelection","onBlankMouseDown","onBlankClick","onCellMouseMove","onCellMouseUp","onBoxMouseDown","startRubberband","isMultiple","enableRubberband","disableRubberband","enableMultiple","disableMultiple","setModifiers","HistoryManager","batchCommands","batchLevel","lastBatchIndex","freezed","validator","Validator","cancelInvalid","undo","undoStack","revertCommand","redoStack","redo","applyCommand","canUndo","canRedo","initBatchCommand","storeBatchCommand","eventNames","addCommand","createCommand","cmds","sortBatchCommands","revertOptionsList","executeCommand","applyOptionsList","isAddEvent","isRemoveEvent","isChangeEvent","eventArgs","ignoreAdd","ignoreRemove","ignoreChange","beforeAddCommand","isModelChange","diffId","modelChange","diffName","afterAddCommand","filterBatchCommand","onCommandAdded","isValidCommand","validation","handoverErr","routes","reservedNames","batchEvents","MiniMapManager","createMiniMap","Keyboard","mousetrap","createMousetrap","getKeys","isInputEvent","preventScroll","formatkey","formatFn","format","isGraphEvent","isEnabledForEvent","allowed","MouseWheel","cumulatedFactor","mousewheelHandle","allowMouseWheel","startPos","MIN_SAFE_INTEGER","PrintManager","$pages","createPrintPages","showPrintWindow","sheetSize","getSheetSize","$body","bodyClassName","$detached","$page","styleSheetId","print","createPrintPage","pageArea","vSVG","vStage","graphArea","getPageInfo","getPrintArea","page","pageSize","getPageSize","pageAreas","getPageAreas","updatePrintStyle","sizeCSS","marginUnit","sheetUnit","sheet","$style","poster","columns","pages","pageRatio","graphRatio","fitHorizontal","readyToPrint","FormatManager","toSVG","rawSVG","clonedSVG","preserveDimensions","copyStyles","raws","clones","styleSheetCount","styleSheets","styleSheetsCopy","defaultComputedStyles","computedStyle","defaultComputedStyle","customStyles","customStyle","stylesheet","cDATASection","createDocument","createCDATASection","beforeSerialize","serializeImages","deferrals","vImage","expanding","rawSize","imgDataCanvas","context2D","fillStyle","fillRect","getImageData","Image","toPNG","toJPEG","KnobManager","createKnob","PanningManager","autoPanning","SizeManager","getContainer","resizeScroller","resizePage","nullable","hookName","getNativeValue","Hook","createModel","createView","createRenderer","createDefsManager","createGridManager","createCoordManager","createKnobManager","getTransformOptions","createTransformManager","createHighlightManager","createBackgroundManager","Clipboard","createClipboardManager","createSnaplineManager","createSelectionManager","createHistoryManager","createScrollerManager","createMiniMapManager","createKeyboard","createMouseWheel","createPrintManager","createFormatManager","createPanningManager","createSizeManager","allowConnectToBlank","allowBlank","candidateTerminal","allowMulti","doValidate","connectedEdges","getCellView","shouldComponentUpdate","Storage","clearCells","addNodes","removeNode","addEdges","removeEdge","hasCell","getCellCount","getRootNodes","getLeafNodes","isRootNode","isLeafNode","searchCell","findViews","zoomTo","getArea","localToPage","localToClient","clientToGraph","showGrid","hideGrid","clearGrid","drawGrid","updateBackground","drawBackground","onGraph","clearBackground","isClipboardEnabled","enableClipboard","disableClipboard","toggleClipboard","isClipboardEmpty","getCellsInClipboard","cleanClipboard","isHistoryEnabled","enableHistory","disableHistory","toggleHistory","undoAndCancel","cleanHistory","isKeyboardEnabled","enableKeyboard","disableKeyboard","toggleKeyboard","bindKey","unbindKey","isMouseWheelEnabled","enableMouseWheel","disableMouseWheel","toggleMouseWheel","isPannable","togglePanning","lockScroller","unlockScroller","updateScroller","getScrollbarPosition","setScrollbarPosition","enableSelection","disableSelection","toggleSelection","isMultipleSelection","enableMultipleSelection","disableMultipleSelection","toggleMultipleSelection","isSelectionMovable","enableSelectionMovable","disableSelectionMovable","toggleSelectionMovable","isRubberbandEnabled","toggleRubberband","isStrictRubberband","enableStrictRubberband","disableStrictRubberband","toggleStrictRubberband","setRubberbandModifiers","setSelectionFilter","setSelectionDisplayContent","isSelectionEmpty","cleanSelection","resetSelection","getSelectedCellCount","isSnaplineEnabled","enableSnapline","disableSnapline","toggleSnapline","hideSnapline","setSnaplineFilter","isSnaplineOnResizingEnabled","enableSnaplineOnResizing","disableSnaplineOnResizing","toggleSnaplineOnResizing","enableOnResizing","isSharpSnapline","enableSharpSnapline","disableSharpSnapline","toggleSharpSnapline","getSnaplineTolerance","setSnaplineTolerance","printPreview","BaseManager","isGraph","registerNode","registerEdge","registerView","registerAttr","registerGrid","registerFilter","registerNodeTool","registerEdgeTool","registerBackground","registerHighlighter","registerPortLayout","registerPortLabelLayout","registerMarker","registerRouter","registerConnector","registerAnchor","registerEdgeAnchor","registerConnectionPoint","registerConnectionStrategy","registerHTMLComponent","unregisterNode","unregisterEdge","unregisterView","unregisterAttr","unregisterGrid","unregisterFilter","unregisterNodeTool","unregisterEdgeTool","unregisterBackground","unregisterHighlighter","unregisterPortLayout","unregisterPortLabelLayout","unregisterMarker","unregisterRouter","unregisterConnector","unregisterAnchor","unregisterEdgeAnchor","unregisterConnectionPoint","unregisterConnectionStrategy","unregisterHTMLComponent","edgeProps","nodeProps","useLocalStorage","LOCAL_STORAGE_KEY","NodePreset","halo","getPresets","startClone","doClone","stopClone","startLink","doLink","stopLink","startFork","doFork","stopFork","unlink","tinyThreshold","smallThreshold","loopEdgePreferredSide","loopEdgeWidth","rotateEmbeds","createEdgeConnectedToSource","getMagnet","makeLoopEdge","vertex1","vertex2","centerNodeAtCursor","cloneView","nodeView","fork","rotateStartAngles","clientStartAngle","targetAngle","EdgePreset","directionSwap","Halo","toggleUnlink","toggleFork","hasEdges","GridLayout","Dnd","draggingGraph","delegateGraphOptions","targetScroller","targetModel","containerParent","sourceNode","prepareDragging","updateNodePosition","draggingView","draggingNode","draggingModel","getDragNode","scaled","clearDragging","delegateView","geometryBBox","draggingBBox","originOffset","updateGraphPosition","snapOffset","onDragging","embeddingMode","isValidArea","isInsideValidArea","onDragEnd","drop","onDropped","onDropInvalid","getDropArea","outter","droppingNode","getDropNode","validateNode","stencil","centre","resizeToFit","marginX","marginY","columnWidths","columnWidth","getNodesInColumn","getMaxDim","columnLefts","accumulate","rowHeights","rowHeight","getNodesInRow","rowTops","rowIndex","columnIndex","calcHeight","calcWidth","columnCount","Stencil","graphs","$groups","dnd","onSearch","notFoundText","collapsable","collapsed","renderSearch","globalGraphOptions","stencilGraphOptions","$group","$title","groupTitle","groupContent","graphOptionsInGroup","stencilGraphWidth","stencilGraphHeight","defaultGroupName","searchText","onDragStart","loadGroup","getModel","getGraph","graphPadding","stencilGraphPadding","keyword","isCellMatched","onSearchFocusIn","onSearchFocusOut","onTitleClick","collapseGroups","expandGroups","onGroupTitleClick","toggleGroup","allCollapsed","isGroupCollapsed","expandGroup","collapseGroup","isGroupCollapsable","resizeGroup","layoutOptions","formatter","formatColumnType","column","ignoreLengthTypes","decimalDigits","formatColumnName","withComment","pxWidth","font","measureText","modelData","watch","redendarUml","methods","registerNewNode","createGraphInstance","exportUml","nodeData","selectMaxRowHeight","selectMaxRowWidth","currentRowHeight","columnType","databaseFieldFormatter","columnNameWeight","portBody","portNameLabel","portTypeLabel","LINE_HEIGHT","columnGroup","__exports__","_component_el_drawer","$data","$options","remark","_component_el_card","remarkBy","nickname","_component_el_popconfirm","onConfirm","plain","$props","_component_el_pagination","currentPage","totalPages","onCurrentChange","_component_el_divider","_component_el_input","deleteRemark","remarkId","createRemark","listRemarks","emits","formData","pageFilter","pageData","showRemarkDrawer","closeRemarkDrawer","onCreateRemark","resp","errCode","$message","onRemarkPageChange","onDeleteRemark","$emit","_hoisted_1","_component_el_descriptions","_component_el_descriptions_item","databaseName","productName","productVersion","documentVersion","_hoisted_2","_component_el_table","stripe","_component_el_table_column","row","tableMeta","_hoisted_3","_hoisted_4","isPrimaryKey","_component_el_tag","_hoisted_6","_hoisted_7","autoIncrement","indexes","_hoisted_9","_hoisted_10","isUnique","columnNames","triggers","_hoisted_12","_hoisted_13","tableList","onRemark","columnNameArray","columnTypeFormat","components","Diagram","DocumentRemark","DocumentList","useRoute","loadings","reactive","projectData","simpleDocumentData","versionData","totalPage","tocData","documentData","umlData","treeRef","fetchDocumentTables","messageNotify","onTocNodeClick","scrollToElement","ele","headerOffset","actualTop","behavior","onTocNodeCheckChange","getCheckedKeys","onMultiSelectionModeChange","getCurrentNode","initPageData","versionResp","documentResp","errMessage","isShowNoDataPage","isShowLoadingPage","ElMessage","showClose","onProjectDocumentVersionChange","onSyncProjectDocument","onDocumentExport","loadMoreDocumentVersions","documentRemarkData"],"sourceRoot":""}