(function ($) {

    !function (a, b) { "object" == typeof exports && "undefined" != typeof module ? b(exports) : "function" == typeof define && define.amd ? define(["exports"], b) : b((a = a || self).window = a.window || {}) }(this, function (a) { "use strict"; function k() { return "undefined" != typeof window } function f() { return i || k() && (i = window.gsap) && i.registerPlugin && i } function l(a) { return Math.round(1e4 * a) / 1e4 } function m(a) { return parseFloat(a) || 0 } function n(a, c) { var b = m(a); return ~a.indexOf("%") ? b / 100 * c : b } function o(a, b) { return m(a.getAttribute(b)) } function p(a, b, c, d, e, f) { return A(Math.pow((m(c) - m(a)) * e, 2) + Math.pow((m(d) - m(b)) * f, 2)) } function q(a) { return console.warn(a) } function r(a) { return "non-scaling-stroke" === a.getAttribute("vector-effect") } function g(c) { if (!(c = t(c)[0])) return 0; var e, m, d, v, h, n, s, b = c.tagName.toLowerCase(), u = c.style, i = 1, a = 1; r(c) && (i = A((a = c.getScreenCTM()).a * a.a + a.b * a.b), a = A(a.d * a.d + a.c * a.c)); try { m = c.getBBox() } catch (w) { q("Some browsers won't measure invisible elements (like display:none or masks inside defs).") } var j = m || { x: 0, y: 0, width: 0, height: 0 }, k = j.x, _ = j.y, f = j.width, g = j.height; if (m && (f || g) || !z[b] || (f = o(c, z[b][0]), g = o(c, z[b][1]), "rect" !== b && "line" !== b && (f *= 2, g *= 2), "line" === b && (k = o(c, "x1"), _ = o(c, "y1"), f = Math.abs(f - k), g = Math.abs(g - _))), "path" === b) v = u.strokeDasharray, u.strokeDasharray = "none", e = c.getTotalLength() || 0, l(i) !== l(a) && !x && (x = 1) && q("Warning: <path> length cannot be measured when vector-effect is non-scaling-stroke and the element isn't proportionally scaled."), e *= (i + a) / 2, u.strokeDasharray = v; else if ("rect" === b) e = 2 * f * i + 2 * g * a; else if ("line" === b) e = p(k, _, k + f, _ + g, i, a); else if ("polyline" === b || "polygon" === b) for (d = c.getAttribute("points").match(y) || [], "polygon" === b && d.push(d[0], d[1]), e = 0, h = 2; h < d.length; h += 2)e += p(d[h - 2], d[h - 1], d[h], d[h + 1], i, a) || 0; else "circle" !== b && "ellipse" !== b || (e = Math.PI * (3 * ((n = f / 2 * i) + (s = g / 2 * a)) - A((3 * n + s) * (n + 3 * s)))); return e || 0 } function h(c, b) { if (!(c = t(c)[0])) return [0, 0]; b = b || g(c) + 1; var e = u.getComputedStyle(c), a = e.strokeDasharray || "", f = m(e.strokeDashoffset), d = a.indexOf(","); return d < 0 && (d = a.indexOf(" ")), b < (a = d < 0 ? b : m(a.substr(0, d))) && (a = b), [-f || 0, a - f || 0] } function s() { k() && (u = window, w = i = f(), t = i.utils.toArray, v = -1 !== ((u.navigator || {}).userAgent || "").indexOf("Edge")) } var d, b, e, i, t, u, v, w, x, y = /[-+=\.]*\d+[\.e\-\+]*\d*[e\-\+]*\d*/gi, z = { rect: ["width", "height"], circle: ["r", "r"], ellipse: ["rx", "ry"], line: ["x2", "y2"] }, A = Math.sqrt, j = function () { return String.fromCharCode.apply(null, arguments) }(109), B = (d = "undefined" != typeof window ? window.location.host : "", window, b = [j], e = b.length, -1 !== d.indexOf(b[e]) || !0), c = { version: "3.10.4", name: "PaSvgDrawer", register: function (a) { i = a, s() }, init: function (b, a) { if (!b.getBBox) return !1; w || s(); var i, c, k, e, o, p, d, f, j, q = g(b); return this._style = b.style, this._target = b, a + "" == "true" ? a = "0 100%" : a ? -1 === (a + "").indexOf(" ") && (a = "0 " + a) : a = "0 0", c = (e = a, o = q, p = (i = h(b, q))[0], j = e.indexOf(" "), f = j < 0 ? (d = void 0 !== p ? p + "" : e, e) : (d = e.substr(0, j), e.substr(j + 1)), d = n(d, o), (f = n(f, o)) < d ? [f, d] : [d, f]), this._length = l(q), this._dash = l(i[1] - i[0]), this._offset = l(-i[0]), this._dashPT = this.add(this, "_dash", this._dash, l(c[1] - c[0])), this._offsetPT = this.add(this, "_offset", this._offset, l(-c[0])), v && (k = u.getComputedStyle(b)).strokeLinecap !== k.strokeLinejoin && (c = m(k.strokeMiterlimit), this.add(b.style, "strokeMiterlimit", c, c + .01)), this._live = r(b) || ~(a + "").indexOf("live"), this._nowrap = ~(a + "").indexOf("nowrap"), this._props.push("PaSvgDrawer"), B }, render: function (h, a) { var b, e, c, d, f = a._pt, i = a._style; if (f) { for (a._live && (b = g(a._target)) !== a._length && (e = b / a._length, a._length = b, a._offsetPT && (a._offsetPT.s *= e, a._offsetPT.c *= e), a._dashPT ? (a._dashPT.s *= e, a._dashPT.c *= e) : a._dash *= e); f;)f.r(h, f.d), f = f._next; c = a._dash || h && 1 !== h && 1e-4 || 0, b = a._length - c + .1, d = a._offset, c && d && c + Math.abs(d % a._length) > a._length - .2 && (d += d < 0 ? .1 : -0.1) && (b += .1), i.strokeDashoffset = c ? d : d + .001, i.strokeDasharray = b < .2 ? "none" : c ? c + "px," + (a._nowrap ? 999999 : b) + "px" : "0px, 999999px" } }, getLength: g, getPosition: h }; f() && i.registerPlugin(c), a.PaSvgDrawer = c, a.default = c, "undefined" == typeof window || window !== a ? Object.defineProperty(a, "__esModule", { value: !0 }) : delete a.default });

    (function (global, factory) {
        typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
            typeof define === 'function' && define.amd ? define(['exports'], factory) :
                (global = global || self, factory(global.window = global.window || {}));
    }(this, (function (exports) {
        'use strict';

        var _svgPathExp = /[achlmqstvz]|(-?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/ig,
            _numbersExp = /(?:(-)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/ig,
            _scientific = /[\+\-]?\d*\.?\d+e[\+\-]?\d+/ig,
            _selectorExp = /(^[#\.][a-z]|[a-y][a-z])/i,
            _DEG2RAD = Math.PI / 180,
            _RAD2DEG = 180 / Math.PI,
            _sin = Math.sin,
            _cos = Math.cos,
            _abs = Math.abs,
            _sqrt = Math.sqrt,
            _atan2 = Math.atan2,
            _largeNum = 1e8,
            _isString = function _isString(value) {
                return typeof value === "string";
            },
            _isNumber = function _isNumber(value) {
                return typeof value === "number";
            },
            _isUndefined = function _isUndefined(value) {
                return typeof value === "undefined";
            },
            _temp = {},
            _temp2 = {},
            _roundingNum = 1e5,
            _wrapProgress = function _wrapProgress(progress) {
                return Math.round((progress + _largeNum) % 1 * _roundingNum) / _roundingNum || (progress < 0 ? 0 : 1);
            },
            _round = function _round(value) {
                return Math.round(value * _roundingNum) / _roundingNum || 0;
            },
            _roundPrecise = function _roundPrecise(value) {
                return Math.round(value * 1e10) / 1e10 || 0;
            },
            _splitSegment = function _splitSegment(rawPath, segIndex, i, t) {
                var segment = rawPath[segIndex],
                    shift = t === 1 ? 6 : subdivideSegment(segment, i, t);

                if (shift && shift + i + 2 < segment.length) {
                    rawPath.splice(segIndex, 0, segment.slice(0, i + shift + 2));
                    segment.splice(0, i + shift);
                    return 1;
                }
            },
            _getSampleIndex = function _getSampleIndex(samples, length, progress) {
                var l = samples.length,
                    i = ~~(progress * l);

                if (samples[i] > length) {
                    while (--i && samples[i] > length) { }

                    i < 0 && (i = 0);
                } else {
                    while (samples[++i] < length && i < l) { }
                }

                return i < l ? i : l - 1;
            },
            _reverseRawPath = function _reverseRawPath(rawPath, skipOuter) {
                var i = rawPath.length;
                skipOuter || rawPath.reverse();

                while (i--) {
                    rawPath[i].reversed || reverseSegment(rawPath[i]);
                }
            },
            _copyMetaData = function _copyMetaData(source, copy) {
                copy.totalLength = source.totalLength;

                if (source.samples) {
                    copy.samples = source.samples.slice(0);
                    copy.lookup = source.lookup.slice(0);
                    copy.minLength = source.minLength;
                    copy.resolution = source.resolution;
                } else if (source.totalPoints) {
                    copy.totalPoints = source.totalPoints;
                }

                return copy;
            },
            _appendOrMerge = function _appendOrMerge(rawPath, segment) {
                var index = rawPath.length,
                    prevSeg = rawPath[index - 1] || [],
                    l = prevSeg.length;

                if (index && segment[0] === prevSeg[l - 2] && segment[1] === prevSeg[l - 1]) {
                    segment = prevSeg.concat(segment.slice(2));
                    index--;
                }

                rawPath[index] = segment;
            };

        function getRawPath(value) {
            value = _isString(value) && _selectorExp.test(value) ? document.querySelector(value) || value : value;
            var e = value.getAttribute ? value : 0,
                rawPath;

            if (e && (value = value.getAttribute("d"))) {
                if (!e._gsPath) {
                    e._gsPath = {};
                }

                rawPath = e._gsPath[value];
                return rawPath && !rawPath._dirty ? rawPath : e._gsPath[value] = stringToRawPath(value);
            }

            return !value ? console.warn("Expecting a <path> element or an SVG path data string") : _isString(value) ? stringToRawPath(value) : _isNumber(value[0]) ? [value] : value;
        }
        function copyRawPath(rawPath) {
            var a = [],
                i = 0;

            for (; i < rawPath.length; i++) {
                a[i] = _copyMetaData(rawPath[i], rawPath[i].slice(0));
            }

            return _copyMetaData(rawPath, a);
        }
        function reverseSegment(segment) {
            var i = 0,
                y;
            segment.reverse();

            for (; i < segment.length; i += 2) {
                y = segment[i];
                segment[i] = segment[i + 1];
                segment[i + 1] = y;
            }

            segment.reversed = !segment.reversed;
        }

        var _createPath = function _createPath(e, ignore) {
            var path = document.createElementNS("http://www.w3.org/2000/svg", "path"),
                attr = [].slice.call(e.attributes),
                i = attr.length,
                name;
            ignore = "," + ignore + ",";

            while (--i > -1) {
                name = attr[i].nodeName.toLowerCase();

                if (ignore.indexOf("," + name + ",") < 0) {
                    path.setAttributeNS(null, name, attr[i].nodeValue);
                }
            }

            return path;
        },
            _typeAttrs = {
                rect: "rx,ry,x,y,width,height",
                circle: "r,cx,cy",
                ellipse: "rx,ry,cx,cy",
                line: "x1,x2,y1,y2"
            },
            _attrToObj = function _attrToObj(e, attrs) {
                var props = attrs ? attrs.split(",") : [],
                    obj = {},
                    i = props.length;

                while (--i > -1) {
                    obj[props[i]] = +e.getAttribute(props[i]) || 0;
                }

                return obj;
            };

        function convertToPath(element, swap) {
            var type = element.tagName.toLowerCase(),
                circ = 0.552284749831,
                data,
                x,
                y,
                r,
                ry,
                path,
                rcirc,
                rycirc,
                points,
                w,
                h,
                x2,
                x3,
                x4,
                x5,
                x6,
                y2,
                y3,
                y4,
                y5,
                y6,
                attr;

            if (type === "path" || !element.getBBox) {
                return element;
            }

            path = _createPath(element, "x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points");
            attr = _attrToObj(element, _typeAttrs[type]);

            if (type === "rect") {
                r = attr.rx;
                ry = attr.ry || r;
                x = attr.x;
                y = attr.y;
                w = attr.width - r * 2;
                h = attr.height - ry * 2;

                if (r || ry) {
                    x2 = x + r * (1 - circ);
                    x3 = x + r;
                    x4 = x3 + w;
                    x5 = x4 + r * circ;
                    x6 = x4 + r;
                    y2 = y + ry * (1 - circ);
                    y3 = y + ry;
                    y4 = y3 + h;
                    y5 = y4 + ry * circ;
                    y6 = y4 + ry;
                    data = "M" + x6 + "," + y3 + " V" + y4 + " C" + [x6, y5, x5, y6, x4, y6, x4 - (x4 - x3) / 3, y6, x3 + (x4 - x3) / 3, y6, x3, y6, x2, y6, x, y5, x, y4, x, y4 - (y4 - y3) / 3, x, y3 + (y4 - y3) / 3, x, y3, x, y2, x2, y, x3, y, x3 + (x4 - x3) / 3, y, x4 - (x4 - x3) / 3, y, x4, y, x5, y, x6, y2, x6, y3].join(",") + "z";
                } else {
                    data = "M" + (x + w) + "," + y + " v" + h + " h" + -w + " v" + -h + " h" + w + "z";
                }
            } else if (type === "circle" || type === "ellipse") {
                if (type === "circle") {
                    r = ry = attr.r;
                    rycirc = r * circ;
                } else {
                    r = attr.rx;
                    ry = attr.ry;
                    rycirc = ry * circ;
                }

                x = attr.cx;
                y = attr.cy;
                rcirc = r * circ;
                data = "M" + (x + r) + "," + y + " C" + [x + r, y + rycirc, x + rcirc, y + ry, x, y + ry, x - rcirc, y + ry, x - r, y + rycirc, x - r, y, x - r, y - rycirc, x - rcirc, y - ry, x, y - ry, x + rcirc, y - ry, x + r, y - rycirc, x + r, y].join(",") + "z";
            } else if (type === "line") {
                data = "M" + attr.x1 + "," + attr.y1 + " L" + attr.x2 + "," + attr.y2;
            } else if (type === "polyline" || type === "polygon") {
                points = (element.getAttribute("points") + "").match(_numbersExp) || [];
                x = points.shift();
                y = points.shift();
                data = "M" + x + "," + y + " L" + points.join(",");

                if (type === "polygon") {
                    data += "," + x + "," + y + "z";
                }
            }

            path.setAttribute("d", rawPathToString(path._gsRawPath = stringToRawPath(data)));

            if (swap && element.parentNode) {
                element.parentNode.insertBefore(path, element);
                element.parentNode.removeChild(element);
            }

            return path;
        }

        function getRotationAtBezierT(segment, i, t) {
            var a = segment[i],
                b = segment[i + 2],
                c = segment[i + 4],
                x;
            a += (b - a) * t;
            b += (c - b) * t;
            a += (b - a) * t;
            x = b + (c + (segment[i + 6] - c) * t - b) * t - a;
            a = segment[i + 1];
            b = segment[i + 3];
            c = segment[i + 5];
            a += (b - a) * t;
            b += (c - b) * t;
            a += (b - a) * t;
            return _round(_atan2(b + (c + (segment[i + 7] - c) * t - b) * t - a, x) * _RAD2DEG);
        }

        function sliceRawPath(rawPath, start, end) {
            end = _isUndefined(end) ? 1 : _roundPrecise(end) || 0;
            start = _roundPrecise(start) || 0;
            var loops = Math.max(0, ~~(_abs(end - start) - 1e-8)),
                path = copyRawPath(rawPath);

            if (start > end) {
                start = 1 - start;
                end = 1 - end;

                _reverseRawPath(path);

                path.totalLength = 0;
            }

            if (start < 0 || end < 0) {
                var offset = Math.abs(~~Math.min(start, end)) + 1;
                start += offset;
                end += offset;
            }

            path.totalLength || cacheRawPathMeasurements(path);
            var wrap = end > 1,
                s = getProgressData(path, start, _temp, true),
                e = getProgressData(path, end, _temp2),
                eSeg = e.segment,
                sSeg = s.segment,
                eSegIndex = e.segIndex,
                sSegIndex = s.segIndex,
                ei = e.i,
                si = s.i,
                sameSegment = sSegIndex === eSegIndex,
                sameBezier = ei === si && sameSegment,
                wrapsBehind,
                sShift,
                eShift,
                i,
                copy,
                totalSegments,
                l,
                j;

            if (wrap || loops) {
                wrapsBehind = eSegIndex < sSegIndex || sameSegment && ei < si || sameBezier && e.t < s.t;

                if (_splitSegment(path, sSegIndex, si, s.t)) {
                    sSegIndex++;

                    if (!wrapsBehind) {
                        eSegIndex++;

                        if (sameBezier) {
                            e.t = (e.t - s.t) / (1 - s.t);
                            ei = 0;
                        } else if (sameSegment) {
                            ei -= si;
                        }
                    }
                }

                if (Math.abs(1 - (end - start)) < 1e-5) {
                    eSegIndex = sSegIndex - 1;
                } else if (!e.t && eSegIndex) {
                    eSegIndex--;
                } else if (_splitSegment(path, eSegIndex, ei, e.t) && wrapsBehind) {
                    sSegIndex++;
                }

                if (s.t === 1) {
                    sSegIndex = (sSegIndex + 1) % path.length;
                }

                copy = [];
                totalSegments = path.length;
                l = 1 + totalSegments * loops;
                j = sSegIndex;
                l += (totalSegments - sSegIndex + eSegIndex) % totalSegments;

                for (i = 0; i < l; i++) {
                    _appendOrMerge(copy, path[j++ % totalSegments]);
                }

                path = copy;
            } else {
                eShift = e.t === 1 ? 6 : subdivideSegment(eSeg, ei, e.t);

                if (start !== end) {
                    sShift = subdivideSegment(sSeg, si, sameBezier ? s.t / e.t : s.t);
                    sameSegment && (eShift += sShift);
                    eSeg.splice(ei + eShift + 2);
                    (sShift || si) && sSeg.splice(0, si + sShift);
                    i = path.length;

                    while (i--) {
                        (i < sSegIndex || i > eSegIndex) && path.splice(i, 1);
                    }
                } else {
                    eSeg.angle = getRotationAtBezierT(eSeg, ei + eShift, 0);
                    ei += eShift;
                    s = eSeg[ei];
                    e = eSeg[ei + 1];
                    eSeg.length = eSeg.totalLength = 0;
                    eSeg.totalPoints = path.totalPoints = 8;
                    eSeg.push(s, e, s, e, s, e, s, e);
                }
            }

            path.totalLength = 0;
            return path;
        }

        function measureSegment(segment, startIndex, bezierQty) {
            startIndex = startIndex || 0;

            if (!segment.samples) {
                segment.samples = [];
                segment.lookup = [];
            }

            var resolution = ~~segment.resolution || 12,
                inc = 1 / resolution,
                endIndex = bezierQty ? startIndex + bezierQty * 6 + 1 : segment.length,
                x1 = segment[startIndex],
                y1 = segment[startIndex + 1],
                samplesIndex = startIndex ? startIndex / 6 * resolution : 0,
                samples = segment.samples,
                lookup = segment.lookup,
                min = (startIndex ? segment.minLength : _largeNum) || _largeNum,
                prevLength = samples[samplesIndex + bezierQty * resolution - 1],
                length = startIndex ? samples[samplesIndex - 1] : 0,
                i,
                j,
                x4,
                x3,
                x2,
                xd,
                xd1,
                y4,
                y3,
                y2,
                yd,
                yd1,
                inv,
                t,
                lengthIndex,
                l,
                segLength;
            samples.length = lookup.length = 0;

            for (j = startIndex + 2; j < endIndex; j += 6) {
                x4 = segment[j + 4] - x1;
                x3 = segment[j + 2] - x1;
                x2 = segment[j] - x1;
                y4 = segment[j + 5] - y1;
                y3 = segment[j + 3] - y1;
                y2 = segment[j + 1] - y1;
                xd = xd1 = yd = yd1 = 0;

                if (_abs(x4) < .01 && _abs(y4) < .01 && _abs(x2) + _abs(y2) < .01) {
                    if (segment.length > 8) {
                        segment.splice(j, 6);
                        j -= 6;
                        endIndex -= 6;
                    }
                } else {
                    for (i = 1; i <= resolution; i++) {
                        t = inc * i;
                        inv = 1 - t;
                        xd = xd1 - (xd1 = (t * t * x4 + 3 * inv * (t * x3 + inv * x2)) * t);
                        yd = yd1 - (yd1 = (t * t * y4 + 3 * inv * (t * y3 + inv * y2)) * t);
                        l = _sqrt(yd * yd + xd * xd);

                        if (l < min) {
                            min = l;
                        }

                        length += l;
                        samples[samplesIndex++] = length;
                    }
                }

                x1 += x4;
                y1 += y4;
            }

            if (prevLength) {
                prevLength -= length;

                for (; samplesIndex < samples.length; samplesIndex++) {
                    samples[samplesIndex] += prevLength;
                }
            }

            if (samples.length && min) {
                segment.totalLength = segLength = samples[samples.length - 1] || 0;
                segment.minLength = min;

                if (segLength / min < 9999) {
                    l = lengthIndex = 0;

                    for (i = 0; i < segLength; i += min) {
                        lookup[l++] = samples[lengthIndex] < i ? ++lengthIndex : lengthIndex;
                    }
                }
            } else {
                segment.totalLength = samples[0] = 0;
            }

            return startIndex ? length - samples[startIndex / 2 - 1] : length;
        }

        function cacheRawPathMeasurements(rawPath, resolution) {
            var pathLength, points, i;

            for (i = pathLength = points = 0; i < rawPath.length; i++) {
                rawPath[i].resolution = ~~resolution || 12;
                points += rawPath[i].length;
                pathLength += measureSegment(rawPath[i]);
            }

            rawPath.totalPoints = points;
            rawPath.totalLength = pathLength;
            return rawPath;
        }
        function subdivideSegment(segment, i, t) {
            if (t <= 0 || t >= 1) {
                return 0;
            }

            var ax = segment[i],
                ay = segment[i + 1],
                cp1x = segment[i + 2],
                cp1y = segment[i + 3],
                cp2x = segment[i + 4],
                cp2y = segment[i + 5],
                bx = segment[i + 6],
                by = segment[i + 7],
                x1a = ax + (cp1x - ax) * t,
                x2 = cp1x + (cp2x - cp1x) * t,
                y1a = ay + (cp1y - ay) * t,
                y2 = cp1y + (cp2y - cp1y) * t,
                x1 = x1a + (x2 - x1a) * t,
                y1 = y1a + (y2 - y1a) * t,
                x2a = cp2x + (bx - cp2x) * t,
                y2a = cp2y + (by - cp2y) * t;
            x2 += (x2a - x2) * t;
            y2 += (y2a - y2) * t;
            segment.splice(i + 2, 4, _round(x1a), _round(y1a), _round(x1), _round(y1), _round(x1 + (x2 - x1) * t), _round(y1 + (y2 - y1) * t), _round(x2), _round(y2), _round(x2a), _round(y2a));
            segment.samples && segment.samples.splice(i / 6 * segment.resolution | 0, 0, 0, 0, 0, 0, 0, 0);
            return 6;
        }

        function getProgressData(rawPath, progress, decoratee, pushToNextIfAtEnd) {
            decoratee = decoratee || {};
            rawPath.totalLength || cacheRawPathMeasurements(rawPath);

            if (progress < 0 || progress > 1) {
                progress = _wrapProgress(progress);
            }

            var segIndex = 0,
                segment = rawPath[0],
                samples,
                resolution,
                length,
                min,
                max,
                i,
                t;

            if (!progress) {
                t = i = segIndex = 0;
                segment = rawPath[0];
            } else if (progress === 1) {
                t = 1;
                segIndex = rawPath.length - 1;
                segment = rawPath[segIndex];
                i = segment.length - 8;
            } else {
                if (rawPath.length > 1) {
                    length = rawPath.totalLength * progress;
                    max = i = 0;

                    while ((max += rawPath[i++].totalLength) < length) {
                        segIndex = i;
                    }

                    segment = rawPath[segIndex];
                    min = max - segment.totalLength;
                    progress = (length - min) / (max - min) || 0;
                }

                samples = segment.samples;
                resolution = segment.resolution;
                length = segment.totalLength * progress;
                i = segment.lookup.length ? segment.lookup[~~(length / segment.minLength)] || 0 : _getSampleIndex(samples, length, progress);
                min = i ? samples[i - 1] : 0;
                max = samples[i];

                if (max < length) {
                    min = max;
                    max = samples[++i];
                }

                t = 1 / resolution * ((length - min) / (max - min) + i % resolution);
                i = ~~(i / resolution) * 6;

                if (pushToNextIfAtEnd && t === 1) {
                    if (i + 6 < segment.length) {
                        i += 6;
                        t = 0;
                    } else if (segIndex + 1 < rawPath.length) {
                        i = t = 0;
                        segment = rawPath[++segIndex];
                    }
                }
            }

            decoratee.t = t;
            decoratee.i = i;
            decoratee.path = rawPath;
            decoratee.segment = segment;
            decoratee.segIndex = segIndex;
            return decoratee;
        }

        function getPositionOnPath(rawPath, progress, includeAngle, point) {
            var segment = rawPath[0],
                result = point || {},
                samples,
                resolution,
                length,
                min,
                max,
                i,
                t,
                a,
                inv;

            if (progress < 0 || progress > 1) {
                progress = _wrapProgress(progress);
            }

            if (rawPath.length > 1) {
                length = rawPath.totalLength * progress;
                max = i = 0;

                while ((max += rawPath[i++].totalLength) < length) {
                    segment = rawPath[i];
                }

                min = max - segment.totalLength;
                progress = (length - min) / (max - min) || 0;
            }

            samples = segment.samples;
            resolution = segment.resolution;
            length = segment.totalLength * progress;
            i = segment.lookup.length ? segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0 : _getSampleIndex(samples, length, progress);
            min = i ? samples[i - 1] : 0;
            max = samples[i];

            if (max < length) {
                min = max;
                max = samples[++i];
            }

            t = 1 / resolution * ((length - min) / (max - min) + i % resolution) || 0;
            inv = 1 - t;
            i = ~~(i / resolution) * 6;
            a = segment[i];
            result.x = _round((t * t * (segment[i + 6] - a) + 3 * inv * (t * (segment[i + 4] - a) + inv * (segment[i + 2] - a))) * t + a);
            result.y = _round((t * t * (segment[i + 7] - (a = segment[i + 1])) + 3 * inv * (t * (segment[i + 5] - a) + inv * (segment[i + 3] - a))) * t + a);

            if (includeAngle) {
                result.angle = segment.totalLength ? getRotationAtBezierT(segment, i, t >= 1 ? 1 - 1e-9 : t ? t : 1e-9) : segment.angle || 0;
            }

            return result;
        }
        function transformRawPath(rawPath, a, b, c, d, tx, ty) {
            var j = rawPath.length,
                segment,
                l,
                i,
                x,
                y;

            while (--j > -1) {
                segment = rawPath[j];
                l = segment.length;

                for (i = 0; i < l; i += 2) {
                    x = segment[i];
                    y = segment[i + 1];
                    segment[i] = x * a + y * c + tx;
                    segment[i + 1] = x * b + y * d + ty;
                }
            }

            rawPath._dirty = 1;
            return rawPath;
        }

        function arcToSegment(lastX, lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y) {
            if (lastX === x && lastY === y) {
                return;
            }

            rx = _abs(rx);
            ry = _abs(ry);

            var angleRad = angle % 360 * _DEG2RAD,
                cosAngle = _cos(angleRad),
                sinAngle = _sin(angleRad),
                PI = Math.PI,
                TWOPI = PI * 2,
                dx2 = (lastX - x) / 2,
                dy2 = (lastY - y) / 2,
                x1 = cosAngle * dx2 + sinAngle * dy2,
                y1 = -sinAngle * dx2 + cosAngle * dy2,
                x1_sq = x1 * x1,
                y1_sq = y1 * y1,
                radiiCheck = x1_sq / (rx * rx) + y1_sq / (ry * ry);

            if (radiiCheck > 1) {
                rx = _sqrt(radiiCheck) * rx;
                ry = _sqrt(radiiCheck) * ry;
            }

            var rx_sq = rx * rx,
                ry_sq = ry * ry,
                sq = (rx_sq * ry_sq - rx_sq * y1_sq - ry_sq * x1_sq) / (rx_sq * y1_sq + ry_sq * x1_sq);

            if (sq < 0) {
                sq = 0;
            }

            var coef = (largeArcFlag === sweepFlag ? -1 : 1) * _sqrt(sq),
                cx1 = coef * (rx * y1 / ry),
                cy1 = coef * -(ry * x1 / rx),
                sx2 = (lastX + x) / 2,
                sy2 = (lastY + y) / 2,
                cx = sx2 + (cosAngle * cx1 - sinAngle * cy1),
                cy = sy2 + (sinAngle * cx1 + cosAngle * cy1),
                ux = (x1 - cx1) / rx,
                uy = (y1 - cy1) / ry,
                vx = (-x1 - cx1) / rx,
                vy = (-y1 - cy1) / ry,
                temp = ux * ux + uy * uy,
                angleStart = (uy < 0 ? -1 : 1) * Math.acos(ux / _sqrt(temp)),
                angleExtent = (ux * vy - uy * vx < 0 ? -1 : 1) * Math.acos((ux * vx + uy * vy) / _sqrt(temp * (vx * vx + vy * vy)));

            isNaN(angleExtent) && (angleExtent = PI);

            if (!sweepFlag && angleExtent > 0) {
                angleExtent -= TWOPI;
            } else if (sweepFlag && angleExtent < 0) {
                angleExtent += TWOPI;
            }

            angleStart %= TWOPI;
            angleExtent %= TWOPI;

            var segments = Math.ceil(_abs(angleExtent) / (TWOPI / 4)),
                rawPath = [],
                angleIncrement = angleExtent / segments,
                controlLength = 4 / 3 * _sin(angleIncrement / 2) / (1 + _cos(angleIncrement / 2)),
                ma = cosAngle * rx,
                mb = sinAngle * rx,
                mc = sinAngle * -ry,
                md = cosAngle * ry,
                i;

            for (i = 0; i < segments; i++) {
                angle = angleStart + i * angleIncrement;
                x1 = _cos(angle);
                y1 = _sin(angle);
                ux = _cos(angle += angleIncrement);
                uy = _sin(angle);
                rawPath.push(x1 - controlLength * y1, y1 + controlLength * x1, ux + controlLength * uy, uy - controlLength * ux, ux, uy);
            }

            for (i = 0; i < rawPath.length; i += 2) {
                x1 = rawPath[i];
                y1 = rawPath[i + 1];
                rawPath[i] = x1 * ma + y1 * mc + cx;
                rawPath[i + 1] = x1 * mb + y1 * md + cy;
            }

            rawPath[i - 2] = x;
            rawPath[i - 1] = y;
            return rawPath;
        }

        function stringToRawPath(d) {
            var a = (d + "").replace(_scientific, function (m) {
                var n = +m;
                return n < 0.0001 && n > -0.0001 ? 0 : n;
            }).match(_svgPathExp) || [],
                path = [],
                relativeX = 0,
                relativeY = 0,
                twoThirds = 2 / 3,
                elements = a.length,
                points = 0,
                errorMessage = "ERROR: malformed path: " + d,
                i,
                j,
                x,
                y,
                command,
                isRelative,
                segment,
                startX,
                startY,
                difX,
                difY,
                beziers,
                prevCommand,
                flag1,
                flag2,
                line = function line(sx, sy, ex, ey) {
                    difX = (ex - sx) / 3;
                    difY = (ey - sy) / 3;
                    segment.push(sx + difX, sy + difY, ex - difX, ey - difY, ex, ey);
                };

            if (!d || !isNaN(a[0]) || isNaN(a[1])) {
                console.log(errorMessage);
                return path;
            }

            for (i = 0; i < elements; i++) {
                prevCommand = command;

                if (isNaN(a[i])) {
                    command = a[i].toUpperCase();
                    isRelative = command !== a[i];
                } else {
                    i--;
                }

                x = +a[i + 1];
                y = +a[i + 2];

                if (isRelative) {
                    x += relativeX;
                    y += relativeY;
                }

                if (!i) {
                    startX = x;
                    startY = y;
                }

                if (command === "M") {
                    if (segment) {
                        if (segment.length < 8) {
                            path.length -= 1;
                        } else {
                            points += segment.length;
                        }
                    }

                    relativeX = startX = x;
                    relativeY = startY = y;
                    segment = [x, y];
                    path.push(segment);
                    i += 2;
                    command = "L";
                } else if (command === "C") {
                    if (!segment) {
                        segment = [0, 0];
                    }

                    if (!isRelative) {
                        relativeX = relativeY = 0;
                    }

                    segment.push(x, y, relativeX + a[i + 3] * 1, relativeY + a[i + 4] * 1, relativeX += a[i + 5] * 1, relativeY += a[i + 6] * 1);
                    i += 6;
                } else if (command === "S") {
                    difX = relativeX;
                    difY = relativeY;

                    if (prevCommand === "C" || prevCommand === "S") {
                        difX += relativeX - segment[segment.length - 4];
                        difY += relativeY - segment[segment.length - 3];
                    }

                    if (!isRelative) {
                        relativeX = relativeY = 0;
                    }

                    segment.push(difX, difY, x, y, relativeX += a[i + 3] * 1, relativeY += a[i + 4] * 1);
                    i += 4;
                } else if (command === "Q") {
                    difX = relativeX + (x - relativeX) * twoThirds;
                    difY = relativeY + (y - relativeY) * twoThirds;

                    if (!isRelative) {
                        relativeX = relativeY = 0;
                    }

                    relativeX += a[i + 3] * 1;
                    relativeY += a[i + 4] * 1;
                    segment.push(difX, difY, relativeX + (x - relativeX) * twoThirds, relativeY + (y - relativeY) * twoThirds, relativeX, relativeY);
                    i += 4;
                } else if (command === "T") {
                    difX = relativeX - segment[segment.length - 4];
                    difY = relativeY - segment[segment.length - 3];
                    segment.push(relativeX + difX, relativeY + difY, x + (relativeX + difX * 1.5 - x) * twoThirds, y + (relativeY + difY * 1.5 - y) * twoThirds, relativeX = x, relativeY = y);
                    i += 2;
                } else if (command === "H") {
                    line(relativeX, relativeY, relativeX = x, relativeY);
                    i += 1;
                } else if (command === "V") {
                    line(relativeX, relativeY, relativeX, relativeY = x + (isRelative ? relativeY - relativeX : 0));
                    i += 1;
                } else if (command === "L" || command === "Z") {
                    if (command === "Z") {
                        x = startX;
                        y = startY;
                        segment.closed = true;
                    }

                    if (command === "L" || _abs(relativeX - x) > 0.5 || _abs(relativeY - y) > 0.5) {
                        line(relativeX, relativeY, x, y);

                        if (command === "L") {
                            i += 2;
                        }
                    }

                    relativeX = x;
                    relativeY = y;
                } else if (command === "A") {
                    flag1 = a[i + 4];
                    flag2 = a[i + 5];
                    difX = a[i + 6];
                    difY = a[i + 7];
                    j = 7;

                    if (flag1.length > 1) {
                        if (flag1.length < 3) {
                            difY = difX;
                            difX = flag2;
                            j--;
                        } else {
                            difY = flag2;
                            difX = flag1.substr(2);
                            j -= 2;
                        }

                        flag2 = flag1.charAt(1);
                        flag1 = flag1.charAt(0);
                    }

                    beziers = arcToSegment(relativeX, relativeY, +a[i + 1], +a[i + 2], +a[i + 3], +flag1, +flag2, (isRelative ? relativeX : 0) + difX * 1, (isRelative ? relativeY : 0) + difY * 1);
                    i += j;

                    if (beziers) {
                        for (j = 0; j < beziers.length; j++) {
                            segment.push(beziers[j]);
                        }
                    }

                    relativeX = segment[segment.length - 2];
                    relativeY = segment[segment.length - 1];
                } else {
                    console.log(errorMessage);
                }
            }

            i = segment.length;

            if (i < 6) {
                path.pop();
                i = 0;
            } else if (segment[0] === segment[i - 2] && segment[1] === segment[i - 1]) {
                segment.closed = true;
            }

            path.totalPoints = points + i;
            return path;
        }
        function flatPointsToSegment(points, curviness) {
            if (curviness === void 0) {
                curviness = 1;
            }

            var x = points[0],
                y = 0,
                segment = [x, y],
                i = 2;

            for (; i < points.length; i += 2) {
                segment.push(x, y, points[i], y = (points[i] - x) * curviness / 2, x = points[i], -y);
            }

            return segment;
        }
        function pointsToSegment(points, curviness) {
            _abs(points[0] - points[2]) < 1e-4 && _abs(points[1] - points[3]) < 1e-4 && (points = points.slice(2));
            var l = points.length - 2,
                x = +points[0],
                y = +points[1],
                nextX = +points[2],
                nextY = +points[3],
                segment = [x, y, x, y],
                dx2 = nextX - x,
                dy2 = nextY - y,
                closed = Math.abs(points[l] - x) < 0.001 && Math.abs(points[l + 1] - y) < 0.001,
                prevX,
                prevY,
                i,
                dx1,
                dy1,
                r1,
                r2,
                r3,
                tl,
                mx1,
                mx2,
                mxm,
                my1,
                my2,
                mym;

            if (closed) {
                points.push(nextX, nextY);
                nextX = x;
                nextY = y;
                x = points[l - 2];
                y = points[l - 1];
                points.unshift(x, y);
                l += 4;
            }

            curviness = curviness || curviness === 0 ? +curviness : 1;

            for (i = 2; i < l; i += 2) {
                prevX = x;
                prevY = y;
                x = nextX;
                y = nextY;
                nextX = +points[i + 2];
                nextY = +points[i + 3];

                if (x === nextX && y === nextY) {
                    continue;
                }

                dx1 = dx2;
                dy1 = dy2;
                dx2 = nextX - x;
                dy2 = nextY - y;
                r1 = _sqrt(dx1 * dx1 + dy1 * dy1);
                r2 = _sqrt(dx2 * dx2 + dy2 * dy2);
                r3 = _sqrt(Math.pow(dx2 / r2 + dx1 / r1, 2) + Math.pow(dy2 / r2 + dy1 / r1, 2));
                tl = (r1 + r2) * curviness * 0.25 / r3;
                mx1 = x - (x - prevX) * (r1 ? tl / r1 : 0);
                mx2 = x + (nextX - x) * (r2 ? tl / r2 : 0);
                mxm = x - (mx1 + ((mx2 - mx1) * (r1 * 3 / (r1 + r2) + 0.5) / 4 || 0));
                my1 = y - (y - prevY) * (r1 ? tl / r1 : 0);
                my2 = y + (nextY - y) * (r2 ? tl / r2 : 0);
                mym = y - (my1 + ((my2 - my1) * (r1 * 3 / (r1 + r2) + 0.5) / 4 || 0));

                if (x !== prevX || y !== prevY) {
                    segment.push(_round(mx1 + mxm), _round(my1 + mym), _round(x), _round(y), _round(mx2 + mxm), _round(my2 + mym));
                }
            }

            x !== nextX || y !== nextY || segment.length < 4 ? segment.push(_round(nextX), _round(nextY), _round(nextX), _round(nextY)) : segment.length -= 2;

            if (segment.length === 2) {
                segment.push(x, y, x, y, x, y);
            } else if (closed) {
                segment.splice(0, 6);
                segment.length = segment.length - 6;
            }

            return segment;
        }
        function rawPathToString(rawPath) {
            if (_isNumber(rawPath[0])) {
                rawPath = [rawPath];
            }

            var result = "",
                l = rawPath.length,
                sl,
                s,
                i,
                segment;

            for (s = 0; s < l; s++) {
                segment = rawPath[s];
                result += "M" + _round(segment[0]) + "," + _round(segment[1]) + " C";
                sl = segment.length;

                for (i = 2; i < sl; i++) {
                    result += _round(segment[i++]) + "," + _round(segment[i++]) + " " + _round(segment[i++]) + "," + _round(segment[i++]) + " " + _round(segment[i++]) + "," + _round(segment[i]) + " ";
                }

                if (segment.closed) {
                    result += "z";
                }
            }

            return result;
        }

        var _doc,
            _win,
            _docElement,
            _body,
            _divContainer,
            _svgContainer,
            _identityMatrix,
            _gEl,
            _transformProp = "transform",
            _transformOriginProp = _transformProp + "Origin",
            _hasOffsetBug,
            _setDoc = function _setDoc(element) {
                var doc = element.ownerDocument || element;

                if (!(_transformProp in element.style) && "msTransform" in element.style) {
                    _transformProp = "msTransform";
                    _transformOriginProp = _transformProp + "Origin";
                }

                while (doc.parentNode && (doc = doc.parentNode)) { }

                _win = window;
                _identityMatrix = new Matrix2D();

                if (doc) {
                    _doc = doc;
                    _docElement = doc.documentElement;
                    _body = doc.body;
                    _gEl = _doc.createElementNS("http://www.w3.org/2000/svg", "g");
                    _gEl.style.transform = "none";
                    var d1 = doc.createElement("div"),
                        d2 = doc.createElement("div");

                    _body.appendChild(d1);

                    d1.appendChild(d2);
                    d1.style.position = "static";
                    d1.style[_transformProp] = "translate3d(0,0,1px)";
                    _hasOffsetBug = d2.offsetParent !== d1;

                    _body.removeChild(d1);
                }

                return doc;
            },
            _forceNonZeroScale = function _forceNonZeroScale(e) {
                var a, cache;

                while (e && e !== _body) {
                    cache = e._gsap;
                    cache && cache.uncache && cache.get(e, "x");

                    if (cache && !cache.scaleX && !cache.scaleY && cache.renderTransform) {
                        cache.scaleX = cache.scaleY = 1e-4;
                        cache.renderTransform(1, cache);
                        a ? a.push(cache) : a = [cache];
                    }

                    e = e.parentNode;
                }

                return a;
            },
            _svgTemps = [],
            _divTemps = [],
            _getDocScrollTop = function _getDocScrollTop() {
                return _win.pageYOffset || _doc.scrollTop || _docElement.scrollTop || _body.scrollTop || 0;
            },
            _getDocScrollLeft = function _getDocScrollLeft() {
                return _win.pageXOffset || _doc.scrollLeft || _docElement.scrollLeft || _body.scrollLeft || 0;
            },
            _svgOwner = function _svgOwner(element) {
                return element.ownerSVGElement || ((element.tagName + "").toLowerCase() === "svg" ? element : null);
            },
            _isFixed = function _isFixed(element) {
                if (_win.getComputedStyle(element).position === "fixed") {
                    return true;
                }

                element = element.parentNode;

                if (element && element.nodeType === 1) {
                    return _isFixed(element);
                }
            },
            _createSibling = function _createSibling(element, i) {
                if (element.parentNode && (_doc || _setDoc(element))) {
                    var svg = _svgOwner(element),
                        ns = svg ? svg.getAttribute("xmlns") || "http://www.w3.org/2000/svg" : "http://www.w3.org/1999/xhtml",
                        type = svg ? i ? "rect" : "g" : "div",
                        x = i !== 2 ? 0 : 100,
                        y = i === 3 ? 100 : 0,
                        css = "position:absolute;display:block;pointer-events:none;margin:0;padding:0;",
                        e = _doc.createElementNS ? _doc.createElementNS(ns.replace(/^https/, "http"), type) : _doc.createElement(type);

                    if (i) {
                        if (!svg) {
                            if (!_divContainer) {
                                _divContainer = _createSibling(element);
                                _divContainer.style.cssText = css;
                            }

                            e.style.cssText = css + "width:0.1px;height:0.1px;top:" + y + "px;left:" + x + "px";

                            _divContainer.appendChild(e);
                        } else {
                            _svgContainer || (_svgContainer = _createSibling(element));
                            e.setAttribute("width", 0.01);
                            e.setAttribute("height", 0.01);
                            e.setAttribute("transform", "translate(" + x + "," + y + ")");

                            _svgContainer.appendChild(e);
                        }
                    }

                    return e;
                }

                throw "Need document and parent.";
            },
            _consolidate = function _consolidate(m) {
                var c = new Matrix2D(),
                    i = 0;

                for (; i < m.numberOfItems; i++) {
                    c.multiply(m.getItem(i).matrix);
                }

                return c;
            },
            _getCTM = function _getCTM(svg) {
                var m = svg.getCTM(),
                    transform;

                if (!m) {
                    transform = svg.style[_transformProp];
                    svg.style[_transformProp] = "none";
                    svg.appendChild(_gEl);
                    m = _gEl.getCTM();
                    svg.removeChild(_gEl);
                    transform ? svg.style[_transformProp] = transform : svg.style.removeProperty(_transformProp.replace(/([A-Z])/g, "-$1").toLowerCase());
                }

                return m || _identityMatrix.clone();
            },
            _placeSiblings = function _placeSiblings(element, adjustGOffset) {
                var svg = _svgOwner(element),
                    isRootSVG = element === svg,
                    siblings = svg ? _svgTemps : _divTemps,
                    parent = element.parentNode,
                    container,
                    m,
                    b,
                    x,
                    y,
                    cs;

                if (element === _win) {
                    return element;
                }

                siblings.length || siblings.push(_createSibling(element, 1), _createSibling(element, 2), _createSibling(element, 3));
                container = svg ? _svgContainer : _divContainer;

                if (svg) {
                    if (isRootSVG) {
                        b = _getCTM(element);
                        x = -b.e / b.a;
                        y = -b.f / b.d;
                        m = _identityMatrix;
                    } else if (element.getBBox) {
                        b = element.getBBox();
                        m = element.transform ? element.transform.baseVal : {};
                        m = !m.numberOfItems ? _identityMatrix : m.numberOfItems > 1 ? _consolidate(m) : m.getItem(0).matrix;
                        x = m.a * b.x + m.c * b.y;
                        y = m.b * b.x + m.d * b.y;
                    } else {
                        m = new Matrix2D();
                        x = y = 0;
                    }

                    if (adjustGOffset && element.tagName.toLowerCase() === "g") {
                        x = y = 0;
                    }

                    (isRootSVG ? svg : parent).appendChild(container);
                    container.setAttribute("transform", "matrix(" + m.a + "," + m.b + "," + m.c + "," + m.d + "," + (m.e + x) + "," + (m.f + y) + ")");
                } else {
                    x = y = 0;

                    if (_hasOffsetBug) {
                        m = element.offsetParent;
                        b = element;

                        while (b && (b = b.parentNode) && b !== m && b.parentNode) {
                            if ((_win.getComputedStyle(b)[_transformProp] + "").length > 4) {
                                x = b.offsetLeft;
                                y = b.offsetTop;
                                b = 0;
                            }
                        }
                    }

                    cs = _win.getComputedStyle(element);

                    if (cs.position !== "absolute" && cs.position !== "fixed") {
                        m = element.offsetParent;

                        while (parent && parent !== m) {
                            x += parent.scrollLeft || 0;
                            y += parent.scrollTop || 0;
                            parent = parent.parentNode;
                        }
                    }

                    b = container.style;
                    b.top = element.offsetTop - y + "px";
                    b.left = element.offsetLeft - x + "px";
                    b[_transformProp] = cs[_transformProp];
                    b[_transformOriginProp] = cs[_transformOriginProp];
                    b.position = cs.position === "fixed" ? "fixed" : "absolute";
                    element.parentNode.appendChild(container);
                }

                return container;
            },
            _setMatrix = function _setMatrix(m, a, b, c, d, e, f) {
                m.a = a;
                m.b = b;
                m.c = c;
                m.d = d;
                m.e = e;
                m.f = f;
                return m;
            };

        var Matrix2D = function () {
            function Matrix2D(a, b, c, d, e, f) {
                if (a === void 0) {
                    a = 1;
                }

                if (b === void 0) {
                    b = 0;
                }

                if (c === void 0) {
                    c = 0;
                }

                if (d === void 0) {
                    d = 1;
                }

                if (e === void 0) {
                    e = 0;
                }

                if (f === void 0) {
                    f = 0;
                }

                _setMatrix(this, a, b, c, d, e, f);
            }

            var _proto = Matrix2D.prototype;

            _proto.inverse = function inverse() {
                var a = this.a,
                    b = this.b,
                    c = this.c,
                    d = this.d,
                    e = this.e,
                    f = this.f,
                    determinant = a * d - b * c || 1e-10;
                return _setMatrix(this, d / determinant, -b / determinant, -c / determinant, a / determinant, (c * f - d * e) / determinant, -(a * f - b * e) / determinant);
            };

            _proto.multiply = function multiply(matrix) {
                var a = this.a,
                    b = this.b,
                    c = this.c,
                    d = this.d,
                    e = this.e,
                    f = this.f,
                    a2 = matrix.a,
                    b2 = matrix.c,
                    c2 = matrix.b,
                    d2 = matrix.d,
                    e2 = matrix.e,
                    f2 = matrix.f;
                return _setMatrix(this, a2 * a + c2 * c, a2 * b + c2 * d, b2 * a + d2 * c, b2 * b + d2 * d, e + e2 * a + f2 * c, f + e2 * b + f2 * d);
            };

            _proto.clone = function clone() {
                return new Matrix2D(this.a, this.b, this.c, this.d, this.e, this.f);
            };

            _proto.equals = function equals(matrix) {
                var a = this.a,
                    b = this.b,
                    c = this.c,
                    d = this.d,
                    e = this.e,
                    f = this.f;
                return a === matrix.a && b === matrix.b && c === matrix.c && d === matrix.d && e === matrix.e && f === matrix.f;
            };

            _proto.apply = function apply(point, decoratee) {
                if (decoratee === void 0) {
                    decoratee = {};
                }

                var x = point.x,
                    y = point.y,
                    a = this.a,
                    b = this.b,
                    c = this.c,
                    d = this.d,
                    e = this.e,
                    f = this.f;
                decoratee.x = x * a + y * c + e || 0;
                decoratee.y = x * b + y * d + f || 0;
                return decoratee;
            };

            return Matrix2D;
        }();
        function getGlobalMatrix(element, inverse, adjustGOffset, includeScrollInFixed) {
            if (!element || !element.parentNode || (_doc || _setDoc(element)).documentElement === element) {
                return new Matrix2D();
            }

            var zeroScales = _forceNonZeroScale(element),
                svg = _svgOwner(element),
                temps = svg ? _svgTemps : _divTemps,
                container = _placeSiblings(element, adjustGOffset),
                b1 = temps[0].getBoundingClientRect(),
                b2 = temps[1].getBoundingClientRect(),
                b3 = temps[2].getBoundingClientRect(),
                parent = container.parentNode,
                isFixed = !includeScrollInFixed && _isFixed(element),
                m = new Matrix2D((b2.left - b1.left) / 100, (b2.top - b1.top) / 100, (b3.left - b1.left) / 100, (b3.top - b1.top) / 100, b1.left + (isFixed ? 0 : _getDocScrollLeft()), b1.top + (isFixed ? 0 : _getDocScrollTop()));

            parent.removeChild(container);

            if (zeroScales) {
                b1 = zeroScales.length;

                while (b1--) {
                    b2 = zeroScales[b1];
                    b2.scaleX = b2.scaleY = 0;
                    b2.renderTransform(1, b2);
                }
            }

            return inverse ? m.inverse() : m;
        }

        /*!
         * MotionPathPlugin 3.10.4
         * https://greensock.com
         *
         * @license Copyright 2008-2022, GreenSock. All rights reserved.
         * Subject to the terms at https://greensock.com/standard-license or for
         * Club GreenSock members, the agreement issued with that membership.
         * @author: Jack Doyle, jack@greensock.com
        */

        var _xProps = "x,translateX,left,marginLeft,xPercent".split(","),
            _yProps = "y,translateY,top,marginTop,yPercent".split(","),
            _DEG2RAD$1 = Math.PI / 180,
            gsap,
            PropTween,
            _getUnit,
            _toArray,
            _getGSAP = function _getGSAP() {
                return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap;
            },
            _populateSegmentFromArray = function _populateSegmentFromArray(segment, values, property, mode) {
                var l = values.length,
                    si = mode === 2 ? 0 : mode,
                    i = 0,
                    v;

                for (; i < l; i++) {
                    segment[si] = v = parseFloat(values[i][property]);
                    mode === 2 && (segment[si + 1] = 0);
                    si += 2;
                }

                return segment;
            },
            _getPropNum = function _getPropNum(target, prop, unit) {
                return parseFloat(target._gsap.get(target, prop, unit || "px")) || 0;
            },
            _relativize = function _relativize(segment) {
                var x = segment[0],
                    y = segment[1],
                    i;

                for (i = 2; i < segment.length; i += 2) {
                    x = segment[i] += x;
                    y = segment[i + 1] += y;
                }
            },
            _segmentToRawPath = function _segmentToRawPath(plugin, segment, target, x, y, slicer, vars, unitX, unitY) {
                if (vars.type === "cubic") {
                    segment = [segment];
                } else {
                    vars.fromCurrent !== false && segment.unshift(_getPropNum(target, x, unitX), y ? _getPropNum(target, y, unitY) : 0);
                    vars.relative && _relativize(segment);
                    var pointFunc = y ? pointsToSegment : flatPointsToSegment;
                    segment = [pointFunc(segment, vars.curviness)];
                }

                segment = slicer(_align(segment, target, vars));

                _addDimensionalPropTween(plugin, target, x, segment, "x", unitX);

                y && _addDimensionalPropTween(plugin, target, y, segment, "y", unitY);
                return cacheRawPathMeasurements(segment, vars.resolution || (vars.curviness === 0 ? 20 : 12));
            },
            _emptyFunc = function _emptyFunc(v) {
                return v;
            },
            _numExp = /[-+\.]*\d+\.?(?:e-|e\+)?\d*/g,
            _originToPoint = function _originToPoint(element, origin, parentMatrix) {
                var m = getGlobalMatrix(element),
                    x = 0,
                    y = 0,
                    svg;

                if ((element.tagName + "").toLowerCase() === "svg") {
                    svg = element.viewBox.baseVal;
                    svg.width || (svg = {
                        width: +element.getAttribute("width"),
                        height: +element.getAttribute("height")
                    });
                } else {
                    svg = origin && element.getBBox && element.getBBox();
                }

                if (origin && origin !== "auto") {
                    x = origin.push ? origin[0] * (svg ? svg.width : element.offsetWidth || 0) : origin.x;
                    y = origin.push ? origin[1] * (svg ? svg.height : element.offsetHeight || 0) : origin.y;
                }

                return parentMatrix.apply(x || y ? m.apply({
                    x: x,
                    y: y
                }) : {
                    x: m.e,
                    y: m.f
                });
            },
            _getAlignMatrix = function _getAlignMatrix(fromElement, toElement, fromOrigin, toOrigin) {
                var parentMatrix = getGlobalMatrix(fromElement.parentNode, true, true),
                    m = parentMatrix.clone().multiply(getGlobalMatrix(toElement)),
                    fromPoint = _originToPoint(fromElement, fromOrigin, parentMatrix),
                    _originToPoint2 = _originToPoint(toElement, toOrigin, parentMatrix),
                    x = _originToPoint2.x,
                    y = _originToPoint2.y,
                    p;

                m.e = m.f = 0;

                if (toOrigin === "auto" && toElement.getTotalLength && toElement.tagName.toLowerCase() === "path") {
                    p = toElement.getAttribute("d").match(_numExp) || [];
                    p = m.apply({
                        x: +p[0],
                        y: +p[1]
                    });
                    x += p.x;
                    y += p.y;
                }

                if (p || toElement.getBBox && fromElement.getBBox && toElement.ownerSVGElement === fromElement.ownerSVGElement) {
                    p = m.apply(toElement.getBBox());
                    x -= p.x;
                    y -= p.y;
                }

                m.e = x - fromPoint.x;
                m.f = y - fromPoint.y;
                return m;
            },
            _align = function _align(rawPath, target, _ref) {
                var align = _ref.align,
                    matrix = _ref.matrix,
                    offsetX = _ref.offsetX,
                    offsetY = _ref.offsetY,
                    alignOrigin = _ref.alignOrigin;

                var x = rawPath[0][0],
                    y = rawPath[0][1],
                    curX = _getPropNum(target, "x"),
                    curY = _getPropNum(target, "y"),
                    alignTarget,
                    m,
                    p;

                if (!rawPath || !rawPath.length) {
                    return getRawPath("M0,0L0,0");
                }

                if (align) {
                    if (align === "self" || (alignTarget = _toArray(align)[0] || target) === target) {
                        transformRawPath(rawPath, 1, 0, 0, 1, curX - x, curY - y);
                    } else {
                        if (alignOrigin && alignOrigin[2] !== false) {
                            gsap.set(target, {
                                transformOrigin: alignOrigin[0] * 100 + "% " + alignOrigin[1] * 100 + "%"
                            });
                        } else {
                            alignOrigin = [_getPropNum(target, "xPercent") / -100, _getPropNum(target, "yPercent") / -100];
                        }

                        m = _getAlignMatrix(target, alignTarget, alignOrigin, "auto");
                        p = m.apply({
                            x: x,
                            y: y
                        });
                        transformRawPath(rawPath, m.a, m.b, m.c, m.d, curX + m.e - (p.x - m.e), curY + m.f - (p.y - m.f));
                    }
                }

                if (matrix) {
                    transformRawPath(rawPath, matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
                } else if (offsetX || offsetY) {
                    transformRawPath(rawPath, 1, 0, 0, 1, offsetX || 0, offsetY || 0);
                }

                return rawPath;
            },
            _addDimensionalPropTween = function _addDimensionalPropTween(plugin, target, property, rawPath, pathProperty, forceUnit) {
                var cache = target._gsap,
                    harness = cache.harness,
                    alias = harness && harness.aliases && harness.aliases[property],
                    prop = alias && alias.indexOf(",") < 0 ? alias : property,
                    pt = plugin._pt = new PropTween(plugin._pt, target, prop, 0, 0, _emptyFunc, 0, cache.set(target, prop, plugin));
                pt.u = _getUnit(cache.get(target, prop, forceUnit)) || 0;
                pt.path = rawPath;
                pt.pp = pathProperty;

                plugin._props.push(prop);
            },
            _sliceModifier = function _sliceModifier(start, end) {
                return function (rawPath) {
                    return start || end !== 1 ? sliceRawPath(rawPath, start, end) : rawPath;
                };
            };

        var MotionPathPlugin = {
            version: "3.10.4",
            name: "motionPath",
            register: function register(core, Plugin, propTween) {
                gsap = core;
                _getUnit = gsap.utils.getUnit;
                _toArray = gsap.utils.toArray;
                PropTween = propTween;
            },
            init: function init(target, vars) {
                if (!gsap) {
                    console.warn("Please gsap.registerPlugin(MotionPathPlugin)");
                    return false;
                }

                if (!(typeof vars === "object" && !vars.style) || !vars.path) {
                    vars = {
                        path: vars
                    };
                }

                var rawPaths = [],
                    _vars = vars,
                    path = _vars.path,
                    autoRotate = _vars.autoRotate,
                    unitX = _vars.unitX,
                    unitY = _vars.unitY,
                    x = _vars.x,
                    y = _vars.y,
                    firstObj = path[0],
                    slicer = _sliceModifier(vars.start, "end" in vars ? vars.end : 1),
                    rawPath,
                    p;

                this.rawPaths = rawPaths;
                this.target = target;

                if (this.rotate = autoRotate || autoRotate === 0) {
                    this.rOffset = parseFloat(autoRotate) || 0;
                    this.radians = !!vars.useRadians;
                    this.rProp = vars.rotation || "rotation";
                    this.rSet = target._gsap.set(target, this.rProp, this);
                    this.ru = _getUnit(target._gsap.get(target, this.rProp)) || 0;
                }

                if (Array.isArray(path) && !("closed" in path) && typeof firstObj !== "number") {
                    for (p in firstObj) {
                        if (!x && ~_xProps.indexOf(p)) {
                            x = p;
                        } else if (!y && ~_yProps.indexOf(p)) {
                            y = p;
                        }
                    }

                    if (x && y) {
                        rawPaths.push(_segmentToRawPath(this, _populateSegmentFromArray(_populateSegmentFromArray([], path, x, 0), path, y, 1), target, x, y, slicer, vars, unitX || _getUnit(path[0][x]), unitY || _getUnit(path[0][y])));
                    } else {
                        x = y = 0;
                    }

                    for (p in firstObj) {
                        p !== x && p !== y && rawPaths.push(_segmentToRawPath(this, _populateSegmentFromArray([], path, p, 2), target, p, 0, slicer, vars, _getUnit(path[0][p])));
                    }
                } else {
                    rawPath = slicer(_align(getRawPath(vars.path), target, vars));
                    cacheRawPathMeasurements(rawPath, vars.resolution);
                    rawPaths.push(rawPath);

                    _addDimensionalPropTween(this, target, vars.x || "x", rawPath, "x", vars.unitX || "px");

                    _addDimensionalPropTween(this, target, vars.y || "y", rawPath, "y", vars.unitY || "px");
                }
            },
            render: function render(ratio, data) {
                var rawPaths = data.rawPaths,
                    i = rawPaths.length,
                    pt = data._pt;

                if (ratio > 1) {
                    ratio = 1;
                } else if (ratio < 0) {
                    ratio = 0;
                }

                while (i--) {
                    getPositionOnPath(rawPaths[i], ratio, !i && data.rotate, rawPaths[i]);
                }

                while (pt) {
                    pt.set(pt.t, pt.p, pt.path[pt.pp] + pt.u, pt.d, ratio);
                    pt = pt._next;
                }

                data.rotate && data.rSet(data.target, data.rProp, rawPaths[0].angle * (data.radians ? _DEG2RAD$1 : 1) + data.rOffset + data.ru, data, ratio);
            },
            getLength: function getLength(path) {
                return cacheRawPathMeasurements(getRawPath(path)).totalLength;
            },
            sliceRawPath: sliceRawPath,
            getRawPath: getRawPath,
            pointsToSegment: pointsToSegment,
            stringToRawPath: stringToRawPath,
            rawPathToString: rawPathToString,
            transformRawPath: transformRawPath,
            getGlobalMatrix: getGlobalMatrix,
            getPositionOnPath: getPositionOnPath,
            cacheRawPathMeasurements: cacheRawPathMeasurements,
            convertToPath: function convertToPath$1(targets, swap) {
                return _toArray(targets).map(function (target) {
                    return convertToPath(target, swap !== false);
                });
            },
            convertCoordinates: function convertCoordinates(fromElement, toElement, point) {
                var m = getGlobalMatrix(toElement, true, true).multiply(getGlobalMatrix(fromElement));
                return point ? m.apply(point) : m;
            },
            getAlignMatrix: _getAlignMatrix,
            getRelativePosition: function getRelativePosition(fromElement, toElement, fromOrigin, toOrigin) {
                var m = _getAlignMatrix(fromElement, toElement, fromOrigin, toOrigin);

                return {
                    x: m.e,
                    y: m.f
                };
            },
            arrayToRawPath: function arrayToRawPath(value, vars) {
                vars = vars || {};

                var segment = _populateSegmentFromArray(_populateSegmentFromArray([], value, vars.x || "x", 0), value, vars.y || "y", 1);

                vars.relative && _relativize(segment);
                return [vars.type === "cubic" ? segment : pointsToSegment(segment, vars.curviness)];
            }
        };
        _getGSAP() && gsap.registerPlugin(MotionPathPlugin);

        // exports.MotionPathPlugin = MotionPathPlugin;
        // exports.default = MotionPathPlugin;

        // Object.defineProperty(exports, '__esModule', { value: true });

    })));


    window.PremiumSvgDrawerHandler = function ($scope, $, addonSpeed) {

        var isContainer = "widget" !== $scope.data("element_type"),
            isParallax = $scope.hasClass("premium-parallax-yes"),
            isInsideTemplate = !elementorFrontend.isEditMode() && $scope.closest('.draw-triggered').length > 0;

        //If the $scope is inside a parent template, then we don't want to trigger things again. Why? because the draw has already been triggered for the parent element.
        // For example, off canvas widget, the function already is triggered for the $scope of the widget itself. So, no need to trigger it again for child elements inside the template.
        if (isInsideTemplate)
            return;

        if (isContainer && !isParallax)
            return;

        var $svgIcons = $scope.find((isParallax ? ".premium-parallax-layer " : "") + ".premium-svg-drawer"),
            totalPaths = 0;

        //Used to unwrap the SVGs to fix styling issues coming from "> svg" selectors.
        setTimeout(function () {

            if ($scope.hasClass("elementor-widget-premium-addon-tabs")) {
                $scope.find(".premium-tab-link div.premium-svg-drawer svg").addClass("premium-title-icon").unwrap();
            } else if ($scope.hasClass("elementor-widget-premium-image-accordion")) {
                $scope.find(".premium-accordion-li div[class*='premium-svg-'] svg").addClass("premium-accordion-icon premium-svg-drawer").unwrap();
            } else if ($scope.hasClass("elementor-widget-premium-addon-image-hotspots")) {
                $scope.find(".premium-image-hotspots-main-icons div[class*='premium-svg-'] svg").addClass("premium-image-hotspots-icon premium-svg-drawer").unwrap();
            }

            //These are handled from their files JS files.
            $scope.not('.elementor-widget-premium-notifications, .elementor-widget-premium-notbar').find(".elementor-invisible").removeClass("elementor-invisible");

            //Remove only for the icon, not for the posts containers.
            if ($scope.hasClass('elementor-widget-premium-notifications')) {
                $scope.find('.pa-recent-notification').removeClass('elementor-invisible');
            }

        }, 50);


        if (!$svgIcons.length)
            return;

        //We don't want to take "Draw In Sequence" option if itmes are fewer than 2.
        if ($svgIcons.length < 2)
            $scope.removeClass("pa-svg-draw-seq-yes");

        if ($scope.hasClass("pa-svg-draw-seq-yes")) {

            var timeLine = new TimelineMax({
                yoyo: $scope.hasClass("pa-svg-draw-yoyo-yes") ? true : false,
                repeat: $scope.hasClass("pa-svg-draw-loop-yes") ? -1 : 0,
            });
        }

        $scope.addClass('draw-triggered');

        $svgIcons.each(function (index, item) {

            var $item = $(item),
                drawSettings = $item.data(),
                targettimeLine = null,
                pathsToAdd = totalPaths,
                isPricingTable = $(item).closest(".premium-pricing-icon-container").length > 0;

            //remove title HTML tag
            $item.find("title").remove();


            //Check if we want to create a standalone timeline.
            if (!$scope.hasClass("pa-svg-draw-seq-yes") || drawSettings.svgHover || isPricingTable) {

                var individualTimeLine = new TimelineMax({
                    paused: true,
                    yoyo: drawSettings.svgYoyo ? true : false,
                    repeat: drawSettings.svgLoop ? -1 : 0,
                    onReverseComplete: function () {
                        if (drawSettings.svgRestart && individualTimeLine.stop)
                            individualTimeLine.stop();
                    }
                });

                pathsToAdd = 0;
                targettimeLine = individualTimeLine;
            } else {
                targettimeLine = timeLine;
            }


            var fromOrTo = !drawSettings.svgReverse ? 'from' : 'to',
                $paths = $item.find("path, circle, rect, square, ellipse, polyline, polygon, line"),
                lastPathIndex = 0,
                startOnEndPoint = drawSettings.svgPoint,
                setToTransparent = true;

            if ('' == drawSettings.svgTrans)
                setToTransparent = false;

            $paths.each(function (pathIndex, path) {

                var $path = $(path);

                if (setToTransparent)
                    $path.attr("fill", "transparent");

                if (drawSettings.svgSync)
                    pathIndex = 0;

                //Used with fill after draw color.
                lastPathIndex = pathIndex;

                targettimeLine[fromOrTo]($path, {
                    PaSvgDrawer: (startOnEndPoint || 0) + "% 0",
                }, pathIndex + pathsToAdd);

            });

            if (drawSettings.svgFill || drawSettings.svgStroke) {

                //If all paths drawn together is enabled, then fill after all paths are drawn.
                if (lastPathIndex == 0) {
                    lastPathIndex = pathsToAdd + 1;
                } else {
                    //If not synced, fill with the last path.
                    lastPathIndex = pathsToAdd + lastPathIndex;
                }

                targettimeLine.to($paths, 1, {
                    //To remove the transition that causes the fill draw to take much time and being not seen.
                    onStart: function () {
                        $paths.addClass("no-transition");
                    },
                    fill: drawSettings.svgFill,
                    stroke: drawSettings.svgStroke,
                    onComplete: function () {
                        if (!drawSettings.svgLoop && !drawSettings.svgYoyo)
                            $paths.removeClass("no-transition");
                    }
                }, lastPathIndex);
            }

            if ((!$scope.hasClass("pa-svg-draw-seq-yes") || drawSettings.svgHover) && drawSettings.svgFrames) {
                targettimeLine.duration(drawSettings.svgFrames);
            } else {

                if (!addonSpeed)
                    addonSpeed = $scope.find(".premium-img-layers-wrapper, .premium-tabs, .premium-pricing-table-container, .premium-bullet-list-box").data("speed");

                targettimeLine.duration(addonSpeed);

            }


            //If this item is animated on hover, then we don't want to take it into consideration.
            if ($scope.hasClass("pa-svg-draw-seq-yes") && !drawSettings.svgHover)
                totalPaths = totalPaths + (drawSettings.svgSync ? 1 : $paths.length);

            if ($scope.hasClass('elementor-widget-premium-addon-magic-section')) {

                targettimeLine.play();

            } else if (drawSettings.svgHover) {

                if (!isParallax) {
                    if ($scope.hasClass("elementor-widget-premium-addon-icon-box") || $scope.find(".premium-drawer-hover").length) {
                        $item = $scope;
                    } else if ($scope.hasClass("elementor-widget-premium-icon-list")) {
                        $item = $item.closest(".premium-bullet-list-content");
                    } else if ($scope.hasClass("elementor-widget-premium-addon-tabs")) {
                        $item = $item.closest(".premium-tabs-nav-list-item");
                    } else if ($scope.hasClass("elementor-widget-premium-image-accordion")) {
                        $item = $item.closest(".premium-accordion-li");
                    }
                }

                $item.hover(
                    function () {
                        targettimeLine.play();
                    },
                    function () {
                        targettimeLine.pause();
                    });
            } else {
                // unsing IntersectionObserverAPI.
                var eleObserver = new IntersectionObserver(function (entries) {
                    entries.forEach(function (entry, index) {

                        if (entry.isIntersecting) {

                            targettimeLine.play();

                            if ("up" === window.paDirection && drawSettings.svgRestart) {
                                targettimeLine.reverse();
                            }
                        }
                    });
                }, {
                    threshold: parseFloat((drawSettings.svgAnimOffset || "50%")) / 100
                });

                eleObserver.observe($scope[0]);

                // elementorFrontend.waypoint($scope, function (direction) {
                //     targettimeLine.play();

                //     if ("up" === direction && drawSettings.svgRestart) {
                //         targettimeLine.reverse();

                //     }

                // }, {
                //     offset: drawSettings.svgAnimOffset || "50%",
                //     triggerOnce: false
                // });
            }

        });

    };

    $(window).on("elementor/frontend/init", function () {

        elementorFrontend.hooks.addAction("frontend/element_ready/widget", window.PremiumSvgDrawerHandler);


    });

})(jQuery);