Skip to content
Snippets Groups Projects
fabric.min.js 361 KiB
Newer Older
Carsten  Rose's avatar
Carsten Rose committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
var fabric = fabric || {version: "1.7.17"};
"undefined" != typeof exports && (exports.fabric = fabric), "undefined" != typeof document && "undefined" != typeof window ? (fabric.document = document, fabric.window = window, window.fabric = fabric) : (fabric.document = require("jsdom").jsdom(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E")), fabric.document.createWindow ? fabric.window = fabric.document.createWindow() : fabric.window = fabric.document.parentWindow), fabric.isTouchSupported = "ontouchstart"in fabric.document.documentElement, fabric.isLikelyNode = "undefined" != typeof Buffer && "undefined" == typeof window, fabric.SHARED_ATTRIBUTES = ["display", "transform", "fill", "fill-opacity", "fill-rule", "opacity", "stroke", "stroke-dasharray", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "id"], fabric.DPI = 96, fabric.reNum = "(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)", fabric.fontPaths = {}, fabric.iMatrix = [1, 0, 0, 1, 0, 0], fabric.canvasModule = "canvas", fabric.perfLimitSizeTotal = 2097152, fabric.maxCacheSideLimit = 4096, fabric.minCacheSideLimit = 256, fabric.charWidthsCache = {}, fabric.devicePixelRatio = fabric.window.devicePixelRatio || fabric.window.webkitDevicePixelRatio || fabric.window.mozDevicePixelRatio || 1, function () {
    function t(t, e) {
        if (this.__eventListeners[t]) {
            var i = this.__eventListeners[t];
            e ? i[i.indexOf(e)] = !1 : fabric.util.array.fill(i, !1)
        }
    }

    function e(t, e) {
        if (this.__eventListeners || (this.__eventListeners = {}), 1 === arguments.length)for (var i in t)this.on(i, t[i]); else this.__eventListeners[t] || (this.__eventListeners[t] = []), this.__eventListeners[t].push(e);
        return this
    }

    function i(e, i) {
        if (this.__eventListeners) {
            if (0 === arguments.length)for (e in this.__eventListeners)t.call(this, e); else if (1 === arguments.length && "object" == typeof arguments[0])for (var r in e)t.call(this, r, e[r]); else t.call(this, e, i);
            return this
        }
    }

    function r(t, e) {
        if (this.__eventListeners) {
            var i = this.__eventListeners[t];
            if (i) {
                for (var r = 0, n = i.length; r < n; r++)i[r] && i[r].call(this, e || {});
                return this.__eventListeners[t] = i.filter(function (t) {
                    return t !== !1
                }), this
            }
        }
    }

    fabric.Observable = {observe: e, stopObserving: i, fire: r, on: e, off: i, trigger: r}
}(), fabric.Collection = {
    _objects: [], add: function () {
        if (this._objects.push.apply(this._objects, arguments), this._onObjectAdded)for (var t = 0, e = arguments.length; t < e; t++)this._onObjectAdded(arguments[t]);
        return this.renderOnAddRemove && this.renderAll(), this
    }, insertAt: function (t, e, i) {
        var r = this.getObjects();
        return i ? r[e] = t : r.splice(e, 0, t), this._onObjectAdded && this._onObjectAdded(t), this.renderOnAddRemove && this.renderAll(), this
    }, remove: function () {
        for (var t, e = this.getObjects(), i = !1, r = 0, n = arguments.length; r < n; r++)t = e.indexOf(arguments[r]), t !== -1 && (i = !0, e.splice(t, 1), this._onObjectRemoved && this._onObjectRemoved(arguments[r]));
        return this.renderOnAddRemove && i && this.renderAll(), this
    }, forEachObject: function (t, e) {
        for (var i = this.getObjects(), r = 0, n = i.length; r < n; r++)t.call(e, i[r], r, i);
        return this
    }, getObjects: function (t) {
        return "undefined" == typeof t ? this._objects : this._objects.filter(function (e) {
            return e.type === t
        })
    }, item: function (t) {
        return this.getObjects()[t]
    }, isEmpty: function () {
        return 0 === this.getObjects().length
    }, size: function () {
        return this.getObjects().length
    }, contains: function (t) {
        return this.getObjects().indexOf(t) > -1
    }, complexity: function () {
        return this.getObjects().reduce(function (t, e) {
            return t += e.complexity ? e.complexity() : 0
        }, 0)
    }
}, fabric.CommonMethods = {
    _setOptions: function (t) {
        for (var e in t)this.set(e, t[e])
    }, _initGradient: function (t, e) {
        !t || !t.colorStops || t instanceof fabric.Gradient || this.set(e, new fabric.Gradient(t))
    }, _initPattern: function (t, e, i) {
        !t || !t.source || t instanceof fabric.Pattern ? i && i() : this.set(e, new fabric.Pattern(t, i))
    }, _initClipping: function (t) {
        if (t.clipTo && "string" == typeof t.clipTo) {
            var e = fabric.util.getFunctionBody(t.clipTo);
            "undefined" != typeof e && (this.clipTo = new Function("ctx", e))
        }
    }, _setObject: function (t) {
        for (var e in t)this._set(e, t[e])
    }, set: function (t, e) {
        return "object" == typeof t ? this._setObject(t) : "function" == typeof e && "clipTo" !== t ? this._set(t, e(this.get(t))) : this._set(t, e), this
    }, _set: function (t, e) {
        this[t] = e
    }, toggle: function (t) {
        var e = this.get(t);
        return "boolean" == typeof e && this.set(t, !e), this
    }, get: function (t) {
        return this[t]
    }
}, function (t) {
    var e = Math.sqrt, i = Math.atan2, r = Math.pow, n = Math.abs, s = Math.PI / 180;
    fabric.util = {
        removeFromArray: function (t, e) {
            var i = t.indexOf(e);
            return i !== -1 && t.splice(i, 1), t
        }, getRandomInt: function (t, e) {
            return Math.floor(Math.random() * (e - t + 1)) + t
        }, degreesToRadians: function (t) {
            return t * s
        }, radiansToDegrees: function (t) {
            return t / s
        }, rotatePoint: function (t, e, i) {
            t.subtractEquals(e);
            var r = fabric.util.rotateVector(t, i);
            return new fabric.Point(r.x, r.y).addEquals(e)
        }, rotateVector: function (t, e) {
            var i = Math.sin(e), r = Math.cos(e), n = t.x * r - t.y * i, s = t.x * i + t.y * r;
            return {x: n, y: s}
        }, transformPoint: function (t, e, i) {
            return i ? new fabric.Point(e[0] * t.x + e[2] * t.y, e[1] * t.x + e[3] * t.y) : new fabric.Point(e[0] * t.x + e[2] * t.y + e[4], e[1] * t.x + e[3] * t.y + e[5])
        }, makeBoundingBoxFromPoints: function (t) {
            var e = [t[0].x, t[1].x, t[2].x, t[3].x], i = fabric.util.array.min(e), r = fabric.util.array.max(e), n = Math.abs(i - r), s = [t[0].y, t[1].y, t[2].y, t[3].y], o = fabric.util.array.min(s), a = fabric.util.array.max(s), h = Math.abs(o - a);
            return {left: i, top: o, width: n, height: h}
        }, invertTransform: function (t) {
            var e = 1 / (t[0] * t[3] - t[1] * t[2]), i = [e * t[3], -e * t[1], -e * t[2], e * t[0]], r = fabric.util.transformPoint({
                x: t[4],
                y: t[5]
            }, i, !0);
            return i[4] = -r.x, i[5] = -r.y, i
        }, toFixed: function (t, e) {
            return parseFloat(Number(t).toFixed(e))
        }, parseUnit: function (t, e) {
            var i = /\D{0,2}$/.exec(t), r = parseFloat(t);
            switch (e || (e = fabric.Text.DEFAULT_SVG_FONT_SIZE), i[0]) {
                case"mm":
                    return r * fabric.DPI / 25.4;
                case"cm":
                    return r * fabric.DPI / 2.54;
                case"in":
                    return r * fabric.DPI;
                case"pt":
                    return r * fabric.DPI / 72;
                case"pc":
                    return r * fabric.DPI / 72 * 12;
                case"em":
                    return r * e;
                default:
                    return r
            }
        }, falseFunction: function () {
            return !1
        }, getKlass: function (t, e) {
            return t = fabric.util.string.camelize(t.charAt(0).toUpperCase() + t.slice(1)), fabric.util.resolveNamespace(e)[t]
        }, resolveNamespace: function (e) {
            if (!e)return fabric;
            var i, r = e.split("."), n = r.length, s = t || fabric.window;
            for (i = 0; i < n; ++i)s = s[r[i]];
            return s
        }, loadImage: function (t, e, i, r) {
            if (!t)return void(e && e.call(i, t));
            var n = fabric.util.createImage();
            n.onload = function () {
                e && e.call(i, n), n = n.onload = n.onerror = null
            }, n.onerror = function () {
                fabric.log("Error loading " + n.src), e && e.call(i, null, !0), n = n.onload = n.onerror = null
            }, 0 !== t.indexOf("data") && r && (n.crossOrigin = r), n.src = t
        }, enlivenObjects: function (t, e, i, r) {
            function n() {
                ++o === a && e && e(s)
            }

            t = t || [];
            var s = [], o = 0, a = t.length, h = !0;
            return a ? void t.forEach(function (t, e) {
                if (!t || !t.type)return void n();
                var o = fabric.util.getKlass(t.type, i);
                o.fromObject(t, function (i, o) {
                    o || (s[e] = i), r && r(t, i, o), n()
                }, h)
            }) : void(e && e(s))
        }, enlivenPatterns: function (t, e) {
            function i() {
                ++n === s && e && e(r)
            }

            t = t || [];
            var r = [], n = 0, s = t.length;
            return s ? void t.forEach(function (t, e) {
                t && t.source ? new fabric.Pattern(t, function (t) {
                    r[e] = t, i()
                }) : (r[e] = t, i())
            }) : void(e && e(r))
        }, groupSVGElements: function (t, e, i) {
            var r;
            return r = new fabric.PathGroup(t, e), "undefined" != typeof i && (r.sourcePath = i), r
        }, populateWithProperties: function (t, e, i) {
            if (i && "[object Array]" === Object.prototype.toString.call(i))for (var r = 0, n = i.length; r < n; r++)i[r]in t && (e[i[r]] = t[i[r]])
        }, drawDashedLine: function (t, r, n, s, o, a) {
            var h = s - r, c = o - n, l = e(h * h + c * c), u = i(c, h), f = a.length, d = 0, g = !0;
            for (t.save(), t.translate(r, n), t.moveTo(0, 0), t.rotate(u), r = 0; l > r;)r += a[d++ % f], r > l && (r = l), t[g ? "lineTo" : "moveTo"](r, 0), g = !g;
            t.restore()
        }, createCanvasElement: function (t) {
            return t || (t = fabric.document.createElement("canvas")), t.getContext || "undefined" == typeof G_vmlCanvasManager || G_vmlCanvasManager.initElement(t), t
        }, createImage: function () {
            return fabric.isLikelyNode ? new (require("canvas").Image) : fabric.document.createElement("img")
        }, createAccessors: function (t) {
            var e, i, r, n, s, o = t.prototype;
            for (e = o.stateProperties.length; e--;)i = o.stateProperties[e], r = i.charAt(0).toUpperCase() + i.slice(1), n = "set" + r, s = "get" + r, o[s] || (o[s] = function (t) {
                return new Function('return this.get("' + t + '")')
            }(i)), o[n] || (o[n] = function (t) {
                return new Function("value", 'return this.set("' + t + '", value)')
            }(i))
        }, clipContext: function (t, e) {
            e.save(), e.beginPath(), t.clipTo(e), e.clip()
        }, multiplyTransformMatrices: function (t, e, i) {
            return [t[0] * e[0] + t[2] * e[1], t[1] * e[0] + t[3] * e[1], t[0] * e[2] + t[2] * e[3], t[1] * e[2] + t[3] * e[3], i ? 0 : t[0] * e[4] + t[2] * e[5] + t[4], i ? 0 : t[1] * e[4] + t[3] * e[5] + t[5]]
        }, qrDecompose: function (t) {
            var n = i(t[1], t[0]), o = r(t[0], 2) + r(t[1], 2), a = e(o), h = (t[0] * t[3] - t[2] * t[1]) / a, c = i(t[0] * t[2] + t[1] * t[3], o);
            return {angle: n / s, scaleX: a, scaleY: h, skewX: c / s, skewY: 0, translateX: t[4], translateY: t[5]}
        }, customTransformMatrix: function (t, e, i) {
            var r = [1, 0, n(Math.tan(i * s)), 1], o = [n(t), 0, 0, n(e)];
            return fabric.util.multiplyTransformMatrices(o, r, !0)
        }, resetObjectTransform: function (t) {
            t.scaleX = 1, t.scaleY = 1, t.skewX = 0, t.skewY = 0, t.flipX = !1, t.flipY = !1, t.setAngle(0)
        }, getFunctionBody: function (t) {
            return (String(t).match(/function[^{]*\{([\s\S]*)\}/) || {})[1]
        }, isTransparent: function (t, e, i, r) {
            r > 0 && (e > r ? e -= r : e = 0, i > r ? i -= r : i = 0);
            var n, s, o = !0, a = t.getImageData(e, i, 2 * r || 1, 2 * r || 1), h = a.data.length;
            for (n = 3; n < h && (s = a.data[n], o = s <= 0, o !== !1); n += 4);
            return a = null, o
        }, parsePreserveAspectRatioAttribute: function (t) {
            var e, i = "meet", r = "Mid", n = "Mid", s = t.split(" ");
            return s && s.length && (i = s.pop(), "meet" !== i && "slice" !== i ? (e = i, i = "meet") : s.length && (e = s.pop())), r = "none" !== e ? e.slice(1, 4) : "none", n = "none" !== e ? e.slice(5, 8) : "none", {
                meetOrSlice: i,
                alignX: r,
                alignY: n
            }
        }, clearFabricFontCache: function (t) {
            t ? fabric.charWidthsCache[t] && delete fabric.charWidthsCache[t] : fabric.charWidthsCache = {}
        }, limitDimsByArea: function (t, e) {
            var i = Math.sqrt(e * t), r = Math.floor(e / i);
            return {x: Math.floor(i), y: r}
        }, capValue: function (t, e, i) {
            return Math.max(t, Math.min(e, i))
        }
    }
}("undefined" != typeof exports ? exports : this), function () {
    function t(t, r, s, o, h, c, l) {
        var u = a.call(arguments);
        if (n[u])return n[u];
        var f = Math.PI, d = l * f / 180, g = Math.sin(d), p = Math.cos(d), v = 0, b = 0;
        s = Math.abs(s), o = Math.abs(o);
        var m = -p * t * .5 - g * r * .5, y = -p * r * .5 + g * t * .5, _ = s * s, x = o * o, C = y * y, S = m * m, w = _ * x - _ * C - x * S, O = 0;
        if (w < 0) {
            var T = Math.sqrt(1 - w / (_ * x));
            s *= T, o *= T
        } else O = (h === c ? -1 : 1) * Math.sqrt(w / (_ * C + x * S));
        var j = O * s * y / o, k = -O * o * m / s, M = p * j - g * k + .5 * t, D = g * j + p * k + .5 * r, A = i(1, 0, (m - j) / s, (y - k) / o), P = i((m - j) / s, (y - k) / o, (-m - j) / s, (-y - k) / o);
        0 === c && P > 0 ? P -= 2 * f : 1 === c && P < 0 && (P += 2 * f);
        for (var E = Math.ceil(Math.abs(P / f * 2)), I = [], L = P / E, F = 8 / 3 * Math.sin(L / 4) * Math.sin(L / 4) / Math.sin(L / 2), B = A + L, R = 0; R < E; R++)I[R] = e(A, B, p, g, s, o, M, D, F, v, b), v = I[R][4], b = I[R][5], A = B, B += L;
        return n[u] = I, I
    }

    function e(t, e, i, r, n, o, h, c, l, u, f) {
        var d = a.call(arguments);
        if (s[d])return s[d];
        var g = Math.cos(t), p = Math.sin(t), v = Math.cos(e), b = Math.sin(e), m = i * n * v - r * o * b + h, y = r * n * v + i * o * b + c, _ = u + l * (-i * n * p - r * o * g), x = f + l * (-r * n * p + i * o * g), C = m + l * (i * n * b + r * o * v), S = y + l * (r * n * b - i * o * v);
        return s[d] = [_, x, C, S, m, y], s[d]
    }

    function i(t, e, i, r) {
        var n = Math.atan2(e, t), s = Math.atan2(r, i);
        return s >= n ? s - n : 2 * Math.PI - (n - s)
    }

    function r(t, e, i, r, n, s, h, c) {
        var l = a.call(arguments);
        if (o[l])return o[l];
        var u, f, d, g, p, v, b, m, y = Math.sqrt, _ = Math.min, x = Math.max, C = Math.abs, S = [], w = [[], []];
        f = 6 * t - 12 * i + 6 * n, u = -3 * t + 9 * i - 9 * n + 3 * h, d = 3 * i - 3 * t;
        for (var O = 0; O < 2; ++O)if (O > 0 && (f = 6 * e - 12 * r + 6 * s, u = -3 * e + 9 * r - 9 * s + 3 * c, d = 3 * r - 3 * e), C(u) < 1e-12) {
            if (C(f) < 1e-12)continue;
            g = -d / f, 0 < g && g < 1 && S.push(g)
        } else b = f * f - 4 * d * u, b < 0 || (m = y(b), p = (-f + m) / (2 * u), 0 < p && p < 1 && S.push(p), v = (-f - m) / (2 * u), 0 < v && v < 1 && S.push(v));
        for (var T, j, k, M = S.length, D = M; M--;)g = S[M], k = 1 - g, T = k * k * k * t + 3 * k * k * g * i + 3 * k * g * g * n + g * g * g * h, w[0][M] = T, j = k * k * k * e + 3 * k * k * g * r + 3 * k * g * g * s + g * g * g * c, w[1][M] = j;
        w[0][D] = t, w[1][D] = e, w[0][D + 1] = h, w[1][D + 1] = c;
        var A = [{x: _.apply(null, w[0]), y: _.apply(null, w[1])}, {x: x.apply(null, w[0]), y: x.apply(null, w[1])}];
        return o[l] = A, A
    }

    var n = {}, s = {}, o = {}, a = Array.prototype.join;
    fabric.util.drawArc = function (e, i, r, n) {
        for (var s = n[0], o = n[1], a = n[2], h = n[3], c = n[4], l = n[5], u = n[6], f = [[], [], [], []], d = t(l - i, u - r, s, o, h, c, a), g = 0, p = d.length; g < p; g++)f[g][0] = d[g][0] + i, f[g][1] = d[g][1] + r, f[g][2] = d[g][2] + i, f[g][3] = d[g][3] + r, f[g][4] = d[g][4] + i, f[g][5] = d[g][5] + r, e.bezierCurveTo.apply(e, f[g])
    }, fabric.util.getBoundsOfArc = function (e, i, n, s, o, a, h, c, l) {
        for (var u, f = 0, d = 0, g = [], p = t(c - e, l - i, n, s, a, h, o), v = 0, b = p.length; v < b; v++)u = r(f, d, p[v][0], p[v][1], p[v][2], p[v][3], p[v][4], p[v][5]), g.push({
            x: u[0].x + e,
            y: u[0].y + i
        }), g.push({x: u[1].x + e, y: u[1].y + i}), f = p[v][4], d = p[v][5];
        return g
    }, fabric.util.getBoundsOfCurve = r
}(), function () {
    function t(t, e) {
        for (var i = s.call(arguments, 2), r = [], n = 0, o = t.length; n < o; n++)r[n] = i.length ? t[n][e].apply(t[n], i) : t[n][e].call(t[n]);
        return r
    }

    function e(t, e) {
        return n(t, e, function (t, e) {
            return t >= e
        })
    }

    function i(t, e) {
        return n(t, e, function (t, e) {
            return t < e
        })
    }

    function r(t, e) {
        for (var i = t.length; i--;)t[i] = e;
        return t
    }

    function n(t, e, i) {
        if (t && 0 !== t.length) {
            var r = t.length - 1, n = e ? t[r][e] : t[r];
            if (e)for (; r--;)i(t[r][e], n) && (n = t[r][e]); else for (; r--;)i(t[r], n) && (n = t[r]);
            return n
        }
    }

    var s = Array.prototype.slice;
    Array.prototype.indexOf || (Array.prototype.indexOf = function (t) {
        if (void 0 === this || null === this)throw new TypeError;
        var e = Object(this), i = e.length >>> 0;
        if (0 === i)return -1;
        var r = 0;
        if (arguments.length > 0 && (r = Number(arguments[1]), r !== r ? r = 0 : 0 !== r && r !== Number.POSITIVE_INFINITY && r !== Number.NEGATIVE_INFINITY && (r = (r > 0 || -1) * Math.floor(Math.abs(r)))), r >= i)return -1;
        for (var n = r >= 0 ? r : Math.max(i - Math.abs(r), 0); n < i; n++)if (n in e && e[n] === t)return n;
        return -1
    }), Array.prototype.forEach || (Array.prototype.forEach = function (t, e) {
        for (var i = 0, r = this.length >>> 0; i < r; i++)i in this && t.call(e, this[i], i, this)
    }), Array.prototype.map || (Array.prototype.map = function (t, e) {
        for (var i = [], r = 0, n = this.length >>> 0; r < n; r++)r in this && (i[r] = t.call(e, this[r], r, this));
        return i
    }), Array.prototype.every || (Array.prototype.every = function (t, e) {
        for (var i = 0, r = this.length >>> 0; i < r; i++)if (i in this && !t.call(e, this[i], i, this))return !1;
        return !0
    }), Array.prototype.some || (Array.prototype.some = function (t, e) {
        for (var i = 0, r = this.length >>> 0; i < r; i++)if (i in this && t.call(e, this[i], i, this))return !0;
        return !1
    }), Array.prototype.filter || (Array.prototype.filter = function (t, e) {
        for (var i, r = [], n = 0, s = this.length >>> 0; n < s; n++)n in this && (i = this[n], t.call(e, i, n, this) && r.push(i));
        return r
    }), Array.prototype.reduce || (Array.prototype.reduce = function (t) {
        var e, i = this.length >>> 0, r = 0;
        if (arguments.length > 1)e = arguments[1]; else for (; ;) {
            if (r in this) {
                e = this[r++];
                break
            }
            if (++r >= i)throw new TypeError
        }
        for (; r < i; r++)r in this && (e = t.call(null, e, this[r], r, this));
        return e
    }), fabric.util.array = {fill: r, invoke: t, min: i, max: e}
}(), function () {
    function t(e, i, r) {
        if (r)if (!fabric.isLikelyNode && i instanceof Element)e = i; else if (i instanceof Array) {
            e = [];
            for (var n = 0, s = i.length; n < s; n++)e[n] = t({}, i[n], r)
        } else if (i && "object" == typeof i)for (var o in i)i.hasOwnProperty(o) && (e[o] = t({}, i[o], r)); else e = i; else for (var o in i)e[o] = i[o];
        return e
    }

    function e(e, i) {
        return t({}, e, i)
    }

    fabric.util.object = {extend: t, clone: e}
}(), function () {
    function t(t) {
        return t.replace(/-+(.)?/g, function (t, e) {
            return e ? e.toUpperCase() : ""
        })
    }

    function e(t, e) {
        return t.charAt(0).toUpperCase() + (e ? t.slice(1) : t.slice(1).toLowerCase())
    }

    function i(t) {
        return t.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&apos;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
    }

    String.prototype.trim || (String.prototype.trim = function () {
        return this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, "")
    }), fabric.util.string = {camelize: t, capitalize: e, escapeXml: i}
}(), function () {
    var t = Array.prototype.slice, e = Function.prototype.apply, i = function () {
    };
    Function.prototype.bind || (Function.prototype.bind = function (r) {
        var n, s = this, o = t.call(arguments, 1);
        return n = o.length ? function () {
            return e.call(s, this instanceof i ? this : r, o.concat(t.call(arguments)))
        } : function () {
            return e.call(s, this instanceof i ? this : r, arguments)
        }, i.prototype = this.prototype, n.prototype = new i, n
    })
}(), function () {
    function t() {
    }

    function e(t) {
        for (var e = null, i = this; i.constructor.superclass;) {
            var n = i.constructor.superclass.prototype[t];
            if (i[t] !== n) {
                e = n;
                break
            }
            i = i.constructor.superclass.prototype
        }
        return e ? arguments.length > 1 ? e.apply(this, r.call(arguments, 1)) : e.call(this) : console.log("tried to callSuper " + t + ", method not found in prototype chain", this)
    }

    function i() {
        function i() {
            this.initialize.apply(this, arguments)
        }

        var s = null, a = r.call(arguments, 0);
        "function" == typeof a[0] && (s = a.shift()), i.superclass = s, i.subclasses = [], s && (t.prototype = s.prototype, i.prototype = new t, s.subclasses.push(i));
        for (var h = 0, c = a.length; h < c; h++)o(i, a[h], s);
        return i.prototype.initialize || (i.prototype.initialize = n), i.prototype.constructor = i, i.prototype.callSuper = e, i
    }

    var r = Array.prototype.slice, n = function () {
    }, s = function () {
        for (var t in{toString: 1})if ("toString" === t)return !1;
        return !0
    }(), o = function (t, e, i) {
        for (var r in e)r in t.prototype && "function" == typeof t.prototype[r] && (e[r] + "").indexOf("callSuper") > -1 ? t.prototype[r] = function (t) {
            return function () {
                var r = this.constructor.superclass;
                this.constructor.superclass = i;
                var n = e[t].apply(this, arguments);
                if (this.constructor.superclass = r, "initialize" !== t)return n
            }
        }(r) : t.prototype[r] = e[r], s && (e.toString !== Object.prototype.toString && (t.prototype.toString = e.toString), e.valueOf !== Object.prototype.valueOf && (t.prototype.valueOf = e.valueOf))
    };
    fabric.util.createClass = i
}(), function () {
    function t(t) {
        var e, i, r = Array.prototype.slice.call(arguments, 1), n = r.length;
        for (i = 0; i < n; i++)if (e = typeof t[r[i]], !/^(?:function|object|unknown)$/.test(e))return !1;
        return !0
    }

    function e(t, e) {
        return {handler: e, wrappedHandler: i(t, e)}
    }

    function i(t, e) {
        return function (i) {
            e.call(o(t), i || fabric.window.event)
        }
    }

    function r(t, e) {
        return function (i) {
            if (p[t] && p[t][e])for (var r = p[t][e], n = 0, s = r.length; n < s; n++)r[n].call(this, i || fabric.window.event)
        }
    }

    function n(t) {
        t || (t = fabric.window.event);
        var e = t.target || (typeof t.srcElement !== h ? t.srcElement : null), i = fabric.util.getScrollLeftTop(e);
        return {x: v(t) + i.left, y: b(t) + i.top}
    }

    function s(t, e, i) {
        var r = "touchend" === t.type ? "changedTouches" : "touches";
        return t[r] && t[r][0] ? t[r][0][e] - (t[r][0][e] - t[r][0][i]) || t[i] : t[i]
    }

    var o, a, h = "unknown", c = function () {
        var t = 0;
        return function (e) {
            return e.__uniqueID || (e.__uniqueID = "uniqueID__" + t++)
        }
    }();
    !function () {
        var t = {};
        o = function (e) {
            return t[e]
        }, a = function (e, i) {
            t[e] = i
        }
    }();
    var l, u, f = t(fabric.document.documentElement, "addEventListener", "removeEventListener") && t(fabric.window, "addEventListener", "removeEventListener"), d = t(fabric.document.documentElement, "attachEvent", "detachEvent") && t(fabric.window, "attachEvent", "detachEvent"), g = {}, p = {};
    f ? (l = function (t, e, i, r) {
        t && t.addEventListener(e, i, !d && r)
    }, u = function (t, e, i, r) {
        t && t.removeEventListener(e, i, !d && r)
    }) : d ? (l = function (t, i, r) {
        if (t) {
            var n = c(t);
            a(n, t), g[n] || (g[n] = {}), g[n][i] || (g[n][i] = []);
            var s = e(n, r);
            g[n][i].push(s), t.attachEvent("on" + i, s.wrappedHandler)
        }
    }, u = function (t, e, i) {
        if (t) {
            var r, n = c(t);
            if (g[n] && g[n][e])for (var s = 0, o = g[n][e].length; s < o; s++)r = g[n][e][s], r && r.handler === i && (t.detachEvent("on" + e, r.wrappedHandler), g[n][e][s] = null)
        }
    }) : (l = function (t, e, i) {
        if (t) {
            var n = c(t);
            if (p[n] || (p[n] = {}), !p[n][e]) {
                p[n][e] = [];
                var s = t["on" + e];
                s && p[n][e].push(s), t["on" + e] = r(n, e)
            }
            p[n][e].push(i)
        }
    }, u = function (t, e, i) {
        if (t) {
            var r = c(t);
            if (p[r] && p[r][e])for (var n = p[r][e], s = 0, o = n.length; s < o; s++)n[s] === i && n.splice(s, 1)
        }
    }), fabric.util.addListener = l, fabric.util.removeListener = u;
    var v = function (t) {
        return typeof t.clientX !== h ? t.clientX : 0
    }, b = function (t) {
        return typeof t.clientY !== h ? t.clientY : 0
    };
    fabric.isTouchSupported && (v = function (t) {
        return s(t, "pageX", "clientX")
    }, b = function (t) {
        return s(t, "pageY", "clientY")
    }), fabric.util.getPointer = n, fabric.util.object.extend(fabric.util, fabric.Observable)
}(), function () {
    function t(t, e) {
        var i = t.style;
        if (!i)return t;
        if ("string" == typeof e)return t.style.cssText += ";" + e, e.indexOf("opacity") > -1 ? s(t, e.match(/opacity:\s*(\d?\.?\d*)/)[1]) : t;
        for (var r in e)if ("opacity" === r)s(t, e[r]); else {
            var n = "float" === r || "cssFloat" === r ? "undefined" == typeof i.styleFloat ? "cssFloat" : "styleFloat" : r;
            i[n] = e[r]
        }
        return t
    }

    var e = fabric.document.createElement("div"), i = "string" == typeof e.style.opacity, r = "string" == typeof e.style.filter, n = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, s = function (t) {
        return t
    };
    i ? s = function (t, e) {
        return t.style.opacity = e, t
    } : r && (s = function (t, e) {
        var i = t.style;
        return t.currentStyle && !t.currentStyle.hasLayout && (i.zoom = 1), n.test(i.filter) ? (e = e >= .9999 ? "" : "alpha(opacity=" + 100 * e + ")", i.filter = i.filter.replace(n, e)) : i.filter += " alpha(opacity=" + 100 * e + ")", t
    }), fabric.util.setStyle = t
}(), function () {
    function t(t) {
        return "string" == typeof t ? fabric.document.getElementById(t) : t
    }

    function e(t, e) {
        var i = fabric.document.createElement(t);
        for (var r in e)"class" === r ? i.className = e[r] : "for" === r ? i.htmlFor = e[r] : i.setAttribute(r, e[r]);
        return i
    }

    function i(t, e) {
        t && (" " + t.className + " ").indexOf(" " + e + " ") === -1 && (t.className += (t.className ? " " : "") + e)
    }

    function r(t, i, r) {
        return "string" == typeof i && (i = e(i, r)), t.parentNode && t.parentNode.replaceChild(i, t), i.appendChild(t), i
    }

    function n(t) {
        for (var e = 0, i = 0, r = fabric.document.documentElement, n = fabric.document.body || {
                scrollLeft: 0,
                scrollTop: 0
            }; t && (t.parentNode || t.host) && (t = t.parentNode || t.host, t === fabric.document ? (e = n.scrollLeft || r.scrollLeft || 0, i = n.scrollTop || r.scrollTop || 0) : (e += t.scrollLeft || 0, i += t.scrollTop || 0), 1 !== t.nodeType || "fixed" !== fabric.util.getElementStyle(t, "position")););
        return {left: e, top: i}
    }

    function s(t) {
        var e, i, r = t && t.ownerDocument, s = {left: 0, top: 0}, o = {left: 0, top: 0}, a = {
            borderLeftWidth: "left",
            borderTopWidth: "top",
            paddingLeft: "left",
            paddingTop: "top"
        };
        if (!r)return o;
        for (var h in a)o[a[h]] += parseInt(c(t, h), 10) || 0;
        return e = r.documentElement, "undefined" != typeof t.getBoundingClientRect && (s = t.getBoundingClientRect()), i = n(t), {
            left: s.left + i.left - (e.clientLeft || 0) + o.left,
            top: s.top + i.top - (e.clientTop || 0) + o.top
        }
    }

    var o, a = Array.prototype.slice, h = function (t) {
        return a.call(t, 0)
    };
    try {
        o = h(fabric.document.childNodes)instanceof Array
    } catch (t) {
    }
    o || (h = function (t) {
        for (var e = new Array(t.length), i = t.length; i--;)e[i] = t[i];
        return e
    });
    var c;
    c = fabric.document.defaultView && fabric.document.defaultView.getComputedStyle ? function (t, e) {
        var i = fabric.document.defaultView.getComputedStyle(t, null);
        return i ? i[e] : void 0
    } : function (t, e) {
        var i = t.style[e];
        return !i && t.currentStyle && (i = t.currentStyle[e]), i
    }, function () {
        function t(t) {
            return "undefined" != typeof t.onselectstart && (t.onselectstart = fabric.util.falseFunction), r ? t.style[r] = "none" : "string" == typeof t.unselectable && (t.unselectable = "on"), t
        }

        function e(t) {
            return "undefined" != typeof t.onselectstart && (t.onselectstart = null), r ? t.style[r] = "" : "string" == typeof t.unselectable && (t.unselectable = ""), t
        }

        var i = fabric.document.documentElement.style, r = "userSelect"in i ? "userSelect" : "MozUserSelect"in i ? "MozUserSelect" : "WebkitUserSelect"in i ? "WebkitUserSelect" : "KhtmlUserSelect"in i ? "KhtmlUserSelect" : "";
        fabric.util.makeElementUnselectable = t, fabric.util.makeElementSelectable = e
    }(), function () {
        function t(t, e) {
            var i = fabric.document.getElementsByTagName("head")[0], r = fabric.document.createElement("script"), n = !0;
            r.onload = r.onreadystatechange = function (t) {
                if (n) {
                    if ("string" == typeof this.readyState && "loaded" !== this.readyState && "complete" !== this.readyState)return;
                    n = !1, e(t || fabric.window.event), r = r.onload = r.onreadystatechange = null
                }
            }, r.src = t, i.appendChild(r)
        }

        fabric.util.getScript = t
    }(), fabric.util.getById = t, fabric.util.toArray = h, fabric.util.makeElement = e, fabric.util.addClass = i, fabric.util.wrapElement = r, fabric.util.getScrollLeftTop = n, fabric.util.getElementOffset = s, fabric.util.getElementStyle = c
}(), function () {
    function t(t, e) {
        return t + (/\?/.test(t) ? "&" : "?") + e
    }

    function e() {
    }

    function i(i, n) {
        n || (n = {});
        var s = n.method ? n.method.toUpperCase() : "GET", o = n.onComplete || function () {
            }, a = r(), h = n.body || n.parameters;
        return a.onreadystatechange = function () {
            4 === a.readyState && (o(a), a.onreadystatechange = e)
        }, "GET" === s && (h = null, "string" == typeof n.parameters && (i = t(i, n.parameters))), a.open(s, i, !0), "POST" !== s && "PUT" !== s || a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"), a.send(h), a
    }

    var r = function () {
        for (var t = [function () {
            return new ActiveXObject("Microsoft.XMLHTTP")
        }, function () {
            return new ActiveXObject("Msxml2.XMLHTTP")
        }, function () {
            return new ActiveXObject("Msxml2.XMLHTTP.3.0")
        }, function () {
            return new XMLHttpRequest
        }], e = t.length; e--;)try {
            var i = t[e]();
            if (i)return t[e]
        } catch (t) {
        }
    }();
    fabric.util.request = i
}(), fabric.log = function () {
}, fabric.warn = function () {
}, "undefined" != typeof console && ["log", "warn"].forEach(function (t) {
    "undefined" != typeof console[t] && "function" == typeof console[t].apply && (fabric[t] = function () {
        return console[t].apply(console, arguments)
    })
}), function () {
    function t() {
        return !1
    }

    function e(e) {
        i(function (r) {
            e || (e = {});
            var n, s = r || +new Date, o = e.duration || 500, a = s + o, h = e.onChange || t, c = e.abort || t, l = e.onComplete || t, u = e.easing || function (t, e, i, r) {
                    return -i * Math.cos(t / r * (Math.PI / 2)) + i + e
                }, f = "startValue"in e ? e.startValue : 0, d = "endValue"in e ? e.endValue : 100, g = e.byValue || d - f;
            e.onStart && e.onStart(), function t(r) {
                if (c())return void l(d, 1, 1);
                n = r || +new Date;
                var p = n > a ? o : n - s, v = p / o, b = u(p, f, g, o), m = Math.abs((b - f) / g);
                return h(b, m, v), n > a ? void(e.onComplete && e.onComplete()) : void i(t)
            }(s)
        })
    }

    function i() {
        return r.apply(fabric.window, arguments)
    }

    var r = fabric.window.requestAnimationFrame || fabric.window.webkitRequestAnimationFrame || fabric.window.mozRequestAnimationFrame || fabric.window.oRequestAnimationFrame || fabric.window.msRequestAnimationFrame || function (t) {
            fabric.window.setTimeout(t, 1e3 / 60)
        };
    fabric.util.animate = e, fabric.util.requestAnimFrame = i
}(), function () {
    function t(t, e, i) {
        var r = "rgba(" + parseInt(t[0] + i * (e[0] - t[0]), 10) + "," + parseInt(t[1] + i * (e[1] - t[1]), 10) + "," + parseInt(t[2] + i * (e[2] - t[2]), 10);
        return r += "," + (t && e ? parseFloat(t[3] + i * (e[3] - t[3])) : 1), r += ")"
    }

    function e(e, i, r, n) {
        var s = new fabric.Color(e).getSource(), o = new fabric.Color(i).getSource();
        n = n || {}, fabric.util.animate(fabric.util.object.extend(n, {
            duration: r || 500,
            startValue: s,
            endValue: o,
            byValue: o,
            easing: function (e, i, r, s) {
                var o = n.colorEasing ? n.colorEasing(e, s) : 1 - Math.cos(e / s * (Math.PI / 2));
                return t(i, r, o)
            }
        }))
    }

    fabric.util.animateColor = e
}(), function () {
    function t(t, e, i, r) {
        return t < Math.abs(e) ? (t = e, r = i / 4) : r = 0 === e && 0 === t ? i / (2 * Math.PI) * Math.asin(1) : i / (2 * Math.PI) * Math.asin(e / t), {
            a: t,
            c: e,
            p: i,
            s: r
        }
    }

    function e(t, e, i) {
        return t.a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * i - t.s) * (2 * Math.PI) / t.p)
    }

    function i(t, e, i, r) {
        return i * ((t = t / r - 1) * t * t + 1) + e
    }

    function r(t, e, i, r) {
        return t /= r / 2, t < 1 ? i / 2 * t * t * t + e : i / 2 * ((t -= 2) * t * t + 2) + e
    }

    function n(t, e, i, r) {
        return i * (t /= r) * t * t * t + e
    }

    function s(t, e, i, r) {
        return -i * ((t = t / r - 1) * t * t * t - 1) + e
    }

    function o(t, e, i, r) {
        return t /= r / 2, t < 1 ? i / 2 * t * t * t * t + e : -i / 2 * ((t -= 2) * t * t * t - 2) + e
    }

    function a(t, e, i, r) {
        return i * (t /= r) * t * t * t * t + e
    }

    function h(t, e, i, r) {
        return i * ((t = t / r - 1) * t * t * t * t + 1) + e
    }

    function c(t, e, i, r) {
        return t /= r / 2, t < 1 ? i / 2 * t * t * t * t * t + e : i / 2 * ((t -= 2) * t * t * t * t + 2) + e
    }

    function l(t, e, i, r) {
        return -i * Math.cos(t / r * (Math.PI / 2)) + i + e
    }

    function u(t, e, i, r) {
        return i * Math.sin(t / r * (Math.PI / 2)) + e
    }

    function f(t, e, i, r) {
        return -i / 2 * (Math.cos(Math.PI * t / r) - 1) + e
    }

    function d(t, e, i, r) {
        return 0 === t ? e : i * Math.pow(2, 10 * (t / r - 1)) + e
    }

    function g(t, e, i, r) {
        return t === r ? e + i : i * (-Math.pow(2, -10 * t / r) + 1) + e
    }

    function p(t, e, i, r) {
        return 0 === t ? e : t === r ? e + i : (t /= r / 2, t < 1 ? i / 2 * Math.pow(2, 10 * (t - 1)) + e : i / 2 * (-Math.pow(2, -10 * --t) + 2) + e)
    }

    function v(t, e, i, r) {
        return -i * (Math.sqrt(1 - (t /= r) * t) - 1) + e
    }

    function b(t, e, i, r) {
        return i * Math.sqrt(1 - (t = t / r - 1) * t) + e
    }

    function m(t, e, i, r) {
        return t /= r / 2, t < 1 ? -i / 2 * (Math.sqrt(1 - t * t) - 1) + e : i / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + e
    }

    function y(i, r, n, s) {
        var o = 1.70158, a = 0, h = n;
        if (0 === i)return r;
        if (i /= s, 1 === i)return r + n;
        a || (a = .3 * s);
        var c = t(h, n, a, o);
        return -e(c, i, s) + r
    }

    function _(e, i, r, n) {
        var s = 1.70158, o = 0, a = r;
        if (0 === e)return i;
        if (e /= n, 1 === e)return i + r;
        o || (o = .3 * n);
        var h = t(a, r, o, s);
        return h.a * Math.pow(2, -10 * e) * Math.sin((e * n - h.s) * (2 * Math.PI) / h.p) + h.c + i
    }

    function x(i, r, n, s) {
        var o = 1.70158, a = 0, h = n;
        if (0 === i)return r;
        if (i /= s / 2, 2 === i)return r + n;
        a || (a = s * (.3 * 1.5));
        var c = t(h, n, a, o);
        return i < 1 ? -.5 * e(c, i, s) + r : c.a * Math.pow(2, -10 * (i -= 1)) * Math.sin((i * s - c.s) * (2 * Math.PI) / c.p) * .5 + c.c + r
    }

    function C(t, e, i, r, n) {
        return void 0 === n && (n = 1.70158), i * (t /= r) * t * ((n + 1) * t - n) + e
    }

    function S(t, e, i, r, n) {
        return void 0 === n && (n = 1.70158), i * ((t = t / r - 1) * t * ((n + 1) * t + n) + 1) + e
    }

    function w(t, e, i, r, n) {
        return void 0 === n && (n = 1.70158), t /= r / 2, t < 1 ? i / 2 * (t * t * (((n *= 1.525) + 1) * t - n)) + e : i / 2 * ((t -= 2) * t * (((n *= 1.525) + 1) * t + n) + 2) + e
    }

    function O(t, e, i, r) {
        return i - T(r - t, 0, i, r) + e
    }

    function T(t, e, i, r) {
        return (t /= r) < 1 / 2.75 ? i * (7.5625 * t * t) + e : t < 2 / 2.75 ? i * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + e : t < 2.5 / 2.75 ? i * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + e : i * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + e
    }

    function j(t, e, i, r) {
        return t < r / 2 ? .5 * O(2 * t, 0, i, r) + e : .5 * T(2 * t - r, 0, i, r) + .5 * i + e
    }

    fabric.util.ease = {
        easeInQuad: function (t, e, i, r) {
            return i * (t /= r) * t + e
        },
        easeOutQuad: function (t, e, i, r) {
            return -i * (t /= r) * (t - 2) + e
        },
        easeInOutQuad: function (t, e, i, r) {
            return t /= r / 2, t < 1 ? i / 2 * t * t + e : -i / 2 * (--t * (t - 2) - 1) + e
        },
        easeInCubic: function (t, e, i, r) {
            return i * (t /= r) * t * t + e
        },
        easeOutCubic: i,
        easeInOutCubic: r,
        easeInQuart: n,
        easeOutQuart: s,
        easeInOutQuart: o,
        easeInQuint: a,
        easeOutQuint: h,
        easeInOutQuint: c,
        easeInSine: l,
        easeOutSine: u,
        easeInOutSine: f,
        easeInExpo: d,
        easeOutExpo: g,
        easeInOutExpo: p,
        easeInCirc: v,
        easeOutCirc: b,
        easeInOutCirc: m,
        easeInElastic: y,
        easeOutElastic: _,
        easeInOutElastic: x,
        easeInBack: C,
        easeOutBack: S,
        easeInOutBack: w,
        easeInBounce: O,
        easeOutBounce: T,
        easeInOutBounce: j
    }
}(), function (t) {
    "use strict";
    function e(t) {
        return t in O ? O[t] : t
    }

    function i(t, e, i, r) {
        var n, s = "[object Array]" === Object.prototype.toString.call(e);
        return "fill" !== t && "stroke" !== t || "none" !== e ? "strokeDashArray" === t ? e = "none" === e ? null : e.replace(/,/g, " ").split(/\s+/).map(function (t) {
            return parseFloat(t)
        }) : "transformMatrix" === t ? e = i && i.transformMatrix ? _(i.transformMatrix, p.parseTransformAttribute(e)) : p.parseTransformAttribute(e) : "visible" === t ? (e = "none" !== e && "hidden" !== e, i && i.visible === !1 && (e = !1)) : "opacity" === t ? (e = parseFloat(e), i && "undefined" != typeof i.opacity && (e *= i.opacity)) : "originX" === t ? e = "start" === e ? "left" : "end" === e ? "right" : "center" : n = s ? e.map(y) : y(e, r) : e = "", !s && isNaN(n) ? e : n
    }

    function r(t) {
        for (var e in T)if ("undefined" != typeof t[T[e]] && "" !== t[e]) {
            if ("undefined" == typeof t[e]) {
                if (!p.Object.prototype[e])continue;
                t[e] = p.Object.prototype[e]
            }
            if (0 !== t[e].indexOf("url(")) {
                var i = new p.Color(t[e]);
                t[e] = i.setAlpha(m(i.getAlpha() * t[T[e]], 2)).toRgba()
            }
        }
        return t
    }

    function n(t, e) {
        for (var i, r, n = [], s = 0; s < e.length; s++)i = e[s], r = t.getElementsByTagName(i), n = n.concat(Array.prototype.slice.call(r));
        return n
    }

    function s(t, e) {
        var i, r;
        t.replace(/;\s*$/, "").split(";").forEach(function (t) {
            var n = t.split(":");
            i = n[0].trim().toLowerCase(), r = n[1].trim(), e[i] = r
        })
    }

    function o(t, e) {
        var i, r;
        for (var n in t)"undefined" != typeof t[n] && (i = n.toLowerCase(), r = t[n], e[i] = r)
    }

    function a(t, e) {
        var i = {};
        for (var r in p.cssRules[e])if (h(t, r.split(" ")))for (var n in p.cssRules[e][r])i[n] = p.cssRules[e][r][n];
        return i
    }

    function h(t, e) {
        var i, r = !0;
        return i = l(t, e.pop()), i && e.length && (r = c(t, e)), i && r && 0 === e.length
    }

    function c(t, e) {
        for (var i, r = !0; t.parentNode && 1 === t.parentNode.nodeType && e.length;)r && (i = e.pop()), t = t.parentNode, r = l(t, i);
        return 0 === e.length
    }

    function l(t, e) {
        var i, r = t.nodeName, n = t.getAttribute("class"), s = t.getAttribute("id");
        if (i = new RegExp("^" + r, "i"), e = e.replace(i, ""), s && e.length && (i = new RegExp("#" + s + "(?![a-zA-Z\\-]+)", "i"), e = e.replace(i, "")), n && e.length) {
            n = n.split(" ");
            for (var o = n.length; o--;)i = new RegExp("\\." + n[o] + "(?![a-zA-Z\\-]+)", "i"), e = e.replace(i, "")
        }
        return 0 === e.length
    }

    function u(t, e) {
        var i;
        if (t.getElementById && (i = t.getElementById(e)), i)return i;
        var r, n, s = t.getElementsByTagName("*");
        for (n = 0; n < s.length; n++)if (r = s[n], e === r.getAttribute("id"))return r
    }

    function f(t) {
        for (var e = n(t, ["use", "svg:use"]), i = 0; e.length && i < e.length;) {
            var r, s, o, a, h, c = e[i], l = c.getAttribute("xlink:href").substr(1), f = c.getAttribute("x") || 0, g = c.getAttribute("y") || 0, p = u(t, l).cloneNode(!0), v = (p.getAttribute("transform") || "") + " translate(" + f + ", " + g + ")", b = e.length;
            if (d(p), /^svg$/i.test(p.nodeName)) {
                var m = p.ownerDocument.createElement("g");
                for (o = 0, a = p.attributes, h = a.length; o < h; o++)s = a.item(o), m.setAttribute(s.nodeName, s.nodeValue);
                for (; p.firstChild;)m.appendChild(p.firstChild);
                p = m
            }
            for (o = 0, a = c.attributes, h = a.length; o < h; o++)s = a.item(o), "x" !== s.nodeName && "y" !== s.nodeName && "xlink:href" !== s.nodeName && ("transform" === s.nodeName ? v = s.nodeValue + " " + v : p.setAttribute(s.nodeName, s.nodeValue));
            p.setAttribute("transform", v), p.setAttribute("instantiated_by_use", "1"), p.removeAttribute("id"), r = c.parentNode, r.replaceChild(p, c), e.length === b && i++
        }
    }

    function d(t) {
        var e, i, r, n, s = t.getAttribute("viewBox"), o = 1, a = 1, h = 0, c = 0, l = t.getAttribute("width"), u = t.getAttribute("height"), f = t.getAttribute("x") || 0, d = t.getAttribute("y") || 0, g = t.getAttribute("preserveAspectRatio") || "", v = !s || !C.test(t.nodeName) || !(s = s.match(j)), b = !l || !u || "100%" === l || "100%" === u, m = v && b, _ = {}, x = "";
        if (_.width = 0, _.height = 0, _.toBeParsed = m, m)return _;
        if (v)return _.width = y(l), _.height = y(u), _;
        if (h = -parseFloat(s[1]), c = -parseFloat(s[2]),
                e = parseFloat(s[3]), i = parseFloat(s[4]), b ? (_.width = e, _.height = i) : (_.width = y(l), _.height = y(u), o = _.width / e, a = _.height / i), g = p.util.parsePreserveAspectRatioAttribute(g), "none" !== g.alignX && (a = o = o > a ? a : o), 1 === o && 1 === a && 0 === h && 0 === c && 0 === f && 0 === d)return _;
        if ((f || d) && (x = " translate(" + y(f) + " " + y(d) + ") "), r = x + " matrix(" + o + " 0 0 " + a + " " + h * o + " " + c * a + ") ", "svg" === t.nodeName) {
            for (n = t.ownerDocument.createElement("g"); t.firstChild;)n.appendChild(t.firstChild);
            t.appendChild(n)
        } else n = t, r = n.getAttribute("transform") + r;
        return n.setAttribute("transform", r), _