three-stdlib
Version:
stand-alone library of threejs examples
1 lines • 842 kB
Source Map (JSON)
{"version":3,"file":"lottie.cjs","sources":["../../src/libs/lottie.js"],"sourcesContent":["const lottie = /* @__PURE__ */ (() => {\n if (\n typeof navigator === 'undefined' ||\n typeof document === 'undefined' ||\n typeof CanvasRenderingContext2D === 'undefined'\n )\n return {}\n\n const svgNS = 'http://www.w3.org/2000/svg'\n\n let locationHref = ''\n let _useWebWorker = false\n\n const initialDefaultFrame = -999999\n\n const setWebWorker = (flag) => {\n _useWebWorker = !!flag\n }\n const getWebWorker = () => _useWebWorker\n\n const setLocationHref = (value) => {\n locationHref = value\n }\n const getLocationHref = () => locationHref\n\n function createTag(type) {\n // return {appendChild:function(){},setAttribute:function(){},style:{}}\n return document.createElement(type)\n }\n\n function extendPrototype(sources, destination) {\n var i\n var len = sources.length\n var sourcePrototype\n for (i = 0; i < len; i += 1) {\n sourcePrototype = sources[i].prototype\n for (var attr in sourcePrototype) {\n if (Object.prototype.hasOwnProperty.call(sourcePrototype, attr))\n destination.prototype[attr] = sourcePrototype[attr]\n }\n }\n }\n\n function getDescriptor(object, prop) {\n return Object.getOwnPropertyDescriptor(object, prop)\n }\n\n function createProxyFunction(prototype) {\n function ProxyFunction() {}\n ProxyFunction.prototype = prototype\n return ProxyFunction\n }\n\n // import Howl from '../../3rd_party/howler';\n\n const audioControllerFactory = (function () {\n function AudioController(audioFactory) {\n this.audios = []\n this.audioFactory = audioFactory\n this._volume = 1\n this._isMuted = false\n }\n\n AudioController.prototype = {\n addAudio: function (audio) {\n this.audios.push(audio)\n },\n pause: function () {\n var i\n var len = this.audios.length\n for (i = 0; i < len; i += 1) {\n this.audios[i].pause()\n }\n },\n resume: function () {\n var i\n var len = this.audios.length\n for (i = 0; i < len; i += 1) {\n this.audios[i].resume()\n }\n },\n setRate: function (rateValue) {\n var i\n var len = this.audios.length\n for (i = 0; i < len; i += 1) {\n this.audios[i].setRate(rateValue)\n }\n },\n createAudio: function (assetPath) {\n if (this.audioFactory) {\n return this.audioFactory(assetPath)\n }\n if (window.Howl) {\n return new window.Howl({\n src: [assetPath],\n })\n }\n return {\n isPlaying: false,\n play: function () {\n this.isPlaying = true\n },\n seek: function () {\n this.isPlaying = false\n },\n playing: function () {},\n rate: function () {},\n setVolume: function () {},\n }\n },\n setAudioFactory: function (audioFactory) {\n this.audioFactory = audioFactory\n },\n setVolume: function (value) {\n this._volume = value\n this._updateVolume()\n },\n mute: function () {\n this._isMuted = true\n this._updateVolume()\n },\n unmute: function () {\n this._isMuted = false\n this._updateVolume()\n },\n getVolume: function () {\n return this._volume\n },\n _updateVolume: function () {\n var i\n var len = this.audios.length\n for (i = 0; i < len; i += 1) {\n this.audios[i].volume(this._volume * (this._isMuted ? 0 : 1))\n }\n },\n }\n\n return function () {\n return new AudioController()\n }\n })()\n\n const createTypedArray = (function () {\n function createRegularArray(type, len) {\n var i = 0\n var arr = []\n var value\n switch (type) {\n case 'int16':\n case 'uint8c':\n value = 1\n break\n default:\n value = 1.1\n break\n }\n for (i = 0; i < len; i += 1) {\n arr.push(value)\n }\n return arr\n }\n function createTypedArrayFactory(type, len) {\n if (type === 'float32') {\n return new Float32Array(len)\n }\n if (type === 'int16') {\n return new Int16Array(len)\n }\n if (type === 'uint8c') {\n return new Uint8ClampedArray(len)\n }\n return createRegularArray(type, len)\n }\n if (typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {\n return createTypedArrayFactory\n }\n return createRegularArray\n })()\n\n function createSizedArray(len) {\n return Array.apply(null, { length: len })\n }\n\n let subframeEnabled = true\n let expressionsPlugin = null\n let idPrefix$1 = ''\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n let _shouldRoundValues = false\n const bmPow = Math.pow\n const bmSqrt = Math.sqrt\n const bmFloor = Math.floor\n const bmMax = Math.max\n const bmMin = Math.min\n\n const BMMath = {}\n ;(function () {\n var propertyNames = [\n 'abs',\n 'acos',\n 'acosh',\n 'asin',\n 'asinh',\n 'atan',\n 'atanh',\n 'atan2',\n 'ceil',\n 'cbrt',\n 'expm1',\n 'clz32',\n 'cos',\n 'cosh',\n 'exp',\n 'floor',\n 'fround',\n 'hypot',\n 'imul',\n 'log',\n 'log1p',\n 'log2',\n 'log10',\n 'max',\n 'min',\n 'pow',\n 'random',\n 'round',\n 'sign',\n 'sin',\n 'sinh',\n 'sqrt',\n 'tan',\n 'tanh',\n 'trunc',\n 'E',\n 'LN10',\n 'LN2',\n 'LOG10E',\n 'LOG2E',\n 'PI',\n 'SQRT1_2',\n 'SQRT2',\n ]\n var i\n var len = propertyNames.length\n for (i = 0; i < len; i += 1) {\n BMMath[propertyNames[i]] = Math[propertyNames[i]]\n }\n })()\n\n function ProjectInterface$1() {\n return {}\n }\n BMMath.random = Math.random\n BMMath.abs = function (val) {\n var tOfVal = typeof val\n if (tOfVal === 'object' && val.length) {\n var absArr = createSizedArray(val.length)\n var i\n var len = val.length\n for (i = 0; i < len; i += 1) {\n absArr[i] = Math.abs(val[i])\n }\n return absArr\n }\n return Math.abs(val)\n }\n let defaultCurveSegments = 150\n const degToRads = Math.PI / 180\n const roundCorner = 0.5519\n\n function roundValues(flag) {\n _shouldRoundValues = !!flag\n }\n\n function bmRnd(value) {\n if (_shouldRoundValues) {\n return Math.round(value)\n }\n return value\n }\n\n function styleDiv(element) {\n element.style.position = 'absolute'\n element.style.top = 0\n element.style.left = 0\n element.style.display = 'block'\n element.style.transformOrigin = '0 0'\n element.style.webkitTransformOrigin = '0 0'\n element.style.backfaceVisibility = 'visible'\n element.style.webkitBackfaceVisibility = 'visible'\n element.style.transformStyle = 'preserve-3d'\n element.style.webkitTransformStyle = 'preserve-3d'\n element.style.mozTransformStyle = 'preserve-3d'\n }\n\n function BMEnterFrameEvent(type, currentTime, totalTime, frameMultiplier) {\n this.type = type\n this.currentTime = currentTime\n this.totalTime = totalTime\n this.direction = frameMultiplier < 0 ? -1 : 1\n }\n\n function BMCompleteEvent(type, frameMultiplier) {\n this.type = type\n this.direction = frameMultiplier < 0 ? -1 : 1\n }\n\n function BMCompleteLoopEvent(type, totalLoops, currentLoop, frameMultiplier) {\n this.type = type\n this.currentLoop = currentLoop\n this.totalLoops = totalLoops\n this.direction = frameMultiplier < 0 ? -1 : 1\n }\n\n function BMSegmentStartEvent(type, firstFrame, totalFrames) {\n this.type = type\n this.firstFrame = firstFrame\n this.totalFrames = totalFrames\n }\n\n function BMDestroyEvent(type, target) {\n this.type = type\n this.target = target\n }\n\n function BMRenderFrameErrorEvent(nativeError, currentTime) {\n this.type = 'renderFrameError'\n this.nativeError = nativeError\n this.currentTime = currentTime\n }\n\n function BMConfigErrorEvent(nativeError) {\n this.type = 'configError'\n this.nativeError = nativeError\n }\n\n function BMAnimationConfigErrorEvent(type, nativeError) {\n this.type = type\n this.nativeError = nativeError\n }\n\n const createElementID = (function () {\n var _count = 0\n return function createID() {\n _count += 1\n return idPrefix$1 + '__lottie_element_' + _count\n }\n })()\n\n function HSVtoRGB(h, s, v) {\n var r\n var g\n var b\n var i\n var f\n var p\n var q\n var t\n i = Math.floor(h * 6)\n f = h * 6 - i\n p = v * (1 - s)\n q = v * (1 - f * s)\n t = v * (1 - (1 - f) * s)\n switch (i % 6) {\n case 0:\n r = v\n g = t\n b = p\n break\n case 1:\n r = q\n g = v\n b = p\n break\n case 2:\n r = p\n g = v\n b = t\n break\n case 3:\n r = p\n g = q\n b = v\n break\n case 4:\n r = t\n g = p\n b = v\n break\n case 5:\n r = v\n g = p\n b = q\n break\n default:\n break\n }\n return [r, g, b]\n }\n\n function RGBtoHSV(r, g, b) {\n var max = Math.max(r, g, b)\n var min = Math.min(r, g, b)\n var d = max - min\n var h\n var s = max === 0 ? 0 : d / max\n var v = max / 255\n\n switch (max) {\n case min:\n h = 0\n break\n case r:\n h = g - b + d * (g < b ? 6 : 0)\n h /= 6 * d\n break\n case g:\n h = b - r + d * 2\n h /= 6 * d\n break\n case b:\n h = r - g + d * 4\n h /= 6 * d\n break\n default:\n break\n }\n\n return [h, s, v]\n }\n\n function addSaturationToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255)\n hsv[1] += offset\n if (hsv[1] > 1) {\n hsv[1] = 1\n } else if (hsv[1] <= 0) {\n hsv[1] = 0\n }\n return HSVtoRGB(hsv[0], hsv[1], hsv[2])\n }\n\n function addBrightnessToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255)\n hsv[2] += offset\n if (hsv[2] > 1) {\n hsv[2] = 1\n } else if (hsv[2] < 0) {\n hsv[2] = 0\n }\n return HSVtoRGB(hsv[0], hsv[1], hsv[2])\n }\n\n function addHueToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255)\n hsv[0] += offset / 360\n if (hsv[0] > 1) {\n hsv[0] -= 1\n } else if (hsv[0] < 0) {\n hsv[0] += 1\n }\n return HSVtoRGB(hsv[0], hsv[1], hsv[2])\n }\n\n const rgbToHex = (function () {\n var colorMap = []\n var i\n var hex\n for (i = 0; i < 256; i += 1) {\n hex = i.toString(16)\n colorMap[i] = hex.length === 1 ? '0' + hex : hex\n }\n\n return function (r, g, b) {\n if (r < 0) {\n r = 0\n }\n if (g < 0) {\n g = 0\n }\n if (b < 0) {\n b = 0\n }\n return '#' + colorMap[r] + colorMap[g] + colorMap[b]\n }\n })()\n\n const setSubframeEnabled = (flag) => {\n subframeEnabled = !!flag\n }\n const getSubframeEnabled = () => subframeEnabled\n const setExpressionsPlugin = (value) => {\n expressionsPlugin = value\n }\n const getExpressionsPlugin = () => expressionsPlugin\n const setDefaultCurveSegments = (value) => {\n defaultCurveSegments = value\n }\n const getDefaultCurveSegments = () => defaultCurveSegments\n const setIdPrefix = (value) => {\n idPrefix$1 = value\n }\n const getIdPrefix = () => idPrefix$1\n\n function createNS(type) {\n // return {appendChild:function(){},setAttribute:function(){},style:{}}\n return document.createElementNS(svgNS, type)\n }\n\n const dataManager = (function () {\n var _counterId = 1\n var processes = []\n var workerFn\n var workerInstance\n var workerProxy = {\n onmessage: function () {},\n postMessage: function (path) {\n workerFn({\n data: path,\n })\n },\n }\n var _workerSelf = {\n postMessage: function (data) {\n workerProxy.onmessage({\n data: data,\n })\n },\n }\n function createWorker(fn) {\n if (window.Worker && window.Blob && getWebWorker()) {\n var blob = new Blob(['var _workerSelf = self; self.onmessage = ', fn.toString()], { type: 'text/javascript' })\n // var blob = new Blob(['self.onmessage = ', fn.toString()], { type: 'text/javascript' });\n var url = URL.createObjectURL(blob)\n return new Worker(url)\n }\n workerFn = fn\n return workerProxy\n }\n\n function setupWorker() {\n if (!workerInstance) {\n workerInstance = createWorker(function workerStart(e) {\n function dataFunctionManager() {\n function completeLayers(layers, comps) {\n var layerData\n var i\n var len = layers.length\n var j\n var jLen\n var k\n var kLen\n for (i = 0; i < len; i += 1) {\n layerData = layers[i]\n if ('ks' in layerData && !layerData.completed) {\n layerData.completed = true\n if (layerData.tt) {\n layers[i - 1].td = layerData.tt\n }\n if (layerData.hasMask) {\n var maskProps = layerData.masksProperties\n jLen = maskProps.length\n for (j = 0; j < jLen; j += 1) {\n if (maskProps[j].pt.k.i) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k)\n } else {\n kLen = maskProps[j].pt.k.length\n for (k = 0; k < kLen; k += 1) {\n if (maskProps[j].pt.k[k].s) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0])\n }\n if (maskProps[j].pt.k[k].e) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0])\n }\n }\n }\n }\n }\n if (layerData.ty === 0) {\n layerData.layers = findCompLayers(layerData.refId, comps)\n completeLayers(layerData.layers, comps)\n } else if (layerData.ty === 4) {\n completeShapes(layerData.shapes)\n } else if (layerData.ty === 5) {\n completeText(layerData)\n }\n }\n }\n }\n\n function completeChars(chars, assets) {\n if (chars) {\n var i = 0\n var len = chars.length\n for (i = 0; i < len; i += 1) {\n if (chars[i].t === 1) {\n // var compData = findComp(chars[i].data.refId, assets);\n chars[i].data.layers = findCompLayers(chars[i].data.refId, assets)\n // chars[i].data.ip = 0;\n // chars[i].data.op = 99999;\n // chars[i].data.st = 0;\n // chars[i].data.sr = 1;\n // chars[i].w = compData.w;\n // chars[i].data.ks = {\n // a: { k: [0, 0, 0], a: 0 },\n // p: { k: [0, -compData.h, 0], a: 0 },\n // r: { k: 0, a: 0 },\n // s: { k: [100, 100], a: 0 },\n // o: { k: 100, a: 0 },\n // };\n completeLayers(chars[i].data.layers, assets)\n }\n }\n }\n }\n\n function findComp(id, comps) {\n var i = 0\n var len = comps.length\n while (i < len) {\n if (comps[i].id === id) {\n return comps[i]\n }\n i += 1\n }\n return null\n }\n\n function findCompLayers(id, comps) {\n var comp = findComp(id, comps)\n if (comp) {\n if (!comp.layers.__used) {\n comp.layers.__used = true\n return comp.layers\n }\n return JSON.parse(JSON.stringify(comp.layers))\n }\n return null\n }\n\n function completeShapes(arr) {\n var i\n var len = arr.length\n var j\n var jLen\n for (i = len - 1; i >= 0; i -= 1) {\n if (arr[i].ty === 'sh') {\n if (arr[i].ks.k.i) {\n convertPathsToAbsoluteValues(arr[i].ks.k)\n } else {\n jLen = arr[i].ks.k.length\n for (j = 0; j < jLen; j += 1) {\n if (arr[i].ks.k[j].s) {\n convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0])\n }\n if (arr[i].ks.k[j].e) {\n convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0])\n }\n }\n }\n } else if (arr[i].ty === 'gr') {\n completeShapes(arr[i].it)\n }\n }\n }\n\n function convertPathsToAbsoluteValues(path) {\n var i\n var len = path.i.length\n for (i = 0; i < len; i += 1) {\n path.i[i][0] += path.v[i][0]\n path.i[i][1] += path.v[i][1]\n path.o[i][0] += path.v[i][0]\n path.o[i][1] += path.v[i][1]\n }\n }\n\n function checkVersion(minimum, animVersionString) {\n var animVersion = animVersionString ? animVersionString.split('.') : [100, 100, 100]\n if (minimum[0] > animVersion[0]) {\n return true\n }\n if (animVersion[0] > minimum[0]) {\n return false\n }\n if (minimum[1] > animVersion[1]) {\n return true\n }\n if (animVersion[1] > minimum[1]) {\n return false\n }\n if (minimum[2] > animVersion[2]) {\n return true\n }\n if (animVersion[2] > minimum[2]) {\n return false\n }\n return null\n }\n\n var checkText = (function () {\n var minimumVersion = [4, 4, 14]\n\n function updateTextLayer(textLayer) {\n var documentData = textLayer.t.d\n textLayer.t.d = {\n k: [\n {\n s: documentData,\n t: 0,\n },\n ],\n }\n }\n\n function iterateLayers(layers) {\n var i\n var len = layers.length\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 5) {\n updateTextLayer(layers[i])\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers)\n if (animationData.assets) {\n var i\n var len = animationData.assets.length\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers)\n }\n }\n }\n }\n }\n })()\n\n var checkChars = (function () {\n var minimumVersion = [4, 7, 99]\n return function (animationData) {\n if (animationData.chars && !checkVersion(minimumVersion, animationData.v)) {\n var i\n var len = animationData.chars.length\n for (i = 0; i < len; i += 1) {\n var charData = animationData.chars[i]\n if (charData.data && charData.data.shapes) {\n completeShapes(charData.data.shapes)\n charData.data.ip = 0\n charData.data.op = 99999\n charData.data.st = 0\n charData.data.sr = 1\n charData.data.ks = {\n p: { k: [0, 0], a: 0 },\n s: { k: [100, 100], a: 0 },\n a: { k: [0, 0], a: 0 },\n r: { k: 0, a: 0 },\n o: { k: 100, a: 0 },\n }\n if (!animationData.chars[i].t) {\n charData.data.shapes.push({\n ty: 'no',\n })\n charData.data.shapes[0].it.push({\n p: { k: [0, 0], a: 0 },\n s: { k: [100, 100], a: 0 },\n a: { k: [0, 0], a: 0 },\n r: { k: 0, a: 0 },\n o: { k: 100, a: 0 },\n sk: { k: 0, a: 0 },\n sa: { k: 0, a: 0 },\n ty: 'tr',\n })\n }\n }\n }\n }\n }\n })()\n\n var checkPathProperties = (function () {\n var minimumVersion = [5, 7, 15]\n\n function updateTextLayer(textLayer) {\n var pathData = textLayer.t.p\n if (typeof pathData.a === 'number') {\n pathData.a = {\n a: 0,\n k: pathData.a,\n }\n }\n if (typeof pathData.p === 'number') {\n pathData.p = {\n a: 0,\n k: pathData.p,\n }\n }\n if (typeof pathData.r === 'number') {\n pathData.r = {\n a: 0,\n k: pathData.r,\n }\n }\n }\n\n function iterateLayers(layers) {\n var i\n var len = layers.length\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 5) {\n updateTextLayer(layers[i])\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers)\n if (animationData.assets) {\n var i\n var len = animationData.assets.length\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers)\n }\n }\n }\n }\n }\n })()\n\n var checkColors = (function () {\n var minimumVersion = [4, 1, 9]\n\n function iterateShapes(shapes) {\n var i\n var len = shapes.length\n var j\n var jLen\n for (i = 0; i < len; i += 1) {\n if (shapes[i].ty === 'gr') {\n iterateShapes(shapes[i].it)\n } else if (shapes[i].ty === 'fl' || shapes[i].ty === 'st') {\n if (shapes[i].c.k && shapes[i].c.k[0].i) {\n jLen = shapes[i].c.k.length\n for (j = 0; j < jLen; j += 1) {\n if (shapes[i].c.k[j].s) {\n shapes[i].c.k[j].s[0] /= 255\n shapes[i].c.k[j].s[1] /= 255\n shapes[i].c.k[j].s[2] /= 255\n shapes[i].c.k[j].s[3] /= 255\n }\n if (shapes[i].c.k[j].e) {\n shapes[i].c.k[j].e[0] /= 255\n shapes[i].c.k[j].e[1] /= 255\n shapes[i].c.k[j].e[2] /= 255\n shapes[i].c.k[j].e[3] /= 255\n }\n }\n } else {\n shapes[i].c.k[0] /= 255\n shapes[i].c.k[1] /= 255\n shapes[i].c.k[2] /= 255\n shapes[i].c.k[3] /= 255\n }\n }\n }\n }\n\n function iterateLayers(layers) {\n var i\n var len = layers.length\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 4) {\n iterateShapes(layers[i].shapes)\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers)\n if (animationData.assets) {\n var i\n var len = animationData.assets.length\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers)\n }\n }\n }\n }\n }\n })()\n\n var checkShapes = (function () {\n var minimumVersion = [4, 4, 18]\n\n function completeClosingShapes(arr) {\n var i\n var len = arr.length\n var j\n var jLen\n for (i = len - 1; i >= 0; i -= 1) {\n if (arr[i].ty === 'sh') {\n if (arr[i].ks.k.i) {\n arr[i].ks.k.c = arr[i].closed\n } else {\n jLen = arr[i].ks.k.length\n for (j = 0; j < jLen; j += 1) {\n if (arr[i].ks.k[j].s) {\n arr[i].ks.k[j].s[0].c = arr[i].closed\n }\n if (arr[i].ks.k[j].e) {\n arr[i].ks.k[j].e[0].c = arr[i].closed\n }\n }\n }\n } else if (arr[i].ty === 'gr') {\n completeClosingShapes(arr[i].it)\n }\n }\n }\n\n function iterateLayers(layers) {\n var layerData\n var i\n var len = layers.length\n var j\n var jLen\n var k\n var kLen\n for (i = 0; i < len; i += 1) {\n layerData = layers[i]\n if (layerData.hasMask) {\n var maskProps = layerData.masksProperties\n jLen = maskProps.length\n for (j = 0; j < jLen; j += 1) {\n if (maskProps[j].pt.k.i) {\n maskProps[j].pt.k.c = maskProps[j].cl\n } else {\n kLen = maskProps[j].pt.k.length\n for (k = 0; k < kLen; k += 1) {\n if (maskProps[j].pt.k[k].s) {\n maskProps[j].pt.k[k].s[0].c = maskProps[j].cl\n }\n if (maskProps[j].pt.k[k].e) {\n maskProps[j].pt.k[k].e[0].c = maskProps[j].cl\n }\n }\n }\n }\n }\n if (layerData.ty === 4) {\n completeClosingShapes(layerData.shapes)\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers)\n if (animationData.assets) {\n var i\n var len = animationData.assets.length\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers)\n }\n }\n }\n }\n }\n })()\n\n function completeData(animationData) {\n if (animationData.__complete) {\n return\n }\n checkColors(animationData)\n checkText(animationData)\n checkChars(animationData)\n checkPathProperties(animationData)\n checkShapes(animationData)\n completeLayers(animationData.layers, animationData.assets)\n completeChars(animationData.chars, animationData.assets)\n animationData.__complete = true\n }\n\n function completeText(data) {\n if (data.t.a.length === 0 && !('m' in data.t.p)) {\n // data.singleShape = true;\n }\n }\n\n var moduleOb = {}\n moduleOb.completeData = completeData\n moduleOb.checkColors = checkColors\n moduleOb.checkChars = checkChars\n moduleOb.checkPathProperties = checkPathProperties\n moduleOb.checkShapes = checkShapes\n moduleOb.completeLayers = completeLayers\n\n return moduleOb\n }\n if (!_workerSelf.dataManager) {\n _workerSelf.dataManager = dataFunctionManager()\n }\n\n if (!_workerSelf.assetLoader) {\n _workerSelf.assetLoader = (function () {\n function formatResponse(xhr) {\n // using typeof doubles the time of execution of this method,\n // so if available, it's better to use the header to validate the type\n var contentTypeHeader = xhr.getResponseHeader('content-type')\n if (contentTypeHeader && xhr.responseType === 'json' && contentTypeHeader.indexOf('json') !== -1) {\n return xhr.response\n }\n if (xhr.response && typeof xhr.response === 'object') {\n return xhr.response\n }\n if (xhr.response && typeof xhr.response === 'string') {\n return JSON.parse(xhr.response)\n }\n if (xhr.responseText) {\n return JSON.parse(xhr.responseText)\n }\n return null\n }\n\n function loadAsset(path, fullPath, callback, errorCallback) {\n var response\n var xhr = new XMLHttpRequest()\n // set responseType after calling open or IE will break.\n try {\n // This crashes on Android WebView prior to KitKat\n xhr.responseType = 'json'\n } catch (err) {} // eslint-disable-line no-empty\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n response = formatResponse(xhr)\n callback(response)\n } else {\n try {\n response = formatResponse(xhr)\n callback(response)\n } catch (err) {\n if (errorCallback) {\n errorCallback(err)\n }\n }\n }\n }\n }\n try {\n xhr.open('GET', path, true)\n } catch (error) {\n xhr.open('GET', fullPath + '/' + path, true)\n }\n xhr.send()\n }\n return {\n load: loadAsset,\n }\n })()\n }\n\n if (e.data.type === 'loadAnimation') {\n _workerSelf.assetLoader.load(\n e.data.path,\n e.data.fullPath,\n function (data) {\n _workerSelf.dataManager.completeData(data)\n _workerSelf.postMessage({\n id: e.data.id,\n payload: data,\n status: 'success',\n })\n },\n function () {\n _workerSelf.postMessage({\n id: e.data.id,\n status: 'error',\n })\n },\n )\n } else if (e.data.type === 'complete') {\n var animation = e.data.animation\n _workerSelf.dataManager.completeData(animation)\n _workerSelf.postMessage({\n id: e.data.id,\n payload: animation,\n status: 'success',\n })\n } else if (e.data.type === 'loadData') {\n _workerSelf.assetLoader.load(\n e.data.path,\n e.data.fullPath,\n function (data) {\n _workerSelf.postMessage({\n id: e.data.id,\n payload: data,\n status: 'success',\n })\n },\n function () {\n _workerSelf.postMessage({\n id: e.data.id,\n status: 'error',\n })\n },\n )\n }\n })\n\n workerInstance.onmessage = function (event) {\n var data = event.data\n var id = data.id\n var process = processes[id]\n processes[id] = null\n if (data.status === 'success') {\n process.onComplete(data.payload)\n } else if (process.onError) {\n process.onError()\n }\n }\n }\n }\n\n function createProcess(onComplete, onError) {\n _counterId += 1\n var id = 'processId_' + _counterId\n processes[id] = {\n onComplete: onComplete,\n onError: onError,\n }\n return id\n }\n\n function loadAnimation(path, onComplete, onError) {\n setupWorker()\n var processId = createProcess(onComplete, onError)\n workerInstance.postMessage({\n type: 'loadAnimation',\n path: path,\n fullPath: window.location.origin + window.location.pathname,\n id: processId,\n })\n }\n\n function loadData(path, onComplete, onError) {\n setupWorker()\n var processId = createProcess(onComplete, onError)\n workerInstance.postMessage({\n type: 'loadData',\n path: path,\n fullPath: window.location.origin + window.location.pathname,\n id: processId,\n })\n }\n\n function completeAnimation(anim, onComplete, onError) {\n setupWorker()\n var processId = createProcess(onComplete, onError)\n workerInstance.postMessage({\n type: 'complete',\n animation: anim,\n id: processId,\n })\n }\n\n return {\n loadAnimation: loadAnimation,\n loadData: loadData,\n completeAnimation: completeAnimation,\n }\n })()\n\n const ImagePreloader = (function () {\n var proxyImage = (function () {\n var canvas = createTag('canvas')\n canvas.width = 1\n canvas.height = 1\n var ctx = canvas.getContext('2d')\n ctx.fillStyle = 'rgba(0,0,0,0)'\n ctx.fillRect(0, 0, 1, 1)\n return canvas\n })()\n\n function imageLoaded() {\n this.loadedAssets += 1\n if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) {\n if (this.imagesLoadedCb) {\n this.imagesLoadedCb(null)\n }\n }\n }\n function footageLoaded() {\n this.loadedFootagesCount += 1\n if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) {\n if (this.imagesLoadedCb) {\n this.imagesLoadedCb(null)\n }\n }\n }\n\n function getAssetsPath(assetData, assetsPath, originalPath) {\n var path = ''\n if (assetData.e) {\n path = assetData.p\n } else if (assetsPath) {\n var imagePath = assetData.p\n if (imagePath.indexOf('images/') !== -1) {\n imagePath = imagePath.split('/')[1]\n }\n path = assetsPath + imagePath\n } else {\n path = originalPath\n path += assetData.u ? assetData.u : ''\n path += assetData.p\n }\n return path\n }\n\n function testImageLoaded(img) {\n var _count = 0\n var intervalId = setInterval(\n function () {\n var box = img.getBBox()\n if (box.width || _count > 500) {\n this._imageLoaded()\n clearInterval(intervalId)\n }\n _count += 1\n }.bind(this),\n 50,\n )\n }\n\n function createImageData(assetData) {\n var path = getAssetsPath(assetData, this.assetsPath, this.path)\n var img = createNS('image')\n if (isSafari) {\n this.testImageLoaded(img)\n } else {\n img.addEventListener('load', this._imageLoaded, false)\n }\n img.addEventListener(\n 'error',\n function () {\n ob.img = proxyImage\n this._imageLoaded()\n }.bind(this),\n false,\n )\n img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path)\n if (this._elementHelper.append) {\n this._elementHelper.append(img)\n } else {\n this._elementHelper.appendChild(img)\n }\n var ob = {\n img: img,\n assetData: assetData,\n }\n return ob\n }\n\n function createImgData(assetData) {\n var path = getAssetsPath(assetData, this.assetsPath, this.path)\n var img = createTag('img')\n img.crossOrigin = 'anonymous'\n img.addEventListener('load', this._imageLoaded, false)\n img.addEventListener(\n 'error',\n function () {\n ob.img = proxyImage\n this._imageLoaded()\n }.bind(this),\n false,\n )\n img.src = path\n var ob = {\n img: img,\n assetData: assetData,\n }\n return ob\n }\n\n function createFootageData(data) {\n var ob = {\n assetData: data,\n }\n var path = getAssetsPath(data, this.assetsPath, this.path)\n dataManager.loadData(\n path,\n function (footageData) {\n ob.img = footageData\n this._footageLoaded()\n }.bind(this),\n function () {\n ob.img = {}\n this._footageLoaded()\n }.bind(this),\n )\n return ob\n }\n\n function loadAssets(assets, cb) {\n this.imagesLoadedCb = cb\n var i\n var len = assets.length\n for (i = 0; i < len; i += 1) {\n if (!assets[i].layers) {\n if (!assets[i].t || assets[i].t === 'seq') {\n this.totalImages += 1\n this.images.push(this._createImageData(assets[i]))\n } else if (assets[i].t === 3) {\n this.totalFootages += 1\n this.images.push(this.createFootageData(assets[i]))\n }\n }\n }\n }\n\n function setPath(path) {\n this.path = path || ''\n }\n\n function setAssetsPath(path) {\n this.assetsPath = path || ''\n }\n\n function getAsset(assetData) {\n var i = 0\n var len = this.images.length\n while (i < len) {\n if (this.images[i].assetData === assetData) {\n return this.images[i].img\n }\n i += 1\n }\n return null\n }\n\n function destroy() {\n this.imagesLoadedCb = null\n this.images.length = 0\n }\n\n function loadedImages() {\n return this.totalImages === this.loadedAssets\n }\n\n function loadedFootages() {\n return this.totalFootages === this.loadedFootagesCount\n }\n\n function setCacheType(type, elementHelper) {\n if (type === 'svg') {\n this._elementHelper = elementHelper\n this._createImageData = this.createImageData.bind(this)\n } else {\n this._createImageData = this.createImgData.bind(this)\n }\n }\n\n function ImagePreloaderFactory() {\n this._imageLoaded = imageLoaded.bind(this)\n this._footageLoaded = footageLoaded.bind(this)\n this.testImageLoaded = testImageLoaded.bind(this)\n this.createFootageData = createFootageData.bind(this)\n this.assetsPath = ''\n this.path = ''\n this.totalImages = 0\n this.totalFootages = 0\n this.loadedAssets = 0\n this.loadedFootagesCount = 0\n this.imagesLoadedCb = null\n this.images = []\n }\n\n ImagePreloaderFactory.prototype = {\n loadAssets: loadAssets,\n setAssetsPath: setAssetsPath,\n setPath: setPath,\n loadedImages: loadedImages,\n loadedFootages: loadedFootages,\n destroy: destroy,\n getAsset: getAsset,\n createImgData: createImgData,\n createImageData: createImageData,\n imageLoaded: imageLoaded,\n footageLoaded: footageLoaded,\n setCacheType: setCacheType,\n }\n\n return ImagePreloaderFactory\n })()\n\n function BaseEvent() {}\n BaseEvent.prototype = {\n triggerEvent: function (eventName, args) {\n if (this._cbs[eventName]) {\n var callbacks = this._cbs[eventName]\n for (var i = 0; i < callbacks.length; i += 1) {\n callbacks[i](args)\n }\n }\n },\n addEventListener: function (eventName, callback) {\n if (!this._cbs[eventName]) {\n this._cbs[eventName] = []\n }\n this._cbs[eventName].push(callback)\n\n return function () {\n this.removeEventListener(eventName, callback)\n }.bind(this)\n },\n removeEventListener: function (eventName, callback) {\n if (!callback) {\n this._cbs[eventName] = null\n } else if (this._cbs[eventName]) {\n var i = 0\n var len = this._cbs[eventName].length\n while (i < len) {\n if (this._cbs[eventName][i] === callback) {\n this._cbs[eventName].splice(i, 1)\n i -= 1\n len -= 1\n }\n i += 1\n }\n if (!this._cbs[eventName].length) {\n this._cbs[eventName] = null\n }\n }\n },\n }\n\n const markerParser = (function () {\n function parsePayloadLines(payload) {\n var lines = payload.split('\\r\\n')\n var keys = {}\n var line\n var keysCount = 0\n for (var i = 0; i < lines.length; i += 1) {\n line = lines[i].split(':')\n if (line.length === 2) {\n keys[line[0]] = line[1].trim()\n keysCount += 1\n }\n }\n if (keysCount === 0) {\n throw new Error()\n }\n return keys\n }\n\n return function (_markers) {\n var markers = []\n for (var i = 0; i < _markers.length; i += 1) {\n var _marker = _markers[i]\n var markerData = {\n time: _marker.tm,\n duration: _marker.dr,\n }\n try {\n markerData.payload = JSON.parse(_markers[i].cm)\n } catch (_) {\n try {\n markerData.payload = parsePayloadLines(_markers[i].cm)\n } catch (__) {\n markerData.payload = {\n name: _markers[i].cm,\n }\n }\n }\n markers.push(markerData)\n }\n return markers\n }\n })()\n\n const ProjectInterface = (function () {\n function registerComposition(comp) {\n this.compositions.push(comp)\n }\n\n return function () {\n function _thisProjectFunction(name) {\n var i = 0\n var len = this.compositions.length\n while (i < len) {\n if (this.compositions[i].data && this.compositions[i].data.nm === name) {\n if (this.compositions[i].prepareFrame && this.compositions[i].data.xt) {\n this.compositions[i].prepareFrame(this.currentFrame)\n }\n return this.compositions[i].compInterface\n }\n i += 1\n }\n return null\n }\n\n _thisProjectFunction.compositions = []\n _thisProjectFunction.currentFrame = 0\n\n _thisProjectFunction.registerComposition = registerComposition\n\n return _thisProjectFunction\n }\n })()\n\n const renderers = {}\n\n const registerRenderer = (key, value) => {\n renderers[key] = value\n }\n\n function getRenderer(key) {\n return renderers[key]\n }\n\n const AnimationItem = function () {\n this._cbs = []\n this.name = ''\n this.path = ''\n this.isLoaded = false\n this.currentFrame = 0\n this.currentRawFrame = 0\n this.firstFrame = 0\n this.totalFrames = 0\n this.frameRate = 0\n this.frameMult = 0\n this.playSpeed = 1\n this.playDirection = 1\n this.playCount = 0\n this.animationData = {}\n this.assets = []\n this.isPaused = true\n this.autoplay = false\n this.loop = true\n this.renderer = null\n this.animationID = createElementID()\n this.assetsPath = ''\n this.timeCompleted = 0\n this.segmentPos = 0\n this.isSubframeEnabled = getSubframeEnabled()\n this.segments = []\n this._idle = true\n this._completedLoop = false\n this.projectInterface = ProjectInterface()\n this.imagePreloader = new ImagePreloader()\n this.audioController = audioControllerFactory()\n this.markers = []\n this.configAnimation = this.configAnimation.bind(this)\n this.onSetupError = this.onSetupError.bind(this)\n this.onSegmentComplete = this.onSegmentComplete.bind(this)\n this.drawnFrameEvent = new BMEnterFrameEvent('drawnFrame', 0, 0, 0)\n }\n\n extendPrototype([BaseEvent], AnimationItem)\n\n AnimationItem.prototype.setParams = function (params) {\n if (params.wrapper || params.container) {\n this.wrapper = params.wrapper || params.container\n }\n var animType = 'svg'\n if (params.animType) {\n animType = params.animType\n } else if (params.renderer) {\n animType = params.renderer\n }\n const RendererClass = getRenderer(animType)\n this.renderer = new RendererClass(this, params.rendererSettings)\n this.imagePreloader.setCacheType(animType, this.renderer.globalData.defs)\n this.renderer.setProjectInterface(this.projectInterface)\n this.animType = animType\n if (params.loop === '' || params.loop === null || params.loop === undefined || params.loop === true) {\n this.loop = true\n } else if (params.loop === false) {\n this.loop = false\n } else {\n this.loop = parseInt(params.loop, 10)\n }\n this.autoplay = 'autoplay' in params ? params.autoplay : true\n this.name = params.name ? params.name : ''\n this.autoloadSegments = Object.prototype.hasOwnProperty.call(params, 'autoloadSegments')\n ? params.autoloadSegments\n : true\n this.assetsPath = params.assetsPath\n this.initialSegment = params.initialSegment\n if (params.audioFactory) {\n this.audioController.setAudioFactory(params.audioFactory)\n }\n if (params.animationData) {\n this.setupAnimation(params.animationData)\n } else if (params.path) {\n if (params.path.lastIndexOf('\\\\') !== -1) {\n this.path = params.path.substr(0, params.path.lastIndexOf('\\\\') + 1)\n } else {\n this.path = params.path.substr(0, params.path.lastIndexOf('/') + 1)\n }\n this.fileName = params.path.substr(params.path.lastIndexOf('/') + 1)\n this.fileName = this.fileName.substr(0, this.fileName.lastIndexOf('.json'))\n dataManager.loadAnimation(params.path, this.configAnimation, this.onSetupError)\n }\n }\n\n AnimationItem.prototype.onSetupError = function () {\n this.trigger('data_failed')\n }\n\n AnimationItem.prototype.setupAnimation = function (data) {\n dataManager.completeAnimation(data, this.configAnimation)\n }\n\n AnimationItem.prototype.setData = function (wrapper, animationData) {\n if (animationData) {\n if (typeof animationData !== 'object') {\n animationData = JSON.parse(animationData)\n }\n }\n var params = {\n wrapper: wrapper,\n animationData: animationData,\n }\n var wrapperAttributes = wrapper.attributes\n\n params.path = wrapperAttributes.getNamedItem('data-animation-path') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-animation-path').value\n : wrapperAttributes.getNamedItem('data-bm-path') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedI